flawopen.com/GitHub Actions सुरक्षा/Workflow स्क्रिप्ट इंजेक्शन
GitHub Actions स्क्रिप्ट इंजेक्शन कैसे होता है और इसे कैसे रोकें?
Bash शुरू होने से पहले यदि workflow issue शीर्षक या pull request फ़ील्ड को स्क्रिप्ट में जोड़ता है, तो डेटा shell सिंटैक्स बन सकता है। यह ऐसे नेमटैग प्रिंटर जैसा है जो नाम को निर्देश समझ ले। मान को environment variable से दें और विस्तार को उद्धरण में रखें; Bash उसे स्क्रिप्ट से अलग पाता है। प्रभाव token, secrets, runner और event पर निर्भर रहता है।
${{ ... }} का मूल्यांकन करता है। run: में input स्क्रिप्ट स्रोत में जुड़ सकता है।env: मान को प्रक्रिया डेटा की तरह देता है। Shell विस्तार उद्धृत करें; eval और गतिशील स्क्रिप्ट से बचें।मूल कारण: shell parse होने से पहले डेटा जुड़ता है
GitHub run चरण का shell शुरू करने से पहले expressions फैलाता है। अविश्वसनीय शीर्षक सीधे जोड़ने पर उसके अक्षर shell प्रोग्राम बदल सकते हैं। env: से मिला मान स्क्रिप्ट पाठ से अलग रहता है; उद्धरण में उसका विस्तार सामान्य कमांड का argument रहता है। फिर भी eval, दूसरे interpreter या argument को code मानने वाले tool में देना सुरक्षित नहीं है। GitHub event fields को हमलावर-नियंत्रित हो सकने वाला input मानता है।
# असुरक्षित: 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 }}"
# अधिक सुरक्षित: 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"
हमले का संक्षिप्त रास्ता
उपयोगकर्ता event फ़ील्ड नियंत्रित करता है
सार्वजनिक issue या pull request शीर्षक अथवा branch नाम workflow का input बनता है।
Workflow उसे shell स्रोत में जोड़ता है
run: में सीधा ${{ github.event... }} Bash द्वारा स्क्रिप्ट parse करने से पहले फैलता है।
Shell बदले प्रोग्राम को समझता है
मान shell सिंटैक्स बदले तो job प्रक्रिया के अधिकार से कमांड चल सकते हैं। उद्धृत argument डेटा रहने पर यह इंजेक्शन नहीं होता।
Job अनुमतियाँ प्रभाव तय करती हैं
समझौता किया job केवल run के उपलब्ध संसाधन छूता है: GITHUB_TOKEN अधिकार, दिए गए secrets और runner। issue events तथा pull_request_target जाँचें।
सुरक्षा जाँच-सूची
- ✓अविश्वसनीय
github.eventमानों कोrun:में सीधे न डालें।env:से दें और"$ISSUE_TITLE"जैसे विस्तार उद्धृत करें। - ✓ऐसे मान
eval, generated scripts, shell command strings और arguments को code या options मानने वाले tools से दूर रखें। - ✓Workflow या job में सीमित
permissions:रखें; लिखने का अधिकार केवल आवश्यक job को दें। - ✓
pull_request_targetऔरworkflow_runको विशेषाधिकार सीमा मानें। वहाँ अविश्वसनीय PR code या artifacts checkout, build या execute न करें। - ✓अविश्वसनीय multiline data को
GITHUB_ENVयाGITHUB_PATHमें न लिखें। GitHubGITHUB_*औरRUNNER_*बदलने से रोकता है, लेकिन अन्य मान अगले चरणों को प्रभावित कर सकते हैं। - ✓Third-party actions को जाँचे गए पूरे SHA पर pin करें, पृथक अस्थायी runners लें और Actions workflows पर CodeQL चालू करें।
प्राथमिक स्रोत
- GitHub Docs — Script injections
- GitHub Docs — Secure use reference
- GitHub Docs — pull_request_target का सुरक्षित उपयोग
- GitHub Docs — Workflow commands और GITHUB_ENV
- GitHub Docs — GITHUB_TOKEN अनुमतियाँ