truecolorなPNGへの変換でPLTE内の攻撃コードは削除できた

追記 ImageMagic の convertコマンドでPNG→GIF→PNGと変換しても、JavaScriptは削除されませんでした。

http://www.tokumaru.org/d/20070717.html#p01

PNG→GIF→PNG じゃなくて PNGPNG(truecolor)→PNG の変換をしたら削除できました。この話、きちんと追ってないので既出かもしれませんが。

あと、これで完全に攻撃コードを削除できるようになるわけではないので本質的な結論が変わるわけではないです。

$ convert 20070717_0.png -type truecolor truecolor.png
$ convert truecolor.png -type palette truecolor2palette.png
$ hexdump -C truecolor.png | head -5
00000000  89 50 4e 47 0d 0a 1a 0a  00 00 00 0d 49 48 44 52  |.PNG........IHDR|
00000010  00 00 00 78 00 00 00 c0  08 02 00 00 00 40 9f 30  |...x.........@.0|
00000020  9d 00 00 00 09 70 48 59  73 00 00 00 48 00 00 00  |.....pHYs...H...|
00000030  48 00 46 c9 6b 3e 00 00  2c 0a 49 44 41 54 78 da  |H.F.k>..,.IDATx.|
00000040  bd 7d 7f 6c 54 57 96 e6  71 bd b2 63 af 19 c2 2c  |.}.lTW..q..c...,|

$ hexdump -C truecolor2palette.png | head -8
00000000  89 50 4e 47 0d 0a 1a 0a  00 00 00 0d 49 48 44 52  |.PNG........IHDR|
00000010  00 00 00 78 00 00 00 c0  04 03 00 00 00 3d d3 ba  |...x.........=..|
00000020  f9 00 00 00 27 50 4c 54  45 29 0d 3b 19 5c 67 7f  |....'PLTE).;.\g.|
00000030  23 60 34 93 72 78 b1 a0  a9 60 6b e1 a1 54 ca bf  |#`4.rx...`k..T..|
00000040  ca f5 f7 c9 f1 f6 e4 f5  f5 f4 fa f9 f7 fd fe fd  |................|
00000050  f3 e0 75 66 00 00 00 09  70 48 59 73 00 00 00 48  |..uf....pHYs...H|
00000060  00 00 00 48 00 46 c9 6b  3e 00 00 13 b1 49 44 41  |...H.F.k>....IDA|
00000070  54 68 de 75 5a cb 6f 1b  49 7a 6f 2b 56 74 15 47  |Th.uZ.o.Izo+Vt.G|

一度truecolorに変換するとPLTE自体が無くなってしまいます。元に戻すときに画像本体からパレット情報は再生成されるので、画像の見た目には影響ないと思います。truecolor.pngはカラータイプ2(RGB)のPNGになっていますが、元画像が透過PNGの場合はカラータイプ6(RGB+アルファ)に変換されて透過情報が維持される事も確認しました。元がGIFの場合も GIF→PNG(truecolor)→GIF でGlobal Color Tableに埋め込まれた攻撃コードは削除できました。


# パレット情報の再生成時に攻撃コードが復元されるように、画像をうまく作り込むことができるかもしれない。