gzipの脆弱性

既にご存知の方も多いと思いますが、gzipに複数の脆弱性が見つかっています。
http://oku.edu.mie-u.ac.jp/~okumura/blog/node/1047
修正パッチを確認したところ、自分のハフマンデコード処理にも同様の問題があったので修正しました。
huffman.hppの差分
テストコード
LZHUFでは、長さ制限付きのCanonical Huffman Codeを使っているのですが、デコード時に、

  • 長さ制限を守っていること
  • コード長に対応する正しいコードを割り振ることが可能であること(コード長=1が3つとかは無理なので)

を想定しているコードになっていました。
LHAやgzipのコードをパクっていたわけでもないのですが、人間考えることは同じようです。(実は、コーディング中に問題に気が付いていたのですが、後でやろうと思って忘れていました、、、)
RFC1951のdeflateアルゴリズムの解説にも同じ手法が載っていたりして、影響範囲は大きそうです。


修正はとりあえずのもので、ハフマン符号の最大ビット長が31ビット以下の場合しか動きません。(size_tが32ビットの場合)
ジェネリックプログラミングだと、計算でオーバーフローしない型を必ずしも用意できないので、問題が複雑になっています。
にしても、自分的にはタイムリーな脆弱性ですねぇ。