zlib圧縮ライブラリのuntgzユーティリティに深刻なグローバルバッファオーバーフロー脆弱性が発見され、システムが潜在的なメモリ破損やサービス拒否(DoS)攻撃にさらされる可能性があります。
zlibバージョン1.3.1.2で特定されたこの欠陥は、適切な検証なしにユーザー提供のアーカイブ名を処理する、制限のないstrcpy()操作に起因します。
この脆弱性はuntgzユーティリティのTGZfname()関数に存在し、コマンドライン入力を1,024バイトの固定サイズの静的グローバルバッファへ直接コピーします。
攻撃者がこの上限を超えるアーカイブ名を与えると、関数は境界外書き込みを行い、隣接するメモリ領域を破損させます。
この脆弱性の重大な点は、悪用が極めて容易であることです。攻撃者は、アーカイブの解析や検証が行われる前に悪意を持って作成されたファイル名引数を与えるだけでオーバーフローを引き起こせます。
セキュリティ研究者は、境界チェックを実装せずにargv[]からアーカイブ名(arcname)を直接導出していることが根本原因だと特定しました。
脆弱なバッファはスタックではなくグローバル静的配列として確保されているため、オーバーフローは関数に入った直後に発生します。
AddressSanitizer(ASAN)によるテストで脆弱性が確認され、4,096個の「A」文字を与えるとバッファ境界で2,001バイトの書き込みが発生することが示されました。
/root/zlib/contrib/untgz/untgz.cの136行目にあるstrcpy()呼び出しが、悪用の起点となります。
ASANの出力は、脆弱性を638行目のmain関数まで追跡しており、攻撃ベクターに認証は不要で、複雑な悪用手法も必要ないことを確認しています。
この脆弱性は、システム構成に応じて複数のセキュリティリスクをもたらします。
少なくとも、攻撃者はuntgzユーティリティをクラッシュさせることでサービス拒否状態を引き起こせます。
さらに懸念されるのは、隣接するグローバルオブジェクトのメモリ破損の可能性で、これは関数のスコープを超えて持続し、その後のプログラム動作に影響を与える恐れがあります。
特定のコンパイル環境(特定のコンパイラフラグ、アーキテクチャ、メモリレイアウト)では、この欠陥がコード実行を可能にする可能性もあります。
オーバーフローがスタックではなくグローバルメモリに影響するため、この破損は典型的なバッファオーバーフロー脆弱性よりも広範な影響を及ぼす可能性があります。
この欠陥によって引き起こされる未定義動作により、異なるシステム構成間での悪用は予測不能になります。
zlibのuntgzユーティリティを使用している組織は、パッチが利用可能になるまで、入力検証の実施や代替のアーカイブ展開ツールの使用など、直ちに緩和策を講じるべきです。
翻訳元: https://cyberpress.org/critical-zlib-vulnerability/