はじめに
セキュリティ研究者により、広く利用されているデータ圧縮ライブラリzlibのuntgzユーティリティに深刻なバッファオーバーフローの脆弱性(バージョン1.3.1.2)が発見されました。この脆弱性を悪用することで、攻撃者は巧妙に作成されたコマンドライン引数を通じてメモリ破損を引き起こし、最終的には標的システムを制御する可能性があります。
脆弱性の詳細
この脆弱性は、untgzユーティリティ内のTGZfname()関数に存在します。ここで、ユーザーが提供するアーカイブ名が、境界チェックなしにstrcpy()関数によって1024バイトの固定サイズグローバルバッファに直接コピーされます。攻撃者がこのバッファサイズを超えるアーカイブ名を提供すると、ユーティリティはバッファ境界を超えてデータを書き込み、グローバルバッファオーバーフローが発生します。
この脆弱性が特に懸念されるのは、その悪用が非常に容易である点です。アーカイブの解析や検証が行われる前に脆弱なコードが実行されるため、攻撃者は複雑な操作を必要とせず、長いファイル名をコマンドライン引数として提供するだけでオーバーフローをトリガーできます。
技術的背景と実証
根本原因は、いくつかのコーディング上の弱点にあります。アーカイブ名がargv[]から直接取得され、サニタイズされていないこと、コピー前に長さの検証がないこと、そしてバッファがスタックではなくグローバル静的配列として割り当てられていることです。オーバーフローは関数エントリ直後に発生します。
セキュリティ研究機関SECは、AddressSanitizer(ASAN)を使用してこの脆弱性を実証しました。4096バイトの入力文字列をuntgzユーティリティに処理させたところ、グローバルバッファオーバーフローが検出されました。ASANの出力は、脆弱なメモリアドレスへの2001バイトの書き込みを確認し、スタックトレースはuntgz.cの136行目にあるstrcpy()呼び出しを指していました。
潜在的影響と対策
この脆弱性の潜在的な影響は広範囲にわたります。サービス拒否(DoS)によるクラッシュから、隣接するグローバルオブジェクトのメモリ破損、未定義の動作までが含まれます。コンパイラ、アーキテクチャ、ビルドフラグ、メモリレイアウトによっては、攻撃者が任意のコード実行を達成する可能性も排除できません。
オーバーフローはグローバルメモリに影響を与えるため、破損が永続化し、その後のプログラム動作に影響を与える可能性もあります。ユーザーは、早急にzlibを最新バージョンに更新し、提供されているパッチを適用することが強く推奨されます。
