Abusing Github Actions
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
In this page you will find:
A summary of all the impacts of an attacker managing to access a Github Action
Different ways to get access to an action:
Having permissions to create the action
Abusing pull request related triggers
Abusing other external access techniques
Pivoting from an already compromised repo
Finally, a section about post-exploitation techniques to abuse an action from inside (cause the mentioned impacts)
For an introduction about Github Actions check the basic information.
If you can execute arbitrary code in GitHub Actions within a repository, you may be able to:
गुप्त जानकारी चुराना जो पाइपलाइन में माउंट की गई है और पाइपलाइन के विशेषाधिकारों का दुरुपयोग करना ताकि AWS और GCP जैसे बाहरी प्लेटफार्मों तक अनधिकृत पहुंच प्राप्त की जा सके।
डिप्लॉयमेंट्स और अन्य कलाकृतियों को समझौता करना।
यदि पाइपलाइन संपत्तियों को तैनात या संग्रहीत करती है, तो आप अंतिम उत्पाद को बदल सकते हैं, जिससे आपूर्ति श्रृंखला का हमला सक्षम हो सकता है।
कस्टम वर्कर्स में कोड निष्पादित करना ताकि कंप्यूटिंग शक्ति का दुरुपयोग किया जा सके और अन्य सिस्टम में पिवट किया जा सके।
गिटहब कोड को ओवरराइट करना, जो GITHUB_TOKEN
से जुड़े अनुमतियों पर निर्भर करता है।
This "secret" (coming from ${{ secrets.GITHUB_TOKEN }}
and ${{ github.token }}
) is given when the admin enables this option:
This token is the same one a Github Application will use, so it can access the same endpoints: https://docs.github.com/en/rest/overview/endpoints-available-for-github-apps
Github should release a flow that allows cross-repository access within GitHub, so a repo can access other internal repos using the GITHUB_TOKEN
.
You can see the possible permissions of this token in: https://docs.github.com/en/actions/security-guides/automatic-token-authentication#permissions-for-the-github_token
Note that the token expires after the job has completed.
These tokens looks like this: ghs_veaxARUji7EXszBMbhkr4Nz2dYz0sqkeiur7
Some interesting things you can do with this token:
ध्यान दें कि कई अवसरों पर आप Github Actions envs या secrets के अंदर github उपयोगकर्ता टोकन पा सकते हैं। ये टोकन आपको रिपॉजिटरी और संगठन पर अधिक विशेषाधिकार दे सकते हैं।
यह संभव है कि आप अन्य उपयोगकर्ताओं के रिपॉजिटरी में Github Token को दिए गए अनुमतियों की लॉग्स की जांच करके जांच कर सकें:
यह Github क्रियाओं को समझौता करने का सबसे आसान तरीका होगा, क्योंकि यह मामला मानता है कि आपके पास संगठन में एक नया रिपॉजिटरी बनाने का अधिकार है, या आपके पास एक रिपॉजिटरी पर लिखने के अधिकार हैं।
यदि आप इस परिदृश्य में हैं, तो आप बस पोस्ट एक्सप्लोइटेशन तकनीकें देख सकते हैं।
यदि संगठन के सदस्य नए रिपॉजिटरी बना सकते हैं और आप Github क्रियाएँ निष्पादित कर सकते हैं, तो आप एक नया रिपॉजिटरी बना सकते हैं और संगठन स्तर पर सेट किए गए रहस्यों को चुरा सकते हैं।
यदि आप एक रिपॉजिटरी में एक नई शाखा बना सकते हैं जिसमें पहले से एक Github Action कॉन्फ़िगर किया गया है, तो आप इसे संशोधित कर सकते हैं, सामग्री अपलोड कर सकते हैं, और फिर नई शाखा से उस क्रिया को निष्पादित कर सकते हैं। इस तरह आप रिपॉजिटरी और संगठन स्तर के रहस्यों को निकाल सकते हैं (लेकिन आपको यह जानना होगा कि उन्हें क्या कहा जाता है)।
आप संशोधित क्रिया को हाथ से निष्पादित कर सकते हैं, जब PR बनाया जाता है या जब कुछ कोड पुश किया जाता है (इस पर निर्भर करता है कि आप कितने शोर करना चाहते हैं):
विभिन्न ट्रिगर्स हैं जो एक हमलावर को दूसरे रिपॉजिटरी का Github Action निष्पादित करने की अनुमति दे सकते हैं। यदि उन ट्रिगर करने योग्य क्रियाओं को खराब तरीके से कॉन्फ़िगर किया गया है, तो एक हमलावर उन्हें समझौता करने में सक्षम हो सकता है।
pull_request
कार्यप्रवाह ट्रिगर pull_request
हर बार कार्यप्रवाह को निष्पादित करेगा जब एक पुल अनुरोध प्राप्त होता है, कुछ अपवादों के साथ: डिफ़ॉल्ट रूप से यदि यह पहली बार है जब आप सहयोग कर रहे हैं, तो कुछ रखरखावकर्ता को कार्यप्रवाह के निष्पादन को स्वीकृत करने की आवश्यकता होगी:
चूंकि डिफ़ॉल्ट सीमा पहली बार योगदानकर्ताओं के लिए है, आप एक मान्य बग/टाइपो को ठीक करने में योगदान कर सकते हैं और फिर अपने नए pull_request
विशेषाधिकारों का दुरुपयोग करने के लिए अन्य PR भेज सकते हैं।
मैंने इसका परीक्षण किया और यह काम नहीं करता: एक और विकल्प होगा किसी ऐसे व्यक्ति का नाम लेकर एक खाता बनाना जिसने परियोजना में योगदान दिया और उसका खाता हटा दिया।
इसके अलावा, डिफ़ॉल्ट रूप से लिखने की अनुमति और गुप्तों की पहुंच को लक्षित रिपॉजिटरी में रोकता है जैसा कि दस्तावेज़ में उल्लेख किया गया है:
GITHUB_TOKEN
के अपवाद के साथ, गुप्तों को रनर को नहीं सौंपा जाता जब कार्यप्रवाह एक फोर्क किए गए रिपॉजिटरी से ट्रिगर किया जाता है। **GITHUB_TOKEN
में पुल अनुरोधों में पढ़ने की केवल अनुमति होती है फोर्क किए गए रिपॉजिटरी से।
एक हमलावर Github Action की परिभाषा को संशोधित कर सकता है ताकि मनमाने चीजों को निष्पादित किया जा सके और मनमाने कार्यों को जोड़ा जा सके। हालाँकि, वह गुप्तों को चुराने या रिपॉजिटरी को ओवरराइट करने में सक्षम नहीं होगा क्योंकि उल्लेखित सीमाएँ हैं।
हाँ, यदि हमलावर PR में उस github action को बदलता है जो ट्रिगर किया जाएगा, तो उसका Github Action उपयोग किया जाएगा और मूल रिपॉजिटरी का नहीं!
चूंकि हमलावर द्वारा निष्पादित कोड पर भी नियंत्रण होता है, भले ही GITHUB_TOKEN
पर गुप्त या लिखने की अनुमति न हो, एक हमलावर उदाहरण के लिए दुष्ट कलाकृतियाँ अपलोड कर सकता है।
pull_request_target
कार्यप्रवाह ट्रिगर pull_request_target
को लक्षित रिपॉजिटरी में लिखने की अनुमति और गुप्तों तक पहुंच होती है (और अनुमति नहीं मांगता)।
ध्यान दें कि कार्यप्रवाह ट्रिगर pull_request_target
बेस संदर्भ में चलता है और PR द्वारा दिए गए संदर्भ में नहीं (ताकि अविश्वसनीय कोड निष्पादित न हो)। pull_request_target
के बारे में अधिक जानकारी के लिए दस्तावेज़ देखें।
इसके अलावा, इस विशिष्ट खतरनाक उपयोग के बारे में अधिक जानकारी के लिए इस गिटहब ब्लॉग पोस्ट की जांच करें।
यह लग सकता है कि चूंकि निष्पादित कार्यप्रवाह वह है जो बेस में परिभाषित है और PR में नहीं है, इसलिए pull_request_target
का उपयोग करना सुरक्षित है, लेकिन कुछ केस हैं जहाँ यह नहीं है।
और यह एक गुप्तों तक पहुंच होगी।
workflow_run
workflow_run ट्रिगर एक कार्यप्रवाह को एक अलग कार्यप्रवाह से चलाने की अनुमति देता है जब यह पूर्ण
, अनुरोधित
या प्रगति में
हो।
इस उदाहरण में, एक कार्यप्रवाह को अलग "परीक्षण चलाएँ" कार्यप्रवाह के पूरा होने के बाद चलाने के लिए कॉन्फ़िगर किया गया है:
Moreover, according to the docs: The workflow started by the workflow_run
event is able to access secrets and write tokens, even if the previous workflow was not.
इस प्रकार का वर्कफ़्लो हमला किया जा सकता है यदि यह एक वर्कफ़्लो पर निर्भर है जिसे एक बाहरी उपयोगकर्ता द्वारा pull_request
या pull_request_target
के माध्यम से प्रेरित किया जा सकता है। कुछ कमजोर उदाहरण इस ब्लॉग में पाया जा सकता है. पहला उदाहरण workflow_run
द्वारा प्रेरित वर्कफ़्लो है जो हमलावर के कोड को डाउनलोड करता है: ${{ github.event.pull_request.head.sha }}
दूसरा उदाहरण workflow_run
वर्कफ़्लो में अविश्वसनीय कोड से एक कलाकृति को पास करने और इस कलाकृति की सामग्री का उपयोग करने पर आधारित है, जिससे यह RCE के लिए कमजोर हो जाता है।
workflow_call
TODO
TODO: जांचें कि जब इसे pull_request से निष्पादित किया जाता है तो उपयोग किया गया/डाउनलोड किया गया कोड मूल से है या फोर्क किए गए PR से
हमने सभी तरीकों का उल्लेख किया है जिनसे एक बाहरी हमलावर एक गिटहब वर्कफ़्लो को निष्पादित करने में सक्षम हो सकता है, अब आइए देखें कि यदि ये निष्पादन, यदि गलत तरीके से कॉन्फ़िगर किए गए हैं, तो कैसे दुरुपयोग किया जा सकता है:
pull_request
के मामले में, वर्कफ़्लो PR के संदर्भ में निष्पादित होगा (इसलिए यह दुष्ट PR के कोड को निष्पादित करेगा), लेकिन किसी को इसे पहले अधिकृत करना होगा और यह कुछ सीमाओं के साथ चलेगा।
यदि एक वर्कफ़्लो pull_request_target
या workflow_run
का उपयोग कर रहा है जो एक वर्कफ़्लो पर निर्भर है जिसे pull_request_target
या pull_request
से प्रेरित किया जा सकता है, तो मूल रेपो का कोड निष्पादित होगा, इसलिए हमलावर निष्पादित कोड को नियंत्रित नहीं कर सकता।
हालांकि, यदि एक्शन में एक स्पष्ट PR चेकआउट है जो PR से कोड प्राप्त करेगा (और आधार से नहीं), तो यह हमलावर द्वारा नियंत्रित कोड का उपयोग करेगा। उदाहरण के लिए (लाइन 12 देखें जहां PR कोड डाउनलोड किया गया है):
संभावित रूप से अविश्वसनीय कोड npm install
या npm build
के दौरान चलाया जा रहा है क्योंकि निर्माण स्क्रिप्ट और संदर्भित पैकेज PR के लेखक द्वारा नियंत्रित हैं।
कमजोर कार्यों की खोज के लिए एक गिटहब डॉर्क है: event.pull_request pull_request_target extension:yml
हालाँकि, भले ही एक्शन को असुरक्षित रूप से कॉन्फ़िगर किया गया हो, फिर भी कार्यों को सुरक्षित रूप से निष्पादित करने के लिए विभिन्न तरीके हैं (जैसे कि यह देखने के लिए कि PR उत्पन्न करने वाला अभिनेता कौन है)।
ध्यान दें कि कुछ गिटहब संदर्भ हैं जिनके मान उपयोगकर्ता द्वारा नियंत्रित होते हैं जो PR बना रहा है। यदि गिटहब एक्शन उस डेटा का उपयोग करके कुछ निष्पादित कर रहा है, तो यह मनमाने कोड निष्पादन की ओर ले जा सकता है:
Gh Actions - Context Script Injectionsदस्तावेज़ों के अनुसार: आप किसी वर्कफ़्लो कार्य में किसी भी बाद के चरणों के लिए एक पर्यावरण चर उपलब्ध करा सकते हैं, इसे परिभाषित या अपडेट करके और इसे GITHUB_ENV
पर्यावरण फ़ाइल में लिखकर।
यदि एक हमलावर इस env चर के अंदर कोई भी मान इंजेक्ट कर सकता है, तो वह ऐसे env चर इंजेक्ट कर सकता है जो अगले चरणों में कोड निष्पादित कर सकते हैं जैसे LD_PRELOAD या NODE_OPTIONS।
उदाहरण के लिए (यह और यह), कल्पना करें कि एक वर्कफ़्लो एक अपलोड की गई कलाकृति पर भरोसा कर रहा है ताकि इसकी सामग्री को GITHUB_ENV
env चर के अंदर संग्रहीत किया जा सके। एक हमलावर इसे समझौता करने के लिए कुछ इस तरह अपलोड कर सकता है:
जैसा कि इस ब्लॉग पोस्ट में उल्लेख किया गया है, यह गिटहब एक्शन विभिन्न वर्कफ़्लो और यहां तक कि रिपॉजिटरी से कलाकृतियों तक पहुंच की अनुमति देता है।
समस्या यह है कि यदि path
पैरामीटर सेट नहीं किया गया है, तो कलाकृति वर्तमान निर्देशिका में निकाली जाती है और यह उन फ़ाइलों को ओवरराइट कर सकती है जो बाद में वर्कफ़्लो में उपयोग की जा सकती हैं या यहां तक कि निष्पादित की जा सकती हैं। इसलिए, यदि कलाकृति कमजोर है, तो एक हमलावर इसका दुरुपयोग करके अन्य वर्कफ़्लो को समझौता कर सकता है जो कलाकृति पर भरोसा करते हैं।
कमजोर वर्कफ़्लो का उदाहरण:
यह इस वर्कफ़्लो के साथ हमला किया जा सकता है:
यदि एक खाता अपना नाम बदलता है, तो कुछ समय बाद कोई अन्य उपयोगकर्ता उस नाम के साथ एक खाता पंजीकृत कर सकता है। यदि एक रिपॉजिटरी के पास नाम बदलने से पहले 100 से कम सितारे थे, तो Github नए पंजीकृत उपयोगकर्ता को उसी नाम के साथ एक रिपॉजिटरी बनाने की अनुमति देगा जो हटाई गई थी।
तो यदि एक क्रिया एक गैर-मौजूद खाते से एक रिपॉजिटरी का उपयोग कर रही है, तो यह संभव है कि एक हमलावर उस खाते को बना सके और क्रिया को समझौता कर सके।
यदि अन्य रिपॉजिटरी इस उपयोगकर्ता के रिपॉजिटरी से निर्भरताएँ का उपयोग कर रही हैं, तो एक हमलावर उन्हें हाइजैक कर सकेगा। यहाँ आपके पास एक अधिक पूर्ण व्याख्या है: https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/
इस अनुभाग में हम उन तकनीकों के बारे में बात करेंगे जो एक रिपॉजिटरी से दूसरी रिपॉजिटरी में पिवट करने की अनुमति देंगी, मानते हुए कि हमारे पास पहले वाले पर कुछ प्रकार की पहुँच है (पिछले अनुभाग को देखें)।
एक कैश समान शाखा में वर्कफ़्लो रन के बीच बनाए रखा जाता है। जिसका अर्थ है कि यदि एक हमलावर एक पैकेज को समझौता करता है जो फिर कैश में संग्रहीत होता है और डाउनलोड और अधिक विशेषाधिकार प्राप्त वर्कफ़्लो द्वारा निष्पादित होता है, तो वह उस वर्कफ़्लो को भी समझौता कर सकेगा।
GH Actions - Cache Poisoningवर्कफ़्लो अन्य वर्कफ़्लो और यहां तक कि रिपॉजिटरी से आर्टिफैक्ट्स का उपयोग कर सकते हैं, यदि एक हमलावर उस Github Action को समझौता करने में सफल होता है जो एक आर्टिफैक्ट अपलोड करता है जो बाद में किसी अन्य वर्कफ़्लो द्वारा उपयोग किया जाता है, तो वह अन्य वर्कफ़्लो को समझौता कर सकता है:
Gh Actions - Artifact Poisoningनिम्नलिखित पृष्ठों की जाँच करें:
AWS - Federation AbuseGCP - Federation Abuseयदि आप एक स्क्रिप्ट में सामग्री इंजेक्ट कर रहे हैं, तो यह जानना दिलचस्प है कि आप रहस्यों तक कैसे पहुँच सकते हैं:
यदि रहस्य या टोकन को पर्यावरण चर पर सेट किया गया है, तो इसे printenv
का उपयोग करके सीधे पर्यावरण के माध्यम से एक्सेस किया जा सकता है।
यदि गुप्त को एक्सप्रेशन में सीधे उपयोग किया जाता है, तो उत्पन्न शेल स्क्रिप्ट ऑन-डिस्क संग्रहीत होती है और सुलभ होती है।
cat /home/runner/work/_temp/*
एक कस्टम क्रिया के लिए, जोखिम इस पर निर्भर कर सकता है कि एक प्रोग्राम ने आर्गुमेंट से प्राप्त गुप्त का उपयोग कैसे किया है:
यह पता लगाने का तरीका कि कौन सी Github Actions गैर-github अवसंरचना में निष्पादित हो रही हैं वह है कि Github Action कॉन्फ़िगरेशन yaml में runs-on: self-hosted
के लिए खोजें।
स्व-होस्टेड रनर्स को अतिरिक्त संवेदनशील जानकारी तक पहुंच हो सकती है, अन्य नेटवर्क सिस्टम (नेटवर्क में कमजोर एंडपॉइंट? मेटाडेटा सेवा?) या, भले ही यह अलग-थलग और नष्ट हो जाए, एक से अधिक क्रियाएं एक ही समय में चलाई जा सकती हैं और दुर्भावनापूर्ण एक दूसरे के गुप्त चुराने में सक्षम हो सकता है।
स्व-होस्टेड रनर्स में यह भी संभव है कि _Runner.Listener_** प्रक्रिया** से गुप्त प्राप्त करें जो किसी भी चरण में कार्यप्रवाह के सभी गुप्त को अपनी मेमोरी को डंप करके रखेगा:
Check इस पोस्ट में अधिक जानकारी के लिए।
यह संभव है कि Github actions बनाई जाएं जो Github के अंदर एक Docker छवि बनाएँ और संग्रहीत करें। एक उदाहरण निम्नलिखित विस्तारणीय में पाया जा सकता है:
AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE) GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)