
CVE-2026-44590 के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, Sherlock के GitHub Actions वर्कफ़्लो में कमांड इंजेक्शन जो pull_request_target के माध्यम से RCE और GITHUB_TOKEN एक्सफ़िल्ट्रेशन सक्षम करता है।
खोज एवं रिपोर्ट: Astaruf
पूर्ण विवरण: https://nstsec.com/en/posts/sherlock-rce-pull-request-target-cve-2026-44590/
अपस्ट्रीम सलाह: sherlock-project/sherlock GHSA advisory
NVD प्रविष्टि: https://nvd.nist.gov/vuln/detail/CVE-2026-44590
CVE रिकॉर्ड: https://www.cve.org/CVERecord?id=CVE-2026-44590
इस रिपॉजिटरी में CVE-2026-44590 के लिए प्रूफ-ऑफ-कॉन्सेप्ट शामिल है, जो sherlock-project/sherlock के validate_modified_targets.yml GitHub Actions वर्कफ़्लो में एक कमांड इंजेक्शन है। कोई भी GitHub उपयोगकर्ता एक पुल रिक्वेस्ट खोल सकता है जो विशेषाधिकार प्राप्त CI संदर्भ में मनमाना कमांड निष्पादन ट्रिगर करता है, वर्कफ़्लो के GITHUB_TOKEN को बाहर निकालता है, और दुर्भावनापूर्ण PR को स्वतः-अनुमोदित करता है, यह सब बिना किसी मानवीय हस्तक्षेप के।
पूर्ण तकनीकी विवरण (मूल-कारण विश्लेषण, शोषण वॉकथ्रू, प्रभाव चर्चा, और वास्तविक-विश्व परिदृश्यों में हमलावर क्या कर सकता है इस पर एक अध्याय) के लिए ब्लॉग पोस्ट देखें:
nstsec.com/en/posts/sherlock-rce-pull-request-target-cve-2026-44590
यह README विशेष रूप से PoC स्क्रिप्ट पर केंद्रित है: यह क्या करती है, इसे कैसे चलाएं, और क्या उम्मीद करें।
poc.py के बारे मेंpoc.py एक एकल स्व-निहित Python स्क्रिप्ट है (केवल stdlib) जो पूरी हमले की श्रृंखला को अंत-से-अंत तक स्वचालित करती है:
sherlock-project/sherlock को फोर्क करती हैmaster को प्री-फिक्स कमिट पर वापस ले जाती है ताकि अपस्ट्रीम फिक्स के बाद भी बग को पुन: उत्पन्न किया जा सकेinteractsh-client) स्पॉन करती हैGITHUB_TOKEN निकालती है (--mode exfil में) और उसे स्पष्ट पाठ में डिकोड करती हैVULNERABILITY CONFIRMED या FIX VERIFIEDinteractsh-client समाप्त करती है)ठीक एक मैनुअल चरण आवश्यक है (प्रति फोर्क पहली बार GitHub के "I understand my workflows" बैनर पर क्लिक करना), क्योंकि इसे खारिज करने के लिए कोई सार्वजनिक API मौजूद नहीं है। स्क्रिप्ट इस स्थिति का पता लगाती है और स्पष्ट संकेत के साथ रुक जाती है।
python3 poc.py --fork-owner <your-github-username>
रिपो को फोर्क करती है (यदि आवश्यक हो), अपस्ट्रीम (पैच किया गया master) के साथ सिंक करती है, एक दुर्भावनापूर्ण PR खोलती है, हमले की श्रृंखला चलाती है, और FIX VERIFIED रिपोर्ट करती है क्योंकि पैच किया गया वर्कफ़्लो किसी भी शेल कमांड के चलने से पहले पेलोड को ब्लॉक कर देता है।
python3 poc.py --fork-owner <your-github-username> --vulnerable
ऊपर जैसा ही, लेकिन पहले फोर्क के master को प्री-फिक्स कमिट (271608fb) पर वापस ले जाता है। अपेक्षित निर्णय: VULNERABILITY CONFIRMED।
python3 poc.py --fork-owner <your-github-username> --vulnerable --mode exfil
एक्सफिल पेलोड git config --list को OAST पर डंप करता है और वर्कफ़्लो (और इस प्रकार GITHUB_TOKEN) को जीवित रखने के लिए 180 सेकंड के लिए सोता है। जब वर्कफ़्लो सो रहा होता है, स्क्रिप्ट OAST लॉग से टोकन निकालती है, उसे डिकोड करती है, और तुरंत PR को अनुमोदित करने के लिए GitHub API को कॉल करती है। PR अंततः github-actions[bot] द्वारा अनुमोदित हो जाता है।
gh (GitHub CLI), प्रमाणित:
gh auth login
gitinteractsh-client (वैकल्पिक लेकिन अनुशंसित)। स्थापित होने पर, स्क्रिप्ट इसे स्वतः स्पॉन करती है और स्क्रिप्ट के भीतर कॉलबैक सत्यापित करती है:
go install github.com/projectdiscovery/interactsh/cmd/interactsh-client@latest
यदि आप अपना स्वयं का OAST एंडपॉइंट (Burp Collaborator, वेब UI के माध्यम से oast.fun, requestbin, आदि) उपयोग करना पसंद करते हैं, तो इसे --oast-url के साथ पास करें और स्वतः-सत्यापन चरण छोड़ दिया जाएगा।स्क्रिप्ट को पहले से फोर्क मौजूद होने की आवश्यकता नहीं है, यह स्वचालित रूप से एक बना लेती है।
--mode harmless (डिफ़ॉल्ट)पेलोड एक स्थिर पुष्टिकरण स्ट्रिंग के साथ एक एकल curl POST है। कोई रहस्य नहीं पढ़ा जाता, कोई API कॉल नहीं किया जाता, एकमात्र दुष्प्रभाव OAST कॉलबैक है। किसी भी क्रेडेंशियल को उजागर किए बिना कमजोरी की पुष्टि करने के लिए इसका उपयोग करें।
--mode exfilपेलोड git config --list (जिसमें http.https://github.com/.extraheader के अंतर्गत base64-एन्कोडेड GITHUB_TOKEN होता है) को OAST पर डंप करता है, फिर 180 सेकंड के लिए सोता है। फिर स्क्रिप्ट:
x-access-token:ghs_XXXXXXXX...।x-access-token: उपसर्ग हटाती है और मानक अनुमोदन पेलोड ({"event":"APPROVE","body":"All checks passed. LGTM!"}) के साथ POST /repos/<fork>/pulls/<n>/reviews कॉल करने के लिए कच्चे टोकन का उपयोग करती है।github-actions[bot] द्वारा अनुमोदित के रूप में दिखाई देता है।एक बार अनुमोदन दर्ज हो जाने के बाद, स्क्रिप्ट वर्कफ़्लो के शेष 180-सेकंड के सोने को छोड़ देती है, क्योंकि हमले की श्रृंखला पूरी हो चुकी है और रनर के टाइम आउट होने की प्रतीक्षा करने से कुछ नहीं जुड़ता।
| फ़्लैग | विवरण |
|---|---|
--fork-owner <user> | आवश्यक। GitHub उपयोगकर्ता नाम जो फोर्क का मालिक है (या होगा) |
--fork-name <name> | फोर्क रिपॉजिटरी नाम (डिफ़ॉल्ट: sherlock) |
--oast-url <url> | कॉलबैक प्राप्त करने वाला OAST एंडपॉइंट। छोड़े जाने पर, स्क्रिप्ट स्वतः interactsh-client स्पॉन करती है और स्क्रिप्ट-में निर्णय चलाती है |
--mode harmless|exfil | पेलोड प्रकार (डिफ़ॉल्ट: harmless) |
--vulnerable | चलाने से पहले फोर्क के master को प्री-फिक्स कमिट (271608fb) पर बलपूर्वक रीसेट करें। --no-sync निहित करता है |
--no-sync | फोर्क को अपस्ट्रीम के साथ सिंक करना छोड़ें (पिन किए गए कमिट का परीक्षण करते समय उपयोगी) |
--base-branch <name> | फोर्क पर PR लक्ष्य ब्रांच (डिफ़ॉल्ट: master) |
--keep-branch | पूरा होने के बाद PoC ब्रांच को न हटाएं |
--no-poll | वर्कफ़्लो रन पोलिंग छोड़ें और PR निर्माण के बाद बाहर निकलें |
डिज़ाइन के अनुसार, PoC PR को उसी फोर्क के master पर फोर्क की एक ब्रांच से खोलता है। यह सीधे sherlock-project/sherlock को लक्षित नहीं करता। इसके दो कारण हैं।