
CVE-2025-62518: TARmageddon

यह भंडार tokio-tar और संबंधित async Rust tar पुस्तकालयों में एक गंभीर बग प्रदर्शित करता है जहाँ PAX विस्तारित हेडर size ओवरराइड्स अगले हेडर स्थिति की गणना करने से पहले लागू नहीं किए जाते हैं।
मूल कारण: उन PAX विस्तारित हेडर वाली tar फ़ाइलों को संसाधित करते समय जो फ़ाइल आकार को ओवरराइड करते हैं, पुस्तकालय स्थिति गणनाओं के लिए 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 https://github.com/astral-sh/tokio-tar# आवश्यकताएँ: CMake, Rust/Cargo, C++ कंपाइलर, सिस्टम tar कमांड
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 # यह फ़ाइल
Header -> Content (ऑक्टल फ़ील्ड से आकार) -> Next Header
PAX Header (आकार=1024) -> File Header (ऑक्टल आकार=0) -> Content (1024 बाइट्स) -> Next Header
PAX Header (आकार=1024) -> File Header (ऑक्टल आकार=0) -> Content (0 बाइट्स) -> गलत स्थिति
↓
सामग्री को हेडर पढ़ रहा है!
Docker save निम्नलिखित के साथ tar फ़ाइलें बनाता है:
etc/, usr/) से शुरू होने वाली परत सामग्रीpax_bug_compact.tar - न्यूनतम पुनरुत्पादन केससही पुस्तकालय (GNU tar, sync 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 देखें।