Odin の圧縮コンポーネントが境界検査の欠如により境界外書き込みを許しメモリ破壊を引き起こす
攻撃者は悪意ある圧縮データストリーム(切り詰められた DEFLATE ストリームや特定パターンのゼロバイトストリームなど)を構成し、zlib.inflate または gzip.load が内部バッファを COMPRESS_OUTPUT_ALLOCATE_MAX 上限まで拡張したあとも書き込みを続けさせます。grow_buffer は上限到達時にエラーを返さず、write_byte などの下位書き込みは後続の長さ検証を欠き境界検査を無効化しているため、データがヒープブロックの外へ書かれヒープバッファオーバーフローとなります。その結果、サービス拒否、任意コード実行、または機微情報の漏えいが起こり得ます。
コンポーネント
Odin はシステム級プログラミング言語とその標準ライブラリ集合です。core/compress モジュールはアプリケーションに効率的なストリームおよびバッファ方式の圧縮・展開を提供し、動的メモリ管理で可変長の入出力ストリームを扱います。高性能な Zlib および Gzip 互換処理を実現し、リソース制約環境でも低いオーバーヘッドでデータ変換することを設計目標としています。
種別
Out-of-bounds Write (CWE-787)
リポジトリ
対処方法
- バッファ拡張ロジックに厳格な上限検査を加え、現在長が所定の最大値に達したら黙って失敗せず直ちにエラーを返してください。すべての下位書き込みの前に残り容量を再検証し、不足していれば処理を中止してエラーを報告してください。さらに重要な #no_bounds_check コンパイル指示を外し、既定の実行時安全検査を有効にしてください。
php-src の pdo_pgsql ドライバがプリペアドステートメントの列数変化で境界外読み取りを起こしサービスがクラッシュする
PDO::ATTR_EMULATE_PREPARES を有効にしたとき、プリペアドステートメントの 2 回目の実行が返す列数が初回より多いと、内部配列 S->cols と stmt->columns は初期サイズのまま割り当てられたままとなり、インデックスの境界外読み取りが起きます。攻撃者は ALTER TABLE で列を追加するかビューを切り替えて結果セット構造を変え、zend_symtable_update にダングリングポインタを使わせ、ヒープバッファオーバーフローを引き起こせます。プロセスがクラッシュするか情報が漏えいする可能性があり、可用性に深刻な影響があります。
コンポーネント
php-src は PHP 言語のソースリポジトリです。pdo_pgsql 拡張は中核のデータアクセスコンポーネントとして、PHP アプリケーションと PostgreSQL の標準化された接続と対話を実装します。オブジェクト指向で、効率的なプリペアドステートメント実行、パラメータバインド、結果セット解析を提供し、複雑な業務ロジックでも大規模な並行データベース問い合わせを安全かつ安定して処理します。企業向け Web バックエンドの永続化層における重要な依存です。
種別
Out-of-bounds Read (CWE-125)
リポジトリ
対処方法
- エミュレートされたプリペアを無効にしてネイティブドライバの保護を使うか、動的に変わり得る結果セットのメタデータをコード側で厳格に検証し、実行のたびに列記述配列を再割り当てしてサイズとメモリ境界を確認してください。