

このリポジトリは、tokio-tarおよび関連する非同期Rust tarライブラリにおいて、PAX拡張ヘッダーの size オーバーライドが次のヘッダー位置を計算する前に適用されない重大なバグを示しています。
根本原因: PAX拡張ヘッダーがファイルサイズを上書きするtarファイルを処理する際、ライブラリは位置計算にPAXオーバーライドではなく、8進数のサイズフィールド(多くの場合ゼロ)を使用します。
影響: これにより、パーサーがファイルコンテンツに飛び込み、それをtarヘッダーと誤認し、誤ったファイルの抽出につながります。
既知の影響を受けるライブラリ:
async-tar https://github.com/dignifiedquire/async-tartokio-tar https://github.com/vorot93/tokio-tarkrata-tokio-tar https://github.com/edera-dev/tokio-tarastral-tokio-tar https://github.com/astral-sh/tokio-tar# Requirements: CMake, Rust/Cargo, C++ compiler, system tar command
cmake -S . -B build
cmake --build build --target generate_report
これにより、以下の処理が行われます:
build/output/ に詳細レポートを生成├── disclosure/ # セキュリティ開示ドキュメントツリー
│ └── blast_radius/ # tokio-tarの派生に依存するプロジェクトの記録
├── repro_generator/ # 再現ケースtarファイルを生成するC++ツール
├── tar-bug-detector/ # tarライブラリを比較するRustツール
├── tarwalk/ # 正しいC++ tarパーサー
│ ├── tarwalk.cpp # PAXを正しく処理
│ └── tarwalk_bad.cpp # 同じバグを再現
├── CMakeLists.txt # ビルドシステム
├── generate_report.cmake # レポート生成
└── README.md # このファイル
ヘッダー -> コンテンツ(8進数フィールドからのサイズ) -> 次のヘッダー
PAXヘッダー (size=1024) -> ファイルヘッダー (8進数サイズ=0) -> コンテンツ (1024バイト) -> 次のヘッダー
PAXヘッダー (size=1024) -> ファイルヘッダー (8進数サイズ=0) -> コンテンツ (0バイト) -> 誤った位置
↓
コンテンツをヘッダーとして読み取り!
Dockerのsaveは次のようなtarファイルを作成します:
etc/、usr/)pax_bug_compact.tar - 最小限の再現ケース正しいライブラリ (GNU tar、同期tarクレート):
normal.txt -> blob.bin -> marker.txt
バグのあるライブラリ (tokio-tar):
normal.txt -> blob.bin -> INNER_FILE -> marker.txt
INNER_FILEの出現はバグを示しています。ライブラリがblob.binのコンテンツに飛び込み、偽のtarヘッダーを実際のエントリと誤認したことを意味します。
修正には、位置計算の前にPAXオーバーライドを適用する必要があります:
// ヘッダーを読み取る
let mut file_size = header.size();
// 次の位置を計算する前にPAXオーバーライドを適用
if let Some(pax_size) = pending_pax.get("size") {
file_size = pax_size.parse().unwrap();
}
// 効果的なサイズを使用して次のヘッダー位置を計算
let next_pos = current_pos + 512 + pad_to_512(file_size);
この再現コードは、セキュリティ研究と責任ある開示目的で提供されます。
オリジナルソースコードのライセンスについてはCOPYINGを参照してください。