स्व-निहित डॉकर लैब जो CVE-2007-4559 (TarSlip) डायरेक्टरी ट्रैवर्सल को पायथन के tarfile मॉड्यूल के माध्यम से प्रदर्शित करता है। इसमें असुरक्षित और सुरक्षित APIs, पेलोड जनरेशन, और सुरक्षा शिक्षा के लिए एक इंटरैक्टिव डेमो स्क्रिप्ट शामिल है।
केवल शैक्षिक उपयोग के लिए। यह लैब जानबूझकर आइसोलेटेड डॉकर कंटेनरों के अंदर फाइल सिस्टम की कमजोरियों का शोषण करती है। इसे संवेदनशील डेटा वाले किसी भी सिस्टम या प्रोडक्शन वातावरण में न चलाएं।
एक स्व-निहित डॉकर लैब जो CVE-2007-4559 — पायथन के tarfile मॉड्यूल में कुख्यात "TarSlip" भेद्यता — को एक ठोस, एंड-टू-एंड अटैक श्रृंखला के माध्यम से प्रदर्शित करता है:
extractall() आँख मूंदकर ../../../etc/passwd नामक एक टार प्रविष्टि को निष्कर्षण निर्देशिका के बाहर लिखता है, वास्तविक सिस्टम फ़ाइल को अधिलेखित करता है।/admin एंडपॉइंट तक पहुंच प्रदान करता है।पायथन का tarfile.extractall() टार आर्काइव में प्रत्येक प्रविष्टि को ईमानदारी से पुन: उत्पन्न करता है, जिसमें वे प्रविष्टियाँ भी शामिल हैं जिनके नामों में ../ पथ ट्रैवर्सल अनुक्रम होते हैं। इसे कभी भी एक सुरक्षा सीमा के रूप में डिज़ाइन नहीं किया गया था।
tar entry name : ../../../etc/passwd
extraction dir : /shared/uploads/a1b2c3d4/
resolved path : /shared/uploads/a1b2c3d4/../../../etc/passwd
= /etc/passwd ← system file overwritten
| समयरेखा | |
|---|---|
| 2007 | पायथन सुरक्षा टीम को बग की सूचना दी गई |
| 2007 – 2022 | "सुरक्षा मुद्दा नहीं" के रूप में चिह्नित — tarfile "इच्छित रूप से काम कर रहा है" |
| 2022 | ट्रेलिक्स शोधकर्ता GitHub को स्कैन करते हैं और 350,000+ रेपो पाते हैं जो अविश्वसनीय इनपुट पर extractall() कॉल करते हैं |
| 2022 | सार्वजनिक खुलासा। CVE-2007-4559 पुन: उभरता है। उद्योग-व्यापी हड़बड़ी। |
| 2023 | PEP 706 पायथन 3.12 में filter='data' शिप करता है — फिक्स एक एकल तर्क है |
डेमो तीन चरणों में चलता है, प्रत्येक को आगे बढ़ने के लिए एक कीप्रेस की आवश्यकता होती है।
GET /admin → 401। एडमिन एंडपॉइंट मौजूद है और संरक्षित है। हमलावर को पासवर्ड नहीं पता है।innocent.tar.gz अपलोड करें → फ़ाइलें सैंडबॉक्स निर्देशिका के अंदर लैंड करती हैं। सब कुछ सामान्य दिखता है।हमलावर tarslip_passwd.tar.gz क्राफ्ट करता है
└─ entry: "../../../etc/passwd"
content: admin:hacked:1001:... ← planted password
│
▼
POST /upload (multipart file upload)
│
▼
extractall("/shared/uploads/{uuid}/")
resolves "../../../etc/passwd" → /etc/passwd ← CVE-2007-4559
│
▼
GET /admin Authorization: Basic admin:hacked
│
▼
HTTP 200 — "Welcome, admin! You have full admin access."
flag: CVE-2007-4559{tarslip_passwd_overwrite_to_admin_rce}
एक HTTP POST। कोई शेल नहीं। कोई RCE पेलोड नहीं। सिर्फ एक टार फ़ाइल।
वही टारबॉल फिक्स्ड API पर अपलोड की जाती है, जो extractall() में filter='data' पास करती है। पायथन tarfile.OutsideDestinationError उठाता है — ट्रैवर्सल अवरुद्ध हो जाता है, /etc/passwd अछूता रहता है, और /admin लॉक रहता है।
# Vulnerable — default before Python 3.14
tar.extractall(extraction_dir)
# Fixed — PEP 706 (Python 3.12+)
tar.extractall(extraction_dir, filter='data')
एक तर्क। पंद्रह साल शिप करने में।
एक आइसोलेटेड डॉकर ब्रिज नेटवर्क (tarslip-net) पर चार सेवाएँ। कुछ भी इंटरनेट तक नहीं पहुँचता।
┌─────────────────────────────────────────────────────────┐
│ tarslip-net (bridge) │
│ │
│ ┌─────────────────┐ ┌──────────────────────────┐ │
│ │ vulnerable-api │ │ file-server │ │
│ │ python:3.11.3 │ │ nginx:alpine │ │
│ │ port 8000 │ │ port 8080 (host) │ │
│ │ │ │ │ │
│ │ POST /upload │ │ /shared पर HTTP सेवा │ │
│ │ GET /admin │ │ निकाली गई फ़ाइलें ब्राउज़ │ │
│ │ GET /health │ │ करता है │ │
│ └────────┬────────┘ └────────────┬─────────────┘ │
│ │ shared-storage volume │ │
│ └────────────────────────────┘ │
│ │
│ ┌─────────────────┐ │
│ │ attacker │ │
│ │ python:3.12 │ (कोई होस्ट पोर्ट नहीं — केवल आंतरिक) │
│ │ │ │
│ │ craft_malicious.py — टारबॉल जनरेट करता है │
│ │ demo.py — डेमो चलाता है │
│ └─────────────────┘ │
└─────────────────────────────────────────────────────────┘
| सेवा | छवि | भूमिका | होस्ट पोर्ट |
|---|---|---|---|
vulnerable-api | python:3.11.3-slim | Flask अपलोड API + /etc/passwd प्रमाणीकरण द्वारा संरक्षित /admin | 8000 |
fixed-api | python:3.12-slim | समान कोड + USE_SAFE_EXTRACTION=true | 8000 |
file-server | nginx:alpine | निकाली गई फ़ाइलों की निर्देशिका सूची | 8080 |
attacker | python:3.12-slim | पेलोड जनरेटर + डेमो ड्राइवर | — |
भेद्य और फिक्स्ड APIs समान स्रोत कोड का उपयोग करते हैं। एकमात्र अंतर फिक्स्ड कंटेनर पर USE_SAFE_EXTRACTION=true एनवायरनमेंट वेरिएबल है, जो एकल filter='data' तर्क को फ्लिप करता है।
CVE-2007-4559-lab/
├── run_demo.sh ← यहाँ से शुरू करें
├── docker-compose.vulnerable.yml
├── docker-compose.fixed.yml
├── vulnerable-api/
│ ├── app.py # Flask API: /upload + /admin + /health
│ ├── Dockerfile # /etc/passwd में admin:s3cr3t_Adm1nPass बीजित करता है
│ └── requirements.txt
├── file-server/
│ ├── Dockerfile
│ └── nginx.conf
└── attacker/
├── craft_malicious.py # innocent.tar.gz + tarslip_passwd.tar.gz जनरेट करता है
├── demo.py # चार-मोड CLI ड्राइवर (craft/baseline/exploit/verify)
├── Dockerfile
└── requirements.txt
docker compose version)bash का उपयोग करती हैgit clone https://github.com/your-username/CVE-2007-4559-lab.git
cd CVE-2007-4559-lab
bash run_demo.sh
स्क्रिप्ट पूरी तरह से इंटरैक्टिव है। यह प्रत्येक चरण से पहले एक विवरण प्रिंट करती है और आगे बढ़ने के लिए Enter की प्रतीक्षा करती है। अनुसरण करने के लिए किसी पूर्व डॉकर ज्ञान की आवश्यकता नहीं है।
| विराम | दिखाया गया विवरण | Enter पर कार्रवाई |
|---|---|---|
| 1 | CVE समयरेखा, तीन चरण क्या हैं | भेद्य स्टैक बनाएं |
| 2 | कंटेनर भूमिकाएँ, बीजित एडमिन पासवर्ड | पेलोड जनरेट करें |
| 3 | प्रत्येक टारबॉल के अंदर क्या है | चरण 1 — आधार रेखा (Baseline) |
| 4 | /admin 401 क्यों है, सामान्य निष्कर्षण कैसा दिखता है | चरण 2 — हमला (Exploit) |
| 5 | सटीक ट्रैवर्सल गणित, क्या अधिलेखित होता है | फिक्स्ड स्टैक पर स्विच करें |
| 6 | filter='data' क्या करता है और यह क्यों काम करता है | चरण 3 — सत्यापित करें (Verify) |
| 7 | मुख्य निष्कर्ष + व्यापक ZipSlip पैटर्न | टियरडाउन |
यदि आप मैन्युअल रूप से कदम उठाना चाहते हैं:
# भेद्य स्टैक
docker compose -f docker-compose.vulnerable.yml up --build -d
docker compose -f docker-compose.vulnerable.yml exec attacker python craft_malicious.py
docker compose -f docker-compose.vulnerable.yml exec attacker python demo.py baseline
docker compose -f docker-compose.vulnerable.yml exec attacker python demo.py exploit
# फिक्स्ड स्टैक
docker compose -f docker-compose.vulnerable.yml down
docker compose -f docker-compose.fixed.yml up --build -d
docker compose -f docker-compose.fixed.yml exec attacker python craft_malicious.py
docker compose -f docker-compose.fixed.yml exec attacker python demo.py verify