
6件のGDCM脆弱性に対するプライベートなエンドツーエンドのサニタイザ再現パッケージ
| 名前 | リビジョン | 内容 |
|---|
vulnerable | 9c71b163 | タグ v3.2.6 |
master | 2cd05d13 | 上流 master スナップショットを静的にレビュー済み; ランタイムマトリクスは保留中 |
fixed | 未設定 | レビュー済みの修正コミットが存在する場合にのみ設定する |
master は日付付きスナップショットであり、移動するブランチではない。両リビジョンは公開リポジトリから到達可能であるため、bootstrap.sh はプライベートソースなしでどちらも準備できる。
このリポジトリのランタイム証拠は v3.2.6 に対するものである。以下のより広い範囲はソース履歴の調査によるものであり、関与するパターンは固定された master スナップショットにも残っている。
| # | CWE | ソース調査範囲 | 必要なパス |
|---|---|---|---|
| 1 | CWE-787 | v3.0.4 から v3.2.7 | マルチフレーム RLE YBR_FULL_422 読み取り |
| 2 | CWE-787 | v2.0.16 から v3.2.7 | JPEG2000 エンコード/トランスコード |
| 3 | CWE-125 | v2.0.5 から v3.2.7 | セグメント化パレット解析; LUT 適用が伝播値を露出させる |
| 4 | CWE-787 | v2.0.8 から v3.2.7 | ImageRegionReader::ReadIntoBuffer; CVE-2024-22373 後の不完全な精度検証に関連 |
| 5 | CWE-674 | v2.0.4 以前から v3.2.7 | 通常のネストされたシーケンス解析 |
| 6 | CWE-369 | v2.0.4 以前から v3.2.7 | NumSegments=0 での通常の RLE 解析 |
fixtures/ - 不活性な DICOM 入力。manifest/expectations.json で SHA-256 固定され、各トリガー実行前に検証されるgenerators/ - すべてのフィクスチャに対する決定的で依存関係のないソースジェネレーターharnesses/ - 最小限の読み取り/エンコード/デコードハーネス; Finding 2 は gdcmconv CLI とサーバーが呼び出すライブラリトランスコード API の両方を通じて示されるmanifest/expectations.json - fixed ターゲットに対する機械可読なコマンド、決定的シグナル、受け入れ基準scripts/ - 固定ソースの準備、サニタイザービルド、有界実行、クリーンアップevidence/ - すでに観測された簡潔な結果。未テストのターゲットは明示的に記載LICENSE - MIT ライセンスGit、Python 3、CMake 3.20+、Ninja、および C++11 ツールチェーン (Clang または GCC) を備えた使い捨ての Linux または macOS ビルド環境。Ubuntu では: git python3 cmake ninja-build clang zlib1g-dev。GCC を使用するには CC/CXX を設定する。
ソース準備は、GDCM_SOURCE_REPO が既存のローカルクローンを指していない限り、HTTPS 経由でクローンする。SSH ホストは使用されない。
これらのコマンドはソースとビルド成果物のみを準備する; フィクスチャは開かない。
./scripts/build-target.sh vulnerable asan debug
./scripts/build-target.sh vulnerable ubsan debug
./scripts/build-target.sh master asan debug
./scripts/build-target.sh master ubsan debug
第3引数はプロファイルである。debug は -O0 -g; release は -O2 -g -DNDEBUG で、GDCM の gdcm_debug_assert() を省略し、ディストリビューションがライブラリをビルドする方法と一致する。両方でマトリクスを実行することで、メンテナーが最初に尋ねる質問、すなわちレポートがアサーション有効ビルドの産物かどうかに答えることができる。
GDCM_SUPPORT_BROKEN_IMPLEMENTATION=ON は GDCM 自身のデフォルトであり、そのままにされる。保守的な並列度は JOBS=8 で上書きする。
すべてのビルドは build-info.json (リビジョン、コンパイラ、フラグ、プラットフォーム) をその GDCM ビルドツリーに書き込み、すべての実行サマリーがそれを埋め込むため、アーカイブされた証拠は自己記述的である。
export GDCM_REPRO_ACK=I_UNDERSTAND_THIS_CRASHES_A_LOCAL_PROCESS
./scripts/run-matrix.sh vulnerable master --profile debug # all automated cases
./scripts/run-one.sh vulnerable f1 # one trigger
./scripts/run-one.sh vulnerable f1 --control # its control
run-matrix.sh はすべてのターゲットに対してすべての自動ケースを実行し、最初の失敗で停止せず、_runs/matrix-<stamp>.json とレンダリングされた _runs/matrix-<stamp>.md を書き込む。2段階の f1-exploit ケースは手動のままであり、失敗した自動ケースとして誤分類されるのではなく、そのように報告される。
各子プロセスはコアダンプが無効化され、15秒のタイムアウトがある; Finding 5 にはさらに有界なスタック制限が与えられる。出力は _runs/ の下に留まる。分類器はサニタイザークラスと関与する関数を照合し、アドレス、PID、ソース行番号は決して照合しない。
vulnerable では、決定的シグナルが現れ、そのコントロールがクリーンなままであればケースは合格する。master では、ランナーは事前に宣言された判定ではなく観測を記録する。fixed では、シグナルが存在せず、他のサニタイザーや致命的シグナルが現れず、ハーネスが許可されたクリーンな結果を返す場合にのみケースは合格する。これらのルールは FIXED_REV が実際のパッチを指すまでは暫定的である; そのパッチの意図された拒否または処理の動作に対してレビューされなければならない。
| ケース | Finding | 示す内容 |
|---|---|---|
f1 | 1 | RLECodec::DecodeFragment における ASan ヒープ書き込み |
f1-exploit | 1 | 計装された隣接オブジェクト上書きと間接分岐制御 (Linux x86-64) |
f2 | 2 | gdcmconv --j2k 経由の opj_write_from_memory における ASan ヒープ書き込み |
f2-lib | 2 | ImageChangeTransferSyntax::Change 経由の同じ書き込み |
f3 | 3 | セグメント化パレット展開における ASan ヒープ読み取り |
f3-propagation | 3 | 範囲外バイトがデコードされたピクセルに到達し、カウントとして報告される |
f3-sentinel | 3 | 有界な既知のガードワードが論理 LUT 境界を越える |
f4 | 4 | JPEG2000 領域デコードにおける ASan ヒープ書き込み |
f5 | 5 | ネストされたシーケンスアイテムでの ASan スタック枯渇 |
f6 | 6 | RLE デコードにおける UBSan ゼロ除算; x86 では SIGFPE |
さらに2つのハーネスは再現ケースではなく悪用可能性の研究であり、Linux x86-64 上の非サニタイズプロファイルでのみビルドされる:
| ハーネス | Finding | 確立する内容 |
|---|---|---|
finding01_groom | 1 | テストされた glibc の隣接性。アロケーション記録フックを通じて観測 |
finding03_leak | 3 | 131070バイトの過剰読み取りがビルド固有のライブラリポインタを露出させ得る |
evidence/v3.2.6-macos-arm64-debug.md は完了した v3.2.6 デバッグマトリクスを記録し、すべてのコントロールと両方の有界な Finding 3 伝播チェックを含む。
evidence/v3.2.6-linux-x86_64-finding01-groom.md と evidence/v3.2.6-linux-x86_64-finding03-leak.md は以下の2つの悪用可能性結果を記録する。現在の master、完全なリリースプロファイルマトリクス、および f1-exploit の結果は、そのトランスクリプトが保持されるまで主張されない。
./scripts/clean.sh
クリーンアップはパッケージマーカーなしでは実行を拒否し、このリポジトリ下の _work、_build、_generated、_runs、および Python バイトコードキャッシュのみを削除する。evidence/ 下の保持された証拠は削除されない。
f1-exploit は Linux-x86_64 専用であり、手動で実行される; manifest/expectations.json に正確なコマンドシーケンスが記載されている。ハーネスの決定的なアロケーション配置の下で、それぞれが一致するネガティブケースを持つ3つの別々の事実をテストする:
f1 フィクスチャを使用すると、破損は報告されるが明示的にコンテンツ制御は ない ため、チェックは反証可能である;12288バイトのオーバーフロー内の8バイトウィンドウの約半分は任意の値を受け入れる。残りは結合されている。DoYBRFull422 が1つのソースバイトを2つの出力位置に複製するためである; オフセット 6144 は自由なウィンドウの1つである。フレーム1のデコードは最後に実行されるため、アロケーションを越えて持続するのはフレーム1の内容である。
ハーネスは、隣接オブジェクトが変更されている間に ImageReader::Read() が true を返すかどうかを記録する。その結果を観測された証拠として記述する前に、成功した Linux x86-64 トランスクリプトが保持されなければならない。
f1-exploit は独自の被害者配置を提供するため、未変更のプロセスがその配置を持つかどうかには答えられない。finding01_groom はストック glibc、デフォルト PIE、および ASLR を使用し、アロケーションを記録するが再配置はしないグローバルアロケーションフックを備える。保持されたテストでは:
finding01 ハーネスも計装なしで同じように死ぬ。テストされた glibc ビルドでは、Finding 1 は確実にサービス拒否を引き起こした; コード実行パスは見つからなかった。 テストされたジオメトリは固定であり、他のアロケータやプラットフォームではヒープが異なる配置になる可能性がある。
finding03_leak はより強力な結果である。テストされたビルドでは、範囲外読み取りは131070バイトに達し、gdcm::ByteValue vtable ポインタがデコードされたピクセルに入り、ハーネスはそのビルドの既知の vtable オフセットを使用してライブラリロードベースを導出する。これはローカルな API レベルの開示結果である: LUT 適用とデコードされたピクセルバッファへのアクセスを必要とする。ネットワークサービスがそれらのピクセルを返すことは示していない。
この2つはここではコード実行に連鎖させることができない。被害者が見つからなかったからだけでなく、異なる PhotometricInterpretation 値を必要とするため2つのファイルが必要であり、漏洩したベースは漏洩プロセスがまだ生きている間のみ有用である。
サニタイザーレポートは、テストされたプロセスとリビジョンにおける記載されたメモリ安全性または未定義動作イベントを証明する。f1-exploit は、意図的にターゲット配置を供給する計装されたアロケータの下で、バイト制御と隣接関数ポインタ上書きをテストする。未変更のコンシューマーにおけるその配置を確立するものではない。保持された finding01_groom 試行は、テストされたジオメトリと glibc ビルドに対してその配置を観測しなかった。
これらのいずれも、特定の製品におけるリモート到達可能性、永続性、または下流への適用可能性を証明するものではない。特定のデプロイメントに対する到達可能性の議論は別個の主張であり、開示文書で行われるもので、このパッケージによるものではない。