重大なzlibの欠陥により、攻撃者がuntgz経由でバッファオーバーフローを引き起こせる

zlibのuntgzユーティリティに深刻なバッファオーバーフロー脆弱性が発見されました。バージョン1.3.1.2に影響し、攻撃者は悪意を持って細工したコマンドライン引数を介してメモリ破損を引き起こすことができます。

この脆弱性はTGZfname()関数に存在し、無制限のstrcpy()呼び出しが、ユーザー提供のアーカイブ名を長さ検証なしに固定サイズ(1024バイト)のグローバルバッファへ直接コピーします。

攻撃者が1024バイトを超えるアーカイブ名を与えると、ユーティリティはバッファ境界を超えてデータを書き込み、グローバルバッファオーバーフローを引き起こします。

この欠陥が特に懸念されるのは、悪用が極めて容易である点です。脆弱なコードはアーカイブの解析や検証より前に実行されるため、攻撃者は複雑な手順を必要とせず、コマンドライン引数として長いファイル名を渡すだけでオーバーフローを誘発できます。

根本原因は複数のコーディング上の弱点にあります。アーカイブ名がサニタイズなしにargv[]から直接導出されていること、コピー前に入力長を検証する境界チェックがないこと、そしてバッファがスタック確保ではなくグローバルな静的配列であることです。オーバーフローは関数に入った直後に発生します。

SECはAddressSanitizer(ASAN)を用いてこの脆弱性を実証し、untgzユーティリティが4096バイトの入力文字列を処理した際にグローバルバッファオーバーフローを検出しました。

ASANの出力は、脆弱なメモリアドレスに対して2001バイトの書き込みが行われたことを確認し、スタックトレースはuntgz.cの136行目にあるstrcpy()呼び出しを指し示しました。

想定される影響は、サービス拒否(DoS)によるクラッシュから、隣接するグローバルオブジェクトのメモリ破損、未定義動作にまで及びます。

特定の条件下では、コンパイラ、アーキテクチャ、ビルドフラグ、メモリレイアウトに依存して、攻撃者が任意コード実行を達成できる可能性があります。

オーバーフローはグローバルメモリに影響するため、破損が持続し、その後のプログラム動作に影響を及ぼす可能性があります。

翻訳元: https://gbhackers.com/critical-zlib-flaw/

ソース: gbhackers.com