2012-09-29

rarファイルのアセンブラーとリンカー

rarという不自由な圧縮とアーカイブのフォーマットがある。RAR1とRAR2に関しては、自由な実装による復号化だけはできるが、最新のRAR3に関しては、自由な実装の復号化も不可能である。したがってrarは使ってはならない邪悪なフォーマットである。

ところで、このrarフォーマットは興味深いことに独自のプログラムを搭載していて、VMで実行されるらしい。これは、圧縮するデータごとに独自の変換を施して、復号化時に逆変換をかけるような用途に使われているそうだ。

そのVMを解析した結果のアセンブラーとリンカーがGithubで公開されているrar VMのアセンブリは、x86に似ているらしい。

taviso/rarvmtools · GitHub

また、その作者により、このVMを利用して、圧縮時とは違う、hello worldと復号化させるプログラムを搭載したrarファイルも作成されている。

Tavis Ormandy: Fun with Constrained Programming

ただし、rarは圧縮とアーカイブのフォーマットであるので、プログラムのコンパイル時に計算された、プログラムの出力のCRCが、実際のプログラムを実行した結果の出力と合わないと、エラーになる。ただ、CRCというのは意図的にハッシュ値の衝突を起こすことが可能な弱いハッシュアルゴリズムであるので、プログラムの実行時に他のビット列を調整することでCRCを一致させることができる。

rarフォーマットの復号化にはVM上でプログラムを実行させるというと、気になるのはセキュリティだ。ただ、現在のところ、実装に含まれているかもしれないバグを除けば、セキュリティ上の問題はないらしい。

というのも、このVM上のプログラムの入力として与えられるのは、プログラムが含まれるrar内のデータだけであるし、出力はrar内のファイルを復号化した結果となる。また、ひとつのプログラムは2億5千万個の命令を実行した場合、無条件で強制終了される。そのため、無限ループを起こして一生終わらない復号化処理ということもできない。ただし、一つのrarファイルに含まれるプログラムの数は制限されていないので、単にプログラムを分ければ、ある程度の長い実行は可能だ。

No comments: