
إثبات لثغرة CVE-2025-62518: خطأ حرج في تجاوز حجم الترويسة الموسعة PAX في مكتبات tokio-tar و async Rust tar، مع أدوات إعادة الإنتاج وتحليل نطاق التأثير.

يوضّح هذا المستودع خطأً حرجًا في tokio-tar ومكتبات Rust غير المتزامنة ذات الصلة بملفات tar، حيث لا يتم تطبيق تجاوزات size الخاصة بالرؤوس الموسعة PAX قبل حساب موضع الرأس التالي.
السبب الجذري: عند معالجة ملفات tar التي تحتوي على رؤوس موسعة PAX تتجاوز حجم الملف، تستخدم المكتبة حقل الحجم الثُماني (غالبًا صفر) بدلاً من قيمة التجاوز PAX في حسابات الموضع.
الأثر: يؤدي هذا إلى قفز المحلِّل إلى محتوى الملف والخلط بينه وبين رؤوس 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# Requirements: CMake, Rust/Cargo, C++ compiler, system tar command
cmake -S . -B build
cmake --build build --target generate_report
سيقوم هذا بما يلي:
build/output/├── disclosure/ # Security disclosure documentation tree
│ └── blast_radius/ # Record of projects depending on tokio-tar variants
├── repro_generator/ # C++ tool to generate a repro case tar file
├── tar-bug-detector/ # Rust tool comparing tar libraries
├── tarwalk/ # Correct C++ tar parser
│ ├── tarwalk.cpp # Handles PAX correctly
│ └── tarwalk_bad.cpp # Reproduces the same bug
├── CMakeLists.txt # Build system
├── generate_report.cmake # Report generation
└── README.md # This file
Header -> Content (size from octal field) -> Next Header
PAX Header (size=1024) -> File Header (octal size=0) -> Content (1024 bytes) -> Next Header
PAX Header (size=1024) -> File Header (octal size=0) -> Content (0 bytes) -> WRONG POSITION
↓
Reading content as headers!
ينشئ 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 قبل حسابات الموضع:
// Read header
let mut file_size = header.size();
// Apply PAX overrides BEFORE calculating next position
if let Some(pax_size) = pending_pax.get("size") {
file_size = pax_size.parse().unwrap();
}
// Now calculate next header position using effective size
let next_pos = current_pos + 512 + pad_to_512(file_size);
يُوفَّر كود إعادة الإنتاج هذا لأغراض البحث الأمني والإفصاح المسؤول.
راجع COPYING للحصول على ترخيص الكود المصدري الأصلي.