Gh Actions - Context Script Injections
Tip
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Δείτε τα subscription plans!
- Εγγραφείτε στο 💬 Discord group ή την telegram group ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε τα hacking tricks υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Κατανόηση του κινδύνου
Το GitHub Actions αποδίδει εκφράσεις ${{ … }} πριν εκτελεστεί το βήμα. Η αποδοσμένη τιμή επικολλάται στο πρόγραμμα του βήματος (για run steps, ένα shell script). Αν ενθέσετε μη αξιόπιστη είσοδο απευθείας μέσα σε run:, ο επιτιθέμενος ελέγχει μέρος του shell προγράμματος και μπορεί να εκτελέσει αυθαίρετες εντολές.
Docs: https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions and contexts/functions: https://docs.github.com/en/actions/learn-github-actions/contexts
Βασικά σημεία:
- Η απόδοση (rendering) γίνεται πριν την εκτέλεση. Το run script δημιουργείται με όλες τις εκφράσεις επιλυμένες και στη συνέχεια εκτελείται από το shell.
- Πολλά contexts περιέχουν πεδία που ελέγχονται από χρήστες ανάλογα με το triggering event (issues, PRs, comments, discussions, forks, stars, κ.λπ.). Δείτε την αναφορά για μη αξιόπιστη είσοδο: https://securitylab.github.com/resources/github-actions-untrusted-input/
- Το quoting του shell μέσα σε run: δεν αποτελεί αξιόπιστη άμυνα, επειδή η injection συμβαίνει στο στάδιο της απόδοσης του template. Οι επιτιθέμενοι μπορούν να διαφύγουν από εισαγωγικά ή να εισάγουν operators μέσω κατασκευασμένης εισόδου.
Ευάλωτο μοτίβο → RCE on runner
Ευάλωτο workflow (ενεργοποιείται όταν κάποιος ανοίγει ένα νέο issue):
name: New Issue Created
on:
issues:
types: [opened]
jobs:
deploy:
runs-on: ubuntu-latest
permissions:
issues: write
steps:
- name: New issue
run: |
echo "New issue ${{ github.event.issue.title }} created"
- name: Add "new" label to issue
uses: actions-ecosystem/action-add-labels@v1
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
labels: new
Εάν ένας attacker ανοίξει ένα issue με τίτλο $(id), το rendered step γίνεται:
echo "New issue $(id) created"
Η αντικατάσταση εντολής εκτελεί id στον runner. Παράδειγμα εξόδου:
New issue uid=1001(runner) gid=118(docker) groups=118(docker),4(adm),100(users),999(systemd-journal) created
Γιατί τα εισαγωγικά δεν σας σώζουν:
- Οι εκφράσεις αξιολογούνται πρώτα και στη συνέχεια εκτελείται το προκύπτον script. Αν η μη αξιόπιστη τιμή περιέχει $(…),
;,"/'ή χαρακτήρες νέας γραμμής, μπορεί να τροποποιήσει τη δομή του προγράμματος παρά τα εισαγωγικά σας.
Ασφαλές πρότυπο (shell variables via env)
Σωστή αντιμετώπιση: αντιγράψτε την μη αξιόπιστη είσοδο σε μια μεταβλητή περιβάλλοντος, και μετά χρησιμοποιήστε την εγγενή επέκταση shell ($VAR) στο script εκτέλεσης. Μην την επανα-ενσωματώνετε με ${{ … }} μέσα στην εντολή.
# safe
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: New issue
env:
TITLE: ${{ github.event.issue.title }}
run: |
echo "New issue $TITLE created"
Σημειώσεις:
- Αποφύγετε τη χρήση ${{ env.TITLE }} μέσα σε run:. Αυτό επανεισάγει το template rendering στην εντολή και φέρνει τον ίδιο κίνδυνο injection.
- Προτιμήστε τη μεταβίβαση μη-αξιόπιστων εισροών μέσω του mapping env: και την αναφορά τους με $VAR μέσα σε run:.
Reader-triggerable surfaces (treat as untrusted)
Λογαριασμοί με μόνο read permission σε δημόσια repositories μπορούν ακόμα να ενεργοποιήσουν πολλά events. Οποιοδήποτε πεδίο σε contexts που προέρχονται από αυτά τα events πρέπει να θεωρείται attacker-controlled εκτός αν αποδειχθεί το αντίθετο. Παραδείγματα:
- issues, issue_comment
- discussion, discussion_comment (οι οργανισμοί μπορούν να περιορίσουν τις συζητήσεις)
- pull_request, pull_request_review, pull_request_review_comment
- pull_request_target (επικίνδυνο αν χρησιμοποιηθεί λάθος, τρέχει στο base repo context)
- fork (anyone can fork public repos)
- watch (starring a repo)
- Indirectly via workflow_run/workflow_call chains
Ποια συγκεκριμένα πεδία είναι attacker-controlled εξαρτάται από το event. Συμβουλευτείτε τον οδηγό Untrusted input του GitHub Security Lab: https://securitylab.github.com/resources/github-actions-untrusted-input/
Practical tips
- Μειώστε στο ελάχιστο τη χρήση expressions μέσα σε run:. Προτιμήστε mapping env: + $VAR.
- Αν πρέπει να μετασχηματίσετε input, κάντε το στο shell χρησιμοποιώντας ασφαλή εργαλεία (printf %q, jq -r, κ.λπ.), ξεκινώντας πάντα από μια shell variable.
- Να είστε ιδιαίτερα προσεκτικοί όταν κάνετε interpolation σε branch names, PR titles, usernames, labels, discussion titles, και PR head refs μέσα σε scripts, command-line flags ή file paths.
- Για reusable workflows και composite actions, εφαρμόστε το ίδιο μοτίβο: κάντε map σε env και μετά αναφερθείτε με $VAR.
References
- GitHub Actions: A Cloudy Day for Security - Part 1
- GitHub workflow syntax
- Contexts and expression syntax
- Untrusted input reference for GitHub Actions
Tip
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Δείτε τα subscription plans!
- Εγγραφείτε στο 💬 Discord group ή την telegram group ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε τα hacking tricks υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
HackTricks Cloud

