【ITニュース解説】Google CTF 2025 – webz : Exploiting zlib's Huffman Code Table
2025年09月30日に「Hacker News」が公開したITニュース「Google CTF 2025 – webz : Exploiting zlib's Huffman Code Table」について初心者にもわかりやすく解説しています。
ITニュース概要
Google CTF 2025の「webz」問題は、データ圧縮ライブラリ「zlib」の「ハフマン符号表」に潜む脆弱性を悪用し、不正な操作を可能にする手法を解説している。身近なライブラリにも存在するセキュリティ上の盲点を示す事例だ。
ITニュース解説
Google CTF 2025で開催された「webz」というチャレンジは、データ圧縮技術に潜む巧妙な脆弱性をテーマにしたセキュリティ問題であった。CTF(Capture The Flag)とは、コンピュータセキュリティの知識と技術を競い合うコンテストの一種であり、参加者は与えられたシステムやプログラムの弱点、つまり脆弱性を見つけ出し、隠された「フラグ」と呼ばれる秘密の情報を手に入れることを目指す。このwebzチャレンジは、非常に多くのソフトウェアで利用されているデータ圧縮ライブラリ「zlib」の深い内部構造に注目し、その仕組みを悪用するアプローチが求められた。
zlibは、データを効率的に圧縮したり、一度圧縮されたデータを元の状態に戻したりするためのソフトウェア部品である。我々が普段意識することはないが、ウェブサイトからファイルをダウンロードする際、ネットワークを通じてデータを送受信する際、あるいはオペレーティングシステム内部でデータを処理する際など、非常に多様な場面でデータの容量を減らし、通信やストレージの負担を軽減するためにzlibのようなライブラリが裏方として幅広く活用されている。
zlibがデータを圧縮する際に用いる主要な技術の一つに、「ハフマン符号化」というものがある。これは、データの中で比較的よく現れる文字やバイト列には短い符号を、あまり現れないものには長い符号を割り当てることで、全体のデータ量を効率的に削減する仕組みである。この「どのデータにどの長さの符号を割り当てるか」というルールを具体的に定義したものが「ハフマンコードテーブル」と呼ばれる。通常、zlibは圧縮対象のデータ内容を分析し、最も効率の良い圧縮が行われるようにこのハフマンコードテーブルを自動的に生成して使用する。
しかし、今回のwebzチャレンジで問題となったのは、攻撃者がこのハフマンコードテーブルを独自に作成し、zlibの圧縮処理に「注入」できてしまうという特殊な状況が作り出されていた点であった。攻撃者は、例えば特定のバイト値(ここでは0x00という数値)に対して、通常では考えられないほど短い、たった1ビットの符号を割り当てたカスタムハフマンコードテーブルを作成した。
このカスタムテーブルをzlibの圧縮処理に適用した後、攻撃者は大量の同じ特定のバイト値(0x00)を含むデータをサービスに送信し、その圧縮を要求した。zlibは注入されたカスタムテーブルに従い、その短い1ビット符号を使って大量の0x00バイトを圧縮しようとする。ここで、zlib内部でデータをさらに効率的に圧縮するための「距離符号」という仕組みが深く関わってくる。距離符号は、データ中に同じパターンが以前にも出現した場合、「〇バイト前のデータから〇バイト分コピーする」という形で表現することで、データ量を削減する技術である。
この距離符号の処理において、カスタムハフマンコードテーブルと、大量の同一バイトデータという組み合わせが悪影響を及ぼした。具体的には、zlibが内部で距離を計算する際、極端に短い符号が何度も使われることで、計算の途中でプログラムが扱える数値の最大値を超えてしまう「整数オーバーフロー」という現象が発生した。整数オーバーフローが起きると、計算結果は本来意図する大きな値ではなく、予期しない小さな値へと巻き戻ってしまう。
この結果、zlibはデータを書き込むべきメモリ上の位置を誤って計算し、本来アクセスすべきではないメモリ領域を指し示してしまった。そして、圧縮処理の一環として、その誤ったメモリ位置に対してデータを「書き込む」動作が発生した。これは「アウトオブバウンズライト」と呼ばれる非常に危険な脆弱性である。アウトオブバウンズライトは、プログラムが確保したメモリ領域の「範囲外」にデータを書き込んでしまうことを意味する。その結果、隣接する他のデータや、プログラムの動作を制御する重要な情報(例えば、次に実行すべき命令のアドレスなど)が意図せず書き換えられてしまう可能性がある。
もしこのアウトオブバウンズライトによって、プログラムの実行を制御する重要な情報が書き換えられてしまったら、攻撃者はプログラムの意図しない動作を引き起こすことができる。今回のCTFでは、この脆弱性を悪用し、プログラムが本来読み込むべきではないファイル(例えば、システムの秘密情報が書かれた「/flag」というファイル)を読み込ませるように、内部のファイルパス情報を書き換えることに成功した。これにより、攻撃者はシステムの重要な情報にアクセスし、最終的にフラグを奪取することができたのである。
このwebzチャレンジの事例は、データ圧縮という日常的に使われる技術の深い内部構造に、いかに巧妙な脆弱性が潜んでいるかを示している。プログラムの基盤となるライブラリの設計や実装における細部への注意、そしてそれらがどのような状況で使われるかというセキュリティ上の考慮がいかに重要であるかを改めて浮き彫りにした。このような脆弱性は、開発者が知らずに悪用される可能性があり、システムのセキュリティを確保するためには、深い技術的理解と継続的な注意が必要となる。