
एक आक्रामक सुरक्षा शोधकर्ता + एक AI बनाम एक ताज़ा n-day: एक शुक्रवार रात में CVE-2026-53435 के लिए पहला सार्वजनिक PoC बनाना। अंदर 8h20m का कच्चा लॉग।
पहला सार्वजनिक प्रूफ-ऑफ-कॉन्सेप्ट CVE-2026-53435 के लिए, जो तब बनाया गया जब केवल एडवाइजरी मौजूद थी और कहीं भी कोई PoC प्रकाशित नहीं हुआ था। एक अस्पष्ट एक-पंक्ति वाली एडवाइजरी से लगभग ~8.5 घंटे में शुक्रवार रात को पुनर्निर्मित — एक्सप्लॉइट को हाथ से लिखकर नहीं, बल्कि एक AI को निर्देशित करके मृत छोरों, पिवट्स और सत्यापन के माध्यम से जब तक एक कार्यशील श्रृंखला नहीं मिल गई।

PoC कंट्रोलर पर
/etc/passwdतक पहुँच रहा है — मनमाना फ़ाइल पढ़ना सुनिश्चित हुआ।
| CVE | CVE-2026-53435 (Jenkins SECURITY-3707) |
| श्रेणी | असुरक्षित डिसीरियलाइज़ेशन (config.xml के माध्यम से ClassFilter बाईपास) |
| प्रभाव (यह PoC) | कंट्रोलर पर प्रमाणित मनमाना फ़ाइल पढ़ना |
| प्रभावित | Jenkins साप्ताहिक ≤ 2.567, LTS ≤ 2.555.2 |
| समाधान | Jenkins साप्ताहिक 2.568, LTS 2.555.3 |
| एडवाइजरी | https://www.jenkins.io/security/advisory/2026-06-10/ (2026-06-10 को प्रकाशित) |
| लेखन के समय स्थिति | कोई सार्वजनिक PoC मौजूद नहीं था (GitHub PoC रिपॉजिटरी: 0) |
यह केवल परिणाम नहीं, बल्कि प्रक्रिया को दिखाने का एक प्रयोग है।
वर्षों तक, एक आक्रामक शोधकर्ता का आउटपुट एक एकल तैयार एक्सप्लॉइट था — इसे बनाने में लगे 8 घंटे के गलत रास्ते गायब हो जाते थे। यह रिपॉजिटरी गलत रास्तों को रखती है। एक मानव + AI द्वारा एडवाइजरी से कार्यशील PoC तक एक नए n-दिवसीय कार्य पर काम करने का पूरा, हल्के संपादन वाला ट्रांसक्रिप्ट परिशिष्ट के रूप में शामिल है।
यह जो बिंदु बनाता है वह जानबूझकर "AI ने यह किया" नहीं है। 8 घंटे इस बात के सबूत हैं कि ऐसा नहीं हुआ। AI ने कभी एक-शॉट में श्रृंखला नहीं बनाई। काम को आगे बढ़ाने वाली डोमेन विशेषज्ञता थी — यह जानना कि एडवाइजरी एक डिसीरियलाइज़ेशन सिंक छिपा रही है, यह जानना कि प्लगइन्स के बजाय Jenkins कोर प्रकारों में देखना है, यह जानना कि पैच-पूर्व DescribableList अपने एलिमेंट प्रकार को लागू नहीं करेगा, और यह जानना कि किसी दावे पर भरोसा करने के बजाय उसे सत्यापित कैसे किया जाए। शोधकर्ता का मूल्य गायब नहीं हुआ; यह एक्सप्लॉइट टाइप करने से निर्देशित करने, छाँटने और सत्यापित करने में स्थानांतरित हो गया।
यह बदलाव वह चीज़ है जो दस्तावेज़ीकरण के लायक है।
Jenkins डिसीरियलाइज़ेशन को एक कस्टम ClassFilter से सुरक्षित करता है जो केवल Jenkins कोर या प्लगइन्स में परिभाषित प्रकारों की अनुमति देता है। CVE-2026-53435 यह है कि यह पर्याप्त नहीं है: एक हमलावर जो config.xml POST कर सकता है, Jenkins को एक मनमाने कोर/प्लगइन प्रकार को उस संदर्भ में डिसीरियलाइज़ करवा सकता है जिसने कभी इसकी उम्मीद नहीं की, और फिर Stapler रूटिंग के माध्यम से HTTP पर उस ऑब्जेक्ट तक पहुँच सकता है।
यह PoC एक hudson.Plugin$DummyImpl (एक Jenkins-कोर प्रकार, इसलिए यह स्थान श्वेतसूची से गुज़रता है) को एक ListView की <properties> सूची में रोपता है — एक DescribableList<ViewProperty> जो पैच-पूर्व अपने एलिमेंट प्रकार को लागू नहीं करता है। रोपा गया ऑब्जेक्ट baseResourceURL=file:/ ले जाता है। उस पर एक HTTP अनुरोध को रूट करने से सीधे कंट्रोलर के फ़ाइल सिस्टम से फ़ाइलें सर्व होती हैं।
एक सामान्य ysoserial श्रृंखला यहाँ काम नहीं करती — फ़िल्टर से बचने के लिए गैजेट को एक Jenkins/प्लगइन-निवासी प्रकार होना चाहिए। यह बाध्यता पूरा खेल है।
केवल उन सिस्टमों के विरुद्ध उपयोग करें जिनके आप मालिक हैं या जिनका परीक्षण करने के लिए आप स्पष्ट रूप से अधिकृत हैं।
एक्सप्लॉइट को दो समान-कॉन्फ़िग वाले कंटेनरों — संवेदनशील 2.555.2 और पैच किया गया 2.555.3 — के विरुद्ध चलाया गया, ताकि यह पुष्टि हो सके कि यह इस CVE का उपयोग करता है न कि किसी असंबंधित फ़ाइल-पढ़ने के आदिम का:
| 2.555.2 (संवेदनशील) | 2.555.3 (पैच किया गया) | |
|---|---|---|
createView | HTTP 200 | HTTP 200 |
संग्रहीत <properties> | <hudson.Plugin_-DummyImpl/> — बच जाता है | <properties/> — हटा दिया गया |
ट्रिगर → /etc/passwd | root:x:0:0:... — पढ़ा | खाली — अवरुद्ध |
पैच किया गया बिल्ड अनुरोध स्वीकार करता है लेकिन फिक्स रोपे गए प्रकार को डिसीरियलाइज़ेशन के समय अस्वीकार करता है, इसलिए प्रॉपर्टीज़ सूची खाली आती है और रूट करने के लिए कुछ नहीं है। विफलता ठीक उसी तंत्र पर होती है जिसका एडवाइजरी वर्णन करती है — जो इसे CVE-2026-53435 के लिए एक वास्तविक PoC बनाता है।
python3 exploit_cve_2026_53435_v2.py <base_url> <user> <pass> <remote_file> [view_name]
# उदाहरण (अपनी स्वयं की प्रयोगशाला के विरुद्ध):
python3 exploit_cve_2026_53435_v2.py http://127.0.0.1:8080 <user> <pass> /etc/passwd
base_url — लक्ष्य का http://host:port (सादा HTTP; https उपसर्ग न करें जब तक कि इंस्टेंस वास्तव में TLS समाप्त न करता हो)।config.xml POST करने की अनुमति हो (View/Configure), साथ ही Overall/Read।docker compose -f lab/docker-compose.yml up -d
# संवेदनशील: http://127.0.0.1:8080 (Jenkins LTS 2.555.2)
# पैच किया गया: http://127.0.0.1:8081 (Jenkins LTS 2.555.3, नकारात्मक नियंत्रण)
प्रयोगशाला Groovy init के माध्यम से एक स्थानीय-केवल उपयोगकर्ता डेटाबेस प्रदान करती है ताकि प्रमाणित-निम्न-विशेषाधिकार पथ का बाहरी IdP के बिना उपयोग किया जा सके।
2026-06-12 (शुक्र) 15:00 → 23:23 ≈ 8h 20m
15:00–15:12 प्रयोगशाला बनाई (डॉकर: संवेदनशील 2.555.2 / पैच किया गया 2.555.3) + पहली टोही
15:12–21:00 डिसीरियलाइज़ेशन सिंक और गैजेट विश्लेषण
(Commons-Collections बाईपास प्रयास विफल → पिवट
properties से actions और वापस)
21:00–22:30 ClassFilter विश्लेषण + गैजेट पुनः खोज, कोर प्रकारों तक सीमित
22:30–23:00 कार्यशील PoC (v1 → v2) + अंतर सत्यापन (संवेदनशील बनाम पैच किया गया)
उन घंटों में से अधिकांश विश्लेषण थे, टाइपिंग नहीं। एक्सप्लॉइट स्वयं अंतिम ~30 मिनटों में बना — एक बार जब सही सिंक और गैजेट ज्ञात हो गए।
Claude Code (Anthropic) के साथ बनाया गया, लेखक द्वारा संवादात्मक रूप से संचालित:
पूरा, हल्के संपादन वाला कार्यशील ट्रांसक्रिप्ट transcript/ में है — मृत छोरों सहित कच्चा रखा गया। (केवल कुछ पंक्तियों के स्वर को नरम करने और स्थानीय नेटवर्क विवरण छिपाने के लिए संपादित; कुछ भी तकनीकी नहीं हटाया गया।)
केवल अधिकृत सुरक्षा परीक्षण, शोध और शिक्षा के लिए। लेखक और योगदानकर्ता दुरुपयोग के लिए कोई देयता स्वीकार नहीं करते। लक्षित भेद्यता पैच की जा चुकी है — Jenkins LTS 2.555.3 / साप्ताहिक 2.568 या बाद में अपडेट करें।