FlawOpen

flawopen.com/GitHub Actions सुरक्षा/Workflow स्क्रिप्ट इंजेक्शन

GitHub Actions स्क्रिप्ट इंजेक्शन कैसे होता है और इसे कैसे रोकें?

विशेषाधिकार होने पर उच्च प्रभाव CWE-78 CI/CD workflow सुरक्षा
सरल भाषा में

Bash शुरू होने से पहले यदि workflow issue शीर्षक या pull request फ़ील्ड को स्क्रिप्ट में जोड़ता है, तो डेटा shell सिंटैक्स बन सकता है। यह ऐसे नेमटैग प्रिंटर जैसा है जो नाम को निर्देश समझ ले। मान को environment variable से दें और विस्तार को उद्धरण में रखें; Bash उसे स्क्रिप्ट से अलग पाता है। प्रभाव token, secrets, runner और event पर निर्भर रहता है।

अविश्वसनीय संदर्भGitHub event फ़ील्ड जैसे शीर्षक, body, branch नाम, label और commit संदेश। इन्हें बाहरी उपयोगकर्ता के नियंत्रण वाली स्ट्रिंग मानें।
Expression प्रतिस्थापनGitHub shell शुरू होने से पहले ${{ ... }} का मूल्यांकन करता है। run: में input स्क्रिप्ट स्रोत में जुड़ सकता है।
Environment handoffenv: मान को प्रक्रिया डेटा की तरह देता है। Shell विस्तार उद्धृत करें; eval और गतिशील स्क्रिप्ट से बचें।
विशेषाधिकार सीमाEvent और workflow token अधिकार, secrets और runner पहुँच तय करते हैं। प्रभाव job के उपलब्ध संसाधनों तक सीमित है।

मूल कारण: shell parse होने से पहले डेटा जुड़ता है

GitHub run चरण का shell शुरू करने से पहले expressions फैलाता है। अविश्वसनीय शीर्षक सीधे जोड़ने पर उसके अक्षर shell प्रोग्राम बदल सकते हैं। env: से मिला मान स्क्रिप्ट पाठ से अलग रहता है; उद्धरण में उसका विस्तार सामान्य कमांड का argument रहता है। फिर भी eval, दूसरे interpreter या argument को code मानने वाले tool में देना सुरक्षित नहीं है। GitHub event fields को हमलावर-नियंत्रित हो सकने वाला input मानता है।

.github/workflows/triage.yml (असुरक्षित जोड़)असुरक्षित
# असुरक्षित: event data generated shell script का हिस्सा बनता है
name: Issue Triage
on:
  issues:
    types: [opened]

permissions:
  contents: read

jobs:
  triage:
    runs-on: ubuntu-latest
    steps:
      - name: Print issue title
        run: |
          printf 'Title: %s\n' "${{ github.event.issue.title }}"
.github/workflows/triage.yml (डेटा अलग)सुदृढ़
# अधिक सुरक्षित: event मान environment से दें
name: Issue Triage
on:
  issues:
    types: [opened]

permissions:
  contents: read

jobs:
  triage:
    runs-on: ubuntu-latest
    steps:
      - name: Print issue title
        env:
          ISSUE_TITLE: ${{ github.event.issue.title }}
        run: |
          printf 'Title: %s\n' "$ISSUE_TITLE"

हमले का संक्षिप्त रास्ता

Step 1

उपयोगकर्ता event फ़ील्ड नियंत्रित करता है

सार्वजनिक issue या pull request शीर्षक अथवा branch नाम workflow का input बनता है।

Step 2

Workflow उसे shell स्रोत में जोड़ता है

run: में सीधा ${{ github.event... }} Bash द्वारा स्क्रिप्ट parse करने से पहले फैलता है।

Step 3

Shell बदले प्रोग्राम को समझता है

मान shell सिंटैक्स बदले तो job प्रक्रिया के अधिकार से कमांड चल सकते हैं। उद्धृत argument डेटा रहने पर यह इंजेक्शन नहीं होता।

Step 4

Job अनुमतियाँ प्रभाव तय करती हैं

समझौता किया job केवल run के उपलब्ध संसाधन छूता है: GITHUB_TOKEN अधिकार, दिए गए secrets और runner। issue events तथा pull_request_target जाँचें।

सुरक्षा जाँच-सूची

प्राथमिक स्रोत

संबंधित सुरक्षा विषय और विश्लेषण देखें:पूरा सुरक्षा निर्देशिका →
यह भी देखें Cosign GHSA-fx35-mq7g-6g98: Bundle बाईपास Dependency Confusion: जोखिम और बचाव Docker सॉकेट का खुलासा: जोखिम और बचाव