From 4349a756d36ac1fda28de37141b4770f325cc408 Mon Sep 17 00:00:00 2001 From: Translator Date: Wed, 25 Jun 2025 00:23:33 +0000 Subject: [PATCH] Translated ['src/pentesting-ci-cd/github-security/abusing-github-actions --- src/images/CH_logo_ads.png | Bin 0 -> 27107 bytes .../abusing-github-actions/README.md | 197 +++++++++++------- 2 files changed, 119 insertions(+), 78 deletions(-) create mode 100644 src/images/CH_logo_ads.png diff --git a/src/images/CH_logo_ads.png b/src/images/CH_logo_ads.png new file mode 100644 index 0000000000000000000000000000000000000000..b407c8929d67e14a8e254ad9bc76ac1e9f8525f7 GIT binary patch literal 27107 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
यह टोकन वही है जो एक **Github एप्लिकेशन उपयोग करेगा**, इसलिए यह समान एंडपॉइंट्स तक पहुँच सकता है: [https://docs.github.com/en/rest/overview/endpoints-available-for-github-apps](https://docs.github.com/en/rest/overview/endpoints-available-for-github-apps) > [!WARNING] -> Github को एक [**फ्लो**](https://github.com/github/roadmap/issues/74) जारी करना चाहिए जो **GitHub के भीतर क्रॉस-रिपॉजिटरी** पहुँच की अनुमति देता है, ताकि एक रिपॉजिटरी अन्य आंतरिक रिपॉजिटरी तक पहुँच सके `GITHUB_TOKEN` का उपयोग करके। +> Github को एक [**फ्लो**](https://github.com/github/roadmap/issues/74) जारी करना चाहिए जो **क्रॉस-रेपो** पहुँच की अनुमति देता है, ताकि एक रेपो अन्य आंतरिक रेपोज़ तक पहुँच सके `GITHUB_TOKEN` का उपयोग करके। आप इस टोकन की संभावित **अनुमतियों** को देख सकते हैं: [https://docs.github.com/en/actions/security-guides/automatic-token-authentication#permissions-for-the-github_token](https://docs.github.com/en/actions/security-guides/automatic-token-authentication#permissions-for-the-github_token) @@ -81,11 +91,11 @@ https://api.github.com/repos///pulls \ {{#endtabs }} > [!CAUTION] -> ध्यान दें कि कई अवसरों पर आप **Github Actions envs या secrets के अंदर github user tokens पा सकते हैं**। ये tokens आपको repository और organization पर अधिक अधिकार दे सकते हैं। +> ध्यान दें कि कई अवसरों पर आप **Github Actions envs या secrets के अंदर github उपयोगकर्ता टोकन पा सकते हैं**। ये टोकन आपको रिपॉजिटरी और संगठन पर अधिक विशेषाधिकार दे सकते हैं।
-Github Action output में secrets की सूची +Github Action आउटपुट में secrets की सूची ```yaml name: list_env on: @@ -134,26 +144,26 @@ secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}} ```
-यह संभव है कि आप अन्य उपयोगकर्ताओं के रिपॉजिटरी में Github Token को दिए गए अनुमतियों की **लॉग्स** की जांच करके जांच कर सकें: +यह संभव है कि आप अन्य उपयोगकर्ताओं के रिपॉजिटरी में Github Token को दिए गए अनुमतियों की जांच करें **एक्शन के लॉग** की जांच करके:
## अनुमत निष्पादन > [!NOTE] -> यह Github क्रियाओं को समझौता करने का सबसे आसान तरीका होगा, क्योंकि इस मामले में यह मान लिया गया है कि आपके पास **संगठन में एक नया रिपॉजिटरी बनाने का अधिकार** है, या आपके पास **एक रिपॉजिटरी पर लिखने के अधिकार** हैं। +> यह Github एक्शन को समझौता करने का सबसे आसान तरीका होगा, क्योंकि इस मामले में यह मान लिया गया है कि आपके पास **संगठन में एक नया रिपॉजिटरी बनाने का अधिकार** है, या आपके पास **एक रिपॉजिटरी पर लिखने के अधिकार** हैं। > > यदि आप इस परिदृश्य में हैं, तो आप बस [Post Exploitation techniques](#post-exploitation-techniques-from-inside-an-action) की जांच कर सकते हैं। ### रिपॉजिटरी निर्माण से निष्पादन -यदि संगठन के सदस्य **नए रिपॉजिटरी बना सकते हैं** और आप Github क्रियाएँ निष्पादित कर सकते हैं, तो आप **एक नया रिपॉजिटरी बना सकते हैं और संगठन स्तर पर सेट किए गए रहस्यों को चुरा सकते हैं**। +यदि संगठन के सदस्य **नए रिपॉजिटरी बना सकते हैं** और आप github एक्शन निष्पादित कर सकते हैं, तो आप **एक नया रिपॉजिटरी बना सकते हैं और संगठन स्तर पर सेट किए गए रहस्यों को चुरा सकते हैं**। ### नए शाखा से निष्पादन -यदि आप **एक रिपॉजिटरी में एक नई शाखा बना सकते हैं जिसमें पहले से एक Github Action** कॉन्फ़िगर किया गया है, तो आप इसे **संशोधित** कर सकते हैं, **सामग्री अपलोड** कर सकते हैं, और फिर **नई शाखा से उस क्रिया को निष्पादित** कर सकते हैं। इस तरह आप **रिपॉजिटरी और संगठन स्तर के रहस्यों को निकाल सकते हैं** (लेकिन आपको यह जानना होगा कि उन्हें क्या कहा जाता है)। +यदि आप **एक रिपॉजिटरी में एक नई शाखा बना सकते हैं जिसमें पहले से एक Github Action** कॉन्फ़िगर किया गया है, तो आप इसे **संशोधित** कर सकते हैं, **सामग्री अपलोड** कर सकते हैं, और फिर **नई शाखा से उस एक्शन को निष्पादित** कर सकते हैं। इस तरह आप **रिपॉजिटरी और संगठन स्तर के रहस्यों को निकाल सकते हैं** (लेकिन आपको यह जानना होगा कि उन्हें क्या कहा जाता है)। -आप संशोधित क्रिया को **हाथ से** निष्पादित कर सकते हैं, जब **PR बनाया जाता है** या जब **कुछ कोड पुश किया जाता है** (इस पर निर्भर करता है कि आप कितने शोर करना चाहते हैं): +आप संशोधित एक्शन को **हाथ से** निष्पादित कर सकते हैं, जब **PR बनाया जाता है** या जब **कुछ कोड पुश किया जाता है** (इस पर निर्भर करता है कि आप कितने शोर करना चाहते हैं): ```yaml on: workflow_dispatch: # Launch manually @@ -170,24 +180,24 @@ branches: ## Forked Execution > [!NOTE] -> विभिन्न ट्रिगर्स हैं जो एक हमलावर को **दूसरे रिपॉजिटरी का Github Action निष्पादित करने** की अनुमति दे सकते हैं। यदि उन ट्रिगर करने योग्य क्रियाओं को खराब तरीके से कॉन्फ़िगर किया गया है, तो एक हमलावर उन्हें समझौता कर सकता है। +> विभिन्न ट्रिगर्स हैं जो एक हमलावर को **दूसरे रिपॉजिटरी के Github Action को निष्पादित** करने की अनुमति दे सकते हैं। यदि उन ट्रिगर करने योग्य क्रियाओं को खराब तरीके से कॉन्फ़िगर किया गया है, तो एक हमलावर उन्हें समझौता करने में सक्षम हो सकता है। ### `pull_request` -कार्यप्रवाह ट्रिगर **`pull_request`** हर बार कार्यप्रवाह को निष्पादित करेगा जब एक पुल अनुरोध प्राप्त होता है, कुछ अपवादों के साथ: डिफ़ॉल्ट रूप से यदि यह **पहली बार** है जब आप **सहयोग कर रहे हैं**, तो कुछ **रखरखावकर्ता** को कार्यप्रवाह के **चलाने** को **स्वीकृत** करने की आवश्यकता होगी: +कार्यप्रवाह ट्रिगर **`pull_request`** हर बार कार्यप्रवाह को निष्पादित करेगा जब एक पुल अनुरोध प्राप्त होता है, कुछ अपवादों के साथ: डिफ़ॉल्ट रूप से यदि यह **पहली बार** है जब आप **सहयोग कर रहे हैं**, तो कुछ **रखरखावकर्ता** को कार्यप्रवाह के **निष्पादन** को **स्वीकृत** करने की आवश्यकता होगी:
> [!NOTE] -> चूंकि **डिफ़ॉल्ट सीमा** **पहली बार** योगदानकर्ताओं के लिए है, आप **एक मान्य बग/टाइपो को ठीक करके** योगदान कर सकते हैं और फिर **अपने नए `pull_request` विशेषाधिकारों का दुरुपयोग करने के लिए अन्य PR भेज सकते हैं**। +> चूंकि **डिफ़ॉल्ट सीमा** **पहली बार** योगदानकर्ताओं के लिए है, आप **एक वैध बग/टाइपो को ठीक करने** में योगदान कर सकते हैं और फिर **अपने नए `pull_request` विशेषाधिकारों का दुरुपयोग करने के लिए अन्य PR भेज सकते हैं**। > > **मैंने इसका परीक्षण किया और यह काम नहीं करता**: ~~एक और विकल्प होगा किसी ऐसे व्यक्ति का नाम लेकर एक खाता बनाना जिसने परियोजना में योगदान दिया और उसका खाता हटा दिया।~~ इसके अलावा, डिफ़ॉल्ट रूप से **लिखने की अनुमति** और **गुप्त पहुंच** को लक्षित रिपॉजिटरी में रोकता है जैसा कि [**docs**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflows-in-forked-repositories) में उल्लेख किया गया है: -> `GITHUB_TOKEN` को छोड़कर, **गुप्त को रनर को नहीं भेजा जाता** जब कार्यप्रवाह एक **फोर्क किए गए** रिपॉजिटरी से ट्रिगर किया जाता है। **`GITHUB_TOKEN` में पुल अनुरोधों में **पढ़ने की केवल अनुमति** होती है **फोर्क किए गए रिपॉजिटरी** से। +> `GITHUB_TOKEN` को छोड़कर, **गुप्त को रनर को नहीं भेजा जाता** जब एक कार्यप्रवाह **फोर्क की गई** रिपॉजिटरी से ट्रिगर किया जाता है। **`GITHUB_TOKEN` में पुल अनुरोधों में **पढ़ने की केवल अनुमति** होती है **फोर्क की गई रिपॉजिटरी** से। -एक हमलावर Github Action की परिभाषा को संशोधित कर सकता है ताकि मनमाने कार्यों को निष्पादित किया जा सके और मनमाने कार्यों को जोड़ा जा सके। हालाँकि, वह गुप्त चुराने या रिपॉजिटरी को ओवरराइट करने में असमर्थ होगा क्योंकि उल्लेखित सीमाएँ हैं। +एक हमलावर Github Action की परिभाषा को संशोधित कर सकता है ताकि मनमाने कार्यों को निष्पादित किया जा सके और मनमाने कार्यों को जोड़ा जा सके। हालाँकि, वह गुप्त चुराने या रिपॉजिटरी को ओवरराइट करने में सक्षम नहीं होगा क्योंकि उल्लेखित सीमाएँ हैं। > [!CAUTION] > **हाँ, यदि हमलावर PR में उस github action को बदलता है जो ट्रिगर किया जाएगा, तो उसका Github Action उपयोग किया जाएगा और मूल रिपॉजिटरी का नहीं!** @@ -198,10 +208,10 @@ branches: कार्यप्रवाह ट्रिगर **`pull_request_target`** को लक्षित रिपॉजिटरी में **लिखने की अनुमति** और **गुप्तों तक पहुंच** होती है (और अनुमति नहीं मांगता)। -ध्यान दें कि कार्यप्रवाह ट्रिगर **`pull_request_target`** **बेस संदर्भ में चलता है** और PR द्वारा दिए गए संदर्भ में नहीं (ताकि **अविश्वसनीय कोड निष्पादित न हो**)। `pull_request_target` के बारे में अधिक जानकारी के लिए [**docs**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_target) देखें।\ +ध्यान दें कि कार्यप्रवाह ट्रिगर **`pull_request_target`** **बेस संदर्भ में चलता है** और PR द्वारा दिए गए संदर्भ में नहीं (ताकि **अविश्वसनीय कोड को निष्पादित न किया जा सके**)। `pull_request_target` के बारे में अधिक जानकारी के लिए [**docs**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_target) देखें।\ इसके अलावा, इस विशिष्ट खतरनाक उपयोग के बारे में अधिक जानकारी के लिए इस [**github ब्लॉग पोस्ट**](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/) की जांच करें। -यह लग सकता है कि चूंकि **निष्पादित कार्यप्रवाह** वह है जो **बेस** में परिभाषित है और **PR** में नहीं है, इसलिए **`pull_request_target`** का उपयोग करना **सुरक्षित** है, लेकिन कुछ **केस हैं जहाँ यह नहीं है**। +यह लग सकता है कि चूंकि **निष्पादित कार्यप्रवाह** वह है जो **बेस** में परिभाषित है और **PR में नहीं** है, इसलिए **`pull_request_target`** का उपयोग करना **सुरक्षित** है, लेकिन कुछ **मामले हैं जहाँ यह नहीं है**। और यह एक **गुप्तों तक पहुंच** होगी। @@ -209,7 +219,7 @@ branches: [**workflow_run**](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflow_run) ट्रिगर एक कार्यप्रवाह को एक अलग कार्यप्रवाह से चलाने की अनुमति देता है जब यह `पूर्ण`, `अनुरोधित` या `प्रगति में` हो। -इस उदाहरण में, एक कार्यप्रवाह को अलग "Run Tests" कार्यप्रवाह के पूरा होने के बाद चलाने के लिए कॉन्फ़िगर किया गया है: +इस उदाहरण में, एक कार्यप्रवाह को "Run Tests" कार्यप्रवाह के पूरा होने के बाद चलाने के लिए कॉन्फ़िगर किया गया है: ```yaml on: workflow_run: @@ -217,29 +227,29 @@ workflows: [Run Tests] types: - completed ``` -इसके अलावा, दस्तावेज़ों के अनुसार: `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`** के माध्यम से **प्रेरित** किया जा सकता है। कुछ कमजोर उदाहरण [**इस ब्लॉग में**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability)**।** पहला उदाहरण **`workflow_run`** द्वारा प्रेरित वर्कफ़्लो है जो हमलावर के कोड को डाउनलोड करता है: `${{ github.event.pull_request.head.sha }}`\ -दूसरा उदाहरण **`workflow_run`** वर्कफ़्लो में **अविश्वसनीय** कोड से एक **कलाकृति** **पास** करने और इस कलाकृति की सामग्री का उपयोग करने पर आधारित है, जिससे यह **RCE के लिए कमजोर** हो जाता है। +This kind of workflow could be attacked if it's **depending** on a **workflow** that can be **triggered** by an external user via **`pull_request`** or **`pull_request_target`**. A couple of vulnerable examples can be [**found this blog**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability)**.** The first one consist on the **`workflow_run`** triggered workflow downloading out the attackers code: `${{ github.event.pull_request.head.sha }}`\ +The second one consist on **passing** an **artifact** from the **untrusted** code to the **`workflow_run`** workflow and using the content of this artifact in a way that makes it **vulnerable to RCE**. ### `workflow_call` TODO -TODO: जांचें कि क्या `pull_request` से निष्पादित होने पर उपयोग किया गया/डाउनलोड किया गया कोड मूल से है या फोर्क किए गए PR से +TODO: Check if when executed from a pull_request the used/downloaded code if the one from the origin or from the forked PR -## फोर्क किए गए निष्पादन का दुरुपयोग +## Abusing Forked Execution -हमने सभी तरीकों का उल्लेख किया है जिनसे एक बाहरी हमलावर एक गिटहब वर्कफ़्लो को निष्पादित करने में सक्षम हो सकता है, अब आइए देखें कि यदि ये निष्पादन, यदि गलत तरीके से कॉन्फ़िगर किए गए हैं, तो कैसे दुरुपयोग किया जा सकता है: +We have mentioned all the ways an external attacker could manage to make a github workflow to execute, now let's take a look about how this executions, if bad configured, could be abused: -### अविश्वसनीय चेकआउट निष्पादन +### Untrusted checkout execution -**`pull_request`** के मामले में, वर्कफ़्लो **PR के संदर्भ में** निष्पादित होगा (इसलिए यह **दुष्ट PRs कोड** को निष्पादित करेगा), लेकिन किसी को इसे **पहले अधिकृत** करना होगा और यह कुछ [सीमाओं](#pull_request) के साथ चलेगा। +In the case of **`pull_request`,** the workflow is going to be executed in the **context of the PR** (so it'll execute the **malicious PRs code**), but someone needs to **authorize it first** and it will run with some [limitations](#pull_request). -यदि एक वर्कफ़्लो **`pull_request_target` या `workflow_run`** का उपयोग करता है जो एक वर्कफ़्लो पर निर्भर करता है जिसे **`pull_request_target` या `pull_request`** से प्रेरित किया जा सकता है, तो मूल रेपो का कोड निष्पादित होगा, इसलिए **हमलावर निष्पादित कोड को नियंत्रित नहीं कर सकता**। +In case of a workflow using **`pull_request_target` or `workflow_run`** that depends on a workflow that can be triggered from **`pull_request_target` or `pull_request`** the code from the original repo will be executed, so the **attacker cannot control the executed code**. > [!CAUTION] -> हालाँकि, यदि **क्रिया** में एक **स्पष्ट PR चेकआउट** है जो **PR से कोड प्राप्त करेगा** (और आधार से नहीं), तो यह हमलावर द्वारा नियंत्रित कोड का उपयोग करेगा। उदाहरण के लिए (लाइन 12 देखें जहां PR कोड डाउनलोड किया गया है): +> However, if the **action** has an **explicit PR checkout** that will **get the code from the PR** (and not from base), it will use the attackers controlled code. For example (check line 12 where the PR code is downloaded):
# INSECURE. Provided as an example only.
 on:
@@ -269,38 +279,78 @@ message: |
 Thank you!
 
-संभावित रूप से **अविश्वसनीय कोड `npm install` या `npm build` के दौरान चलाया जा रहा है** क्योंकि निर्माण स्क्रिप्ट और संदर्भित **पैकेज PR के लेखक द्वारा नियंत्रित हैं**। +The potentially **untrusted code is being run during `npm install` or `npm build`** as the build scripts and referenced **packages are controlled by the author of the PR**. > [!WARNING] -> कमजोर क्रियाओं की खोज के लिए एक गिटहब डॉर्क है: `event.pull_request pull_request_target extension:yml` हालाँकि, भले ही क्रिया को असुरक्षित रूप से कॉन्फ़िगर किया गया हो, फिर भी कार्यों को सुरक्षित रूप से निष्पादित करने के लिए विभिन्न तरीके हैं (जैसे कि यह देखने के लिए कि PR उत्पन्न करने वाला अभिनेता कौन है)। +> A github dork to search for vulnerable actions is: `event.pull_request pull_request_target extension:yml` however, there are different ways to configure the jobs to be executed securely even if the action is configured insecurely (like using conditionals about who is the actor generating the PR). -### संदर्भ स्क्रिप्ट इंजेक्शन +### Context Script Injections -ध्यान दें कि कुछ [**गिटहब संदर्भ**](https://docs.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions#github-context) हैं जिनके मान **उपयोगकर्ता** द्वारा नियंत्रित होते हैं जो PR बना रहा है। यदि गिटहब क्रिया उस **डेटा का उपयोग करके कुछ निष्पादित कर रही है**, तो यह **मनमाने कोड निष्पादन** की ओर ले जा सकता है: +Note that there are certain [**github contexts**](https://docs.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions#github-context) whose values are **controlled** by the **user** creating the PR. If the github action is using that **data to execute anything**, it could lead to **arbitrary code execution:** {{#ref}} gh-actions-context-script-injections.md {{#endref}} -### **GITHUB_ENV स्क्रिप्ट इंजेक्शन** +### **GITHUB_ENV Script Injection** -दस्तावेज़ों से: आप किसी वर्कफ़्लो नौकरी में किसी भी बाद के चरणों के लिए एक **पर्यावरण चर उपलब्ध** करा सकते हैं, इसे परिभाषित या अपडेट करके और इसे **`GITHUB_ENV`** पर्यावरण फ़ाइल में लिखकर। +From the docs: You can make an **environment variable available to any subsequent steps** in a workflow job by defining or updating the environment variable and writing this to the **`GITHUB_ENV`** environment file. -यदि एक हमलावर इस **env** चर के अंदर **कोई भी मान** **इंजेक्ट** कर सकता है, तो वह ऐसे env चर इंजेक्ट कर सकता है जो अगले चरणों में कोड निष्पादित कर सकते हैं जैसे **LD_PRELOAD** या **NODE_OPTIONS**। +If an attacker could **inject any value** inside this **env** variable, he could inject env variables that could execute code in following steps such as **LD_PRELOAD** or **NODE_OPTIONS**. -उदाहरण के लिए ([**यह**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability-0) और [**यह**](https://www.legitsecurity.com/blog/-how-we-found-another-github-action-environment-injection-vulnerability-in-a-google-project)), कल्पना करें कि एक वर्कफ़्लो एक अपलोड की गई कलाकृति पर भरोसा कर रहा है ताकि इसकी सामग्री **`GITHUB_ENV`** env चर के अंदर संग्रहीत की जा सके। एक हमलावर इसे समझौता करने के लिए कुछ इस तरह अपलोड कर सकता है: +For example ([**this**](https://www.legitsecurity.com/blog/github-privilege-escalation-vulnerability-0) and [**this**](https://www.legitsecurity.com/blog/-how-we-found-another-github-action-environment-injection-vulnerability-in-a-google-project)), imagine a workflow that is trusting an uploaded artifact to store its content inside **`GITHUB_ENV`** env variable. An attacker could upload something like this to compromise it:
-### कमजोर तृतीय पक्ष गिटहब क्रियाएँ +### Dependabot and other trusted bots + +As indicated in [**this blog post**](https://boostsecurity.io/blog/weaponizing-dependabot-pwn-request-at-its-finest), several organizations have a Github Action that merges any PRR from `dependabot[bot]` like in: +```yaml +on: pull_request_target +jobs: +auto-merge: +runs-on: ubuntu-latest +if: ${ { github.actor == 'dependabot[bot]' }} +steps: +- run: gh pr merge $ -d -m +``` +यह एक समस्या है क्योंकि `github.actor` फ़ील्ड उस उपयोगकर्ता को दर्शाती है जिसने वर्कफ़्लो को ट्रिगर करने वाली नवीनतम घटना का कारण बना। और `dependabot[bot]` उपयोगकर्ता को PR को संशोधित करने के कई तरीके हैं। उदाहरण के लिए: + +- पीड़ित रिपॉजिटरी को फोर्क करें +- अपनी कॉपी में दुर्भावनापूर्ण पेलोड जोड़ें +- अपने फोर्क पर एक पुरानी निर्भरता जोड़कर Dependabot को सक्षम करें। Dependabot एक शाखा बनाएगा जो दुर्भावनापूर्ण कोड के साथ निर्भरता को ठीक करेगा। +- उस शाखा से पीड़ित रिपॉजिटरी के लिए एक पुल अनुरोध खोलें (PR उपयोगकर्ता द्वारा बनाया जाएगा इसलिए अभी कुछ नहीं होगा) +- फिर, हमलावर अपने फोर्क में Dependabot द्वारा खोले गए प्रारंभिक PR पर वापस जाता है और `@dependabot recreate` चलाता है +- फिर, Dependabot उस शाखा में कुछ क्रियाएँ करता है, जिसने पीड़ित रिपॉजिटरी पर PR को संशोधित किया, जिससे `dependabot[bot]` नवीनतम घटना का अभिनेता बन जाता है जिसने वर्कफ़्लो को ट्रिगर किया (और इसलिए, वर्कफ़्लो चलता है)। + +आगे बढ़ते हैं, अगर Github Action के बजाय एक कमांड इंजेक्शन होता जैसे: +```yaml +on: pull_request_target +jobs: +just-printing-stuff: +runs-on: ubuntu-latest +if: ${ { github.actor == 'dependabot[bot]' }} +steps: +- run: echo ${ { github.event.pull_request.head.ref }} +``` +अच्छा, मूल ब्लॉगपोस्ट इस व्यवहार का दुरुपयोग करने के लिए दो विकल्प प्रस्तुत करता है, जिसमें दूसरा है: + +- पीड़ित रिपॉजिटरी को फोर्क करें और कुछ पुराने निर्भरता के साथ Dependabot को सक्षम करें। +- दुर्भावनापूर्ण शेल इंजेक्शन कोड के साथ एक नई शाखा बनाएं। +- उस शाखा को रिपॉजिटरी की डिफ़ॉल्ट शाखा के रूप में बदलें। +- इस शाखा से पीड़ित रिपॉजिटरी के लिए एक PR बनाएं। +- PR में `@dependabot merge` चलाएं जिसे Dependabot ने अपने फोर्क में खोला था। +- Dependabot आपके फोर्क की डिफ़ॉल्ट शाखा में अपने परिवर्तनों को मर्ज करेगा, पीड़ित रिपॉजिटरी में PR को अपडेट करेगा और अब `dependabot[bot]` को कार्यप्रवाह को ट्रिगर करने वाले नवीनतम घटना का अभिनेता बना देगा और एक दुर्भावनापूर्ण शाखा नाम का उपयोग करेगा। + +### कमजोर तृतीय पक्ष Github क्रियाएँ #### [dawidd6/action-download-artifact](https://github.com/dawidd6/action-download-artifact) -जैसा कि [**इस ब्लॉग पोस्ट**](https://www.legitsecurity.com/blog/github-actions-that-open-the-door-to-cicd-pipeline-attacks) में उल्लेख किया गया है, यह गिटहब क्रिया विभिन्न वर्कफ़्लो और यहां तक कि रिपॉजिटरी से कलाकृतियों तक पहुँचने की अनुमति देती है। +जैसा कि [**इस ब्लॉग पोस्ट**](https://www.legitsecurity.com/blog/github-actions-that-open-the-door-to-cicd-pipeline-attacks) में उल्लेख किया गया है, यह Github क्रिया विभिन्न कार्यप्रवाहों और यहां तक कि रिपॉजिटरी से कलाकृतियों तक पहुंचने की अनुमति देती है। -समस्या यह है कि यदि **`path`** पैरामीटर सेट नहीं किया गया है, तो कलाकृति वर्तमान निर्देशिका में निकाली जाती है और यह उन फ़ाइलों को ओवरराइट कर सकती है जो बाद में वर्कफ़्लो में उपयोग की जा सकती हैं या यहां तक कि निष्पादित की जा सकती हैं। इसलिए, यदि कलाकृति कमजोर है, तो एक हमलावर इसका दुरुपयोग करके अन्य वर्कफ़्लो को समझौता कर सकता है जो कलाकृति पर भरोसा करते हैं। +समस्या यह है कि यदि **`path`** पैरामीटर सेट नहीं किया गया है, तो कलाकृति वर्तमान निर्देशिका में निकाली जाती है और यह उन फ़ाइलों को ओवरराइट कर सकती है जो बाद में कार्यप्रवाह में उपयोग की जा सकती हैं या यहां तक कि निष्पादित की जा सकती हैं। इसलिए, यदि कलाकृति कमजोर है, तो एक हमलावर इसका दुरुपयोग करके अन्य कार्यप्रवाहों को समझौता कर सकता है जो कलाकृति पर भरोसा करते हैं। -कमजोर वर्कफ़्लो का उदाहरण: +कमजोर कार्यप्रवाह का उदाहरण: ```yaml on: workflow_run: @@ -344,23 +394,23 @@ path: ./script.py ### हटाए गए Namespace Repo Hijacking -यदि एक खाता अपना नाम बदलता है, तो कोई अन्य उपयोगकर्ता कुछ समय बाद उस नाम के साथ एक खाता पंजीकृत कर सकता है। यदि एक रिपॉजिटरी के पास **नाम परिवर्तन से पहले 100 से कम सितारे** थे, तो Github नए पंजीकृत उपयोगकर्ता को उसी नाम के साथ एक **रिपॉजिटरी बनाने** की अनुमति देगा जो हटाई गई थी। +यदि एक खाता अपना नाम बदलता है, तो कुछ समय बाद कोई अन्य उपयोगकर्ता उस नाम के साथ एक खाता पंजीकृत कर सकता है। यदि एक रिपॉजिटरी के पास **नाम परिवर्तन से पहले 100 से कम सितारे** थे, तो Github नए पंजीकृत उपयोगकर्ता को उसी नाम के साथ एक **रिपॉजिटरी बनाने** की अनुमति देगा जो हटाई गई थी। > [!CAUTION] > इसलिए यदि कोई क्रिया एक गैर-मौजूद खाते से एक रिपॉजिटरी का उपयोग कर रही है, तो यह संभव है कि एक हमलावर उस खाते को बना सके और क्रिया को समझौता कर सके। -यदि अन्य रिपॉजिटरी **इस उपयोगकर्ता के रिपॉजिटरी से निर्भरताएँ** का उपयोग कर रही हैं, तो एक हमलावर उन्हें हाइजैक करने में सक्षम होगा। यहाँ आपके पास एक अधिक पूर्ण व्याख्या है: [https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/](https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/) +यदि अन्य रिपॉजिटरी **इस उपयोगकर्ता के रिपॉजिटरी से निर्भरताएँ** का उपयोग कर रही हैं, तो एक हमलावर उन्हें हाइजैक कर सकेगा। यहाँ आपके पास एक अधिक पूर्ण व्याख्या है: [https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/](https://blog.nietaanraken.nl/posts/gitub-popular-repository-namespace-retirement-bypass/) --- ## Repo Pivoting > [!NOTE] -> इस अनुभाग में हम उन तकनीकों के बारे में बात करेंगे जो **एक रिपॉजिटरी से दूसरी रिपॉजिटरी में पिवट** करने की अनुमति देंगी, मानते हुए कि हमारे पास पहले वाले पर कुछ प्रकार की पहुँच है (पिछले अनुभाग की जाँच करें)। +> इस अनुभाग में हम उन तकनीकों के बारे में बात करेंगे जो **एक रिपॉजिटरी से दूसरी रिपॉजिटरी में पिवट** करने की अनुमति देंगी, मानते हुए कि हमारे पास पहले वाले पर कुछ प्रकार की पहुँच है (पिछली अनुभाग देखें)। ### कैश पॉइज़निंग -एक कैश **समान शाखा में वर्कफ़्लो रन के बीच** बनाए रखा जाता है। जिसका अर्थ है कि यदि एक हमलावर **एक पैकेज को समझौता करता है** जो फिर कैश में संग्रहीत होता है और **डाउनलोड** और **अधिक विशेषाधिकार प्राप्त** वर्कफ़्लो द्वारा निष्पादित होता है, तो वह उस वर्कफ़्लो को भी **समझौता** कर सकेगा। +एक कैश **समान शाखा में वर्कफ़्लो रन के बीच** बनाए रखा जाता है। जिसका अर्थ है कि यदि एक हमलावर **एक पैकेज को समझौता करता है** जो फिर कैश में संग्रहीत होता है और **डाउनलोड** और **अधिक विशेषाधिकार प्राप्त** वर्कफ़्लो द्वारा निष्पादित किया जाता है, तो वह उस वर्कफ़्लो को भी **समझौता** कर सकेगा। {{#ref}} gh-actions-cache-poisoning.md @@ -368,7 +418,7 @@ gh-actions-cache-poisoning.md ### आर्टिफैक्ट पॉइज़निंग -वर्कफ़्लो **अन्य वर्कफ़्लो और यहां तक कि रिपॉजिटरी से आर्टिफैक्ट्स** का उपयोग कर सकते हैं, यदि एक हमलावर **उस Github Action को समझौता करने में सफल होता है** जो एक आर्टिफैक्ट **अपलोड करता है** जो बाद में किसी अन्य वर्कफ़्लो द्वारा उपयोग किया जाता है, तो वह **अन्य वर्कफ़्लो को समझौता** कर सकता है: +वर्कफ़्लो **अन्य वर्कफ़्लो और यहां तक कि रिपॉजिटरी से आर्टिफैक्ट्स** का उपयोग कर सकते हैं, यदि एक हमलावर **Github Action को समझौता करने में सफल होता है** जो एक आर्टिफैक्ट **अपलोड करता है** जो बाद में किसी अन्य वर्कफ़्लो द्वारा उपयोग किया जाता है, तो वह **अन्य वर्कफ़्लो को समझौता** कर सकता है: {{#ref}} gh-actions-artifact-poisoning.md @@ -394,7 +444,7 @@ gh-actions-artifact-poisoning.md यदि आप एक स्क्रिप्ट में सामग्री इंजेक्ट कर रहे हैं, तो यह जानना दिलचस्प है कि आप रहस्यों तक कैसे पहुँच सकते हैं: -- यदि रहस्य या टोकन को **पर्यावरण चर** पर सेट किया गया है, तो इसे **`printenv`** का उपयोग करके सीधे पर्यावरण के माध्यम से पहुँचा जा सकता है। +- यदि रहस्य या टोकन को **पर्यावरण चर** में सेट किया गया है, तो इसे **`printenv`** का उपयोग करके सीधे पर्यावरण के माध्यम से एक्सेस किया जा सकता है।
@@ -448,7 +498,7 @@ secret_postgress_pass: ${{secrets.POSTGRESS_PASSWORDyaml}} ```
-- यदि गुप्त को **एक्सप्रेशन में सीधे** उपयोग किया जाता है, तो उत्पन्न शेल स्क्रिप्ट **ऑन-डिस्क** संग्रहीत होती है और इसे एक्सेस किया जा सकता है। +- यदि गुप्त को **एक्सप्रेशन में सीधे** उपयोग किया जाता है, तो उत्पन्न शेल स्क्रिप्ट **डिस्क पर** संग्रहीत होती है और इसे एक्सेस किया जा सकता है। - ```bash cat /home/runner/work/_temp/* ``` @@ -456,7 +506,7 @@ cat /home/runner/work/_temp/* - ```bash ps axe | grep node ``` -- एक **कस्टम क्रिया** के लिए, जोखिम इस बात पर निर्भर कर सकता है कि एक प्रोग्राम ने **आर्गुमेंट** से प्राप्त गुप्त का उपयोग कैसे किया: +- एक **कस्टम क्रिया** के लिए, जोखिम इस पर निर्भर कर सकता है कि एक प्रोग्राम ने **आर्गुमेंट** से प्राप्त गुप्त का उपयोग कैसे किया है: ```yaml uses: fakeaction/publish@v3 @@ -468,14 +518,14 @@ key: ${{ secrets.PUBLISH_KEY }} यह पता लगाने का तरीका कि कौन सी **Github Actions गैर-github अवसंरचना में निष्पादित हो रही हैं** वह है कि Github Action कॉन्फ़िगरेशन yaml में **`runs-on: self-hosted`** के लिए खोजें। -**स्वयं-होस्टेड** रनर्स को **अतिरिक्त संवेदनशील जानकारी** तक पहुंच हो सकती है, अन्य **नेटवर्क सिस्टम** (नेटवर्क में कमजोर एंडपॉइंट? मेटाडेटा सेवा?) या, भले ही यह अलग-थलग और नष्ट हो जाए, **एक से अधिक क्रियाएं एक ही समय में चलाई जा सकती हैं** और दुर्भावनापूर्ण एक **दूसरे के गुप्त चुराने** में सक्षम हो सकता है। +**स्वयं-होस्टेड** रनर्स को **अतिरिक्त संवेदनशील जानकारी** तक पहुंच हो सकती है, अन्य **नेटवर्क सिस्टम** (नेटवर्क में कमजोर एंडपॉइंट? मेटाडेटा सेवा?) या, भले ही यह अलग-थलग और नष्ट हो जाए, **एक से अधिक क्रियाएं एक ही समय में चलाई जा सकती हैं** और दुर्भावनापूर्ण एक **दूसरे के गुप्त चुरा सकती है**। -स्वयं-होस्टेड रनर्स में यह भी संभव है कि **\_Runner.Listener**\_\*\* प्रक्रिया\*\* से **गुप्त प्राप्त करें** जो किसी भी चरण पर कार्यप्रवाह के सभी गुप्त को अपनी मेमोरी को डंप करके शामिल करेगा: +स्वयं-होस्टेड रनर्स में यह भी संभव है कि **\_Runner.Listener**\_\*\* प्रक्रिया\*\* से **गुप्त प्राप्त करें** जो किसी भी चरण पर कार्यप्रवाह के सभी गुप्त को अपनी मेमोरी को डंप करके रखेगा: ```bash sudo apt-get install -y gdb sudo gcore -o k.dump "$(ps ax | grep 'Runner.Listener' | head -n 1 | awk '{ print $1 }')" ``` -चेक करें [**इस पोस्ट के लिए अधिक जानकारी**](https://karimrahal.com/2023/01/05/github-actions-leaking-secrets/)। +चेक करें [**इस पोस्ट में अधिक जानकारी के लिए**](https://karimrahal.com/2023/01/05/github-actions-leaking-secrets/)। ### Github Docker Images Registry @@ -522,7 +572,7 @@ ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}:${{ e echo $gh_token | docker login ghcr.io -u --password-stdin docker pull ghcr.io//: ``` -फिर, उपयोगकर्ता **Docker छवि परतों में लीक हुए रहस्यों** के लिए खोज कर सकता है: +फिर, उपयोगकर्ता **Docker इमेज लेयर्स में लीक हुए रहस्यों** की खोज कर सकता है: {{#ref}} https://book.hacktricks.wiki/en/generic-methodologies-and-resources/basic-forensic-methodology/docker-forensics.html @@ -530,24 +580,15 @@ https://book.hacktricks.wiki/en/generic-methodologies-and-resources/basic-forens ### Github Actions लॉग में संवेदनशील जानकारी -यहां तक कि यदि **Github** **गुप्त मानों** का पता लगाने की कोशिश करता है और **उन्हें दिखाने से बचता है**, तो **अन्य संवेदनशील डेटा** जो क्रिया के निष्पादन में उत्पन्न हो सकता है, छिपा नहीं होगा। उदाहरण के लिए, एक JWT जो एक गुप्त मान के साथ हस्ताक्षरित है, तब तक छिपा नहीं होगा जब तक कि इसे [विशेष रूप से कॉन्फ़िगर](https://github.com/actions/toolkit/tree/main/packages/core#setting-a-secret) नहीं किया गया हो। +यहां तक कि अगर **Github** **क्रियाओं के लॉग में रहस्यमय मानों** का **पता लगाने** और **उन्हें दिखाने से बचने** की कोशिश करता है, तो **अन्य संवेदनशील डेटा** जो क्रिया के निष्पादन में उत्पन्न हो सकता है, छिपा नहीं होगा। उदाहरण के लिए, एक JWT जो एक रहस्यमय मान के साथ हस्ताक्षरित है, वह तब तक छिपा नहीं होगा जब तक कि इसे [विशेष रूप से कॉन्फ़िगर](https://github.com/actions/toolkit/tree/main/packages/core#setting-a-secret) नहीं किया गया हो। ## अपने निशान छुपाना -(तकनीक [**यहां**](https://divyanshu-mehta.gitbook.io/researchs/hijacking-cloud-ci-cd-systems-for-fun-and-profit) से) सबसे पहले, कोई भी PR जो उठाया गया है, वह स्पष्ट रूप से Github में सार्वजनिक रूप से और लक्षित GitHub खाते के लिए दिखाई देता है। GitHub में डिफ़ॉल्ट रूप से, हम **इंटरनेट से एक PR को हटा नहीं सकते**, लेकिन इसमें एक मोड़ है। उन GitHub खातों के लिए जो **Github द्वारा निलंबित** हैं, उनके सभी **PRs स्वचालित रूप से हटा दिए जाते हैं** और इंटरनेट से हटा दिए जाते हैं। इसलिए अपनी गतिविधियों को छुपाने के लिए आपको या तो अपने **GitHub खाते को निलंबित कराना होगा या अपने खाते को झंडा लगवाना होगा**। यह **आपकी सभी गतिविधियों** को GitHub से इंटरनेट से छुपा देगा (बुनियादी रूप से आपके सभी शोषण PR को हटा देगा) +(तकनीक [**यहां**](https://divyanshu-mehta.gitbook.io/researchs/hijacking-cloud-ci-cd-systems-for-fun-and-profit) से) सबसे पहले, कोई भी PR जो उठाया गया है, वह Github में सार्वजनिक रूप से और लक्षित GitHub खाते के लिए स्पष्ट रूप से दिखाई देता है। GitHub में डिफ़ॉल्ट रूप से, हम **इंटरनेट से एक PR को हटा नहीं सकते**, लेकिन इसमें एक मोड़ है। Github द्वारा **सस्पेंड** किए गए खातों के लिए, उनके सभी **PRs स्वचालित रूप से हटा दिए जाते हैं** और इंटरनेट से हटा दिए जाते हैं। इसलिए अपनी गतिविधियों को छिपाने के लिए आपको या तो अपने **GitHub खाते को सस्पेंड** कराना होगा या अपने खाते को **फ्लैग** कराना होगा। यह **आपकी सभी गतिविधियों** को GitHub से इंटरनेट से छिपा देगा (बुनियादी रूप से आपके सभी एक्सप्लॉइट PR को हटा देगा) -GitHub में एक संगठन खातों की रिपोर्ट करने में बहुत सक्रिय है। आपको बस "कुछ चीजें" Issue में साझा करनी हैं और वे सुनिश्चित करेंगे कि आपका खाता 12 घंटे में निलंबित हो जाए :p और आपके पास है, अपने शोषण को github पर अदृश्य बना दिया। +GitHub में एक संगठन खातों की रिपोर्ट करने में बहुत सक्रिय है। आपको बस "कुछ चीजें" Issue में साझा करनी हैं और वे सुनिश्चित करेंगे कि आपका खाता 12 घंटे में सस्पेंड हो जाए :p और वहां आपने, अपने एक्सप्लॉइट को github पर अदृश्य बना दिया। > [!WARNING] -> एक संगठन के लिए यह पता लगाने का एकमात्र तरीका कि उन्हें लक्षित किया गया है, SIEM से GitHub लॉग की जांच करना है क्योंकि GitHub UI से PR हटा दिया जाएगा। - -## उपकरण - -निम्नलिखित उपकरण GitHub Action वर्कफ़्लो खोजने और यहां तक कि कमजोर लोगों को खोजने के लिए उपयोगी हैं: - -- [https://github.com/CycodeLabs/raven](https://github.com/CycodeLabs/raven) -- [https://github.com/praetorian-inc/gato](https://github.com/praetorian-inc/gato) -- [https://github.com/AdnaneKhan/Gato-X](https://github.com/AdnaneKhan/Gato-X) -- [https://github.com/carlospolop/PurplePanda](https://github.com/carlospolop/PurplePanda) +> एक संगठन के लिए यह पता लगाने का एकमात्र तरीका है कि वे लक्षित हुए हैं, SIEM से GitHub लॉग की जांच करना है क्योंकि GitHub UI से PR हटा दिया जाएगा। {{#include ../../../banners/hacktricks-training.md}}