Gh Actions - Context Script Injections

Tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

Razumevanje rizika

GitHub Actions renderuje izraze ${{ … }} pre nego što se korak izvrši. Renderovana vrednost se ubacuje u program koraka (za run korake, shell skripta). Ako interpolirate nepouzdan ulaz direktno unutar run:, napadač kontroliše deo shell programa i može izvršavati proizvoljne komande.

Dokumentacija: https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions i contexts/functions: https://docs.github.com/en/actions/learn-github-actions/contexts

Ključne tačke:

  • Renderovanje se dešava pre izvršenja. Skripta koja se pokreće u run koraku se generiše sa svim razrešenim izrazima, a zatim je izvršava shell.
  • Mnogi contexts sadrže polja pod kontrolom korisnika u zavisnosti od događaja koji pokreće (issues, PRs, comments, discussions, forks, stars, itd.). Pogledajte referencu o nepouzdanom ulazu: https://securitylab.github.com/resources/github-actions-untrusted-input/
  • Quoting u shell-u unutar run: nije pouzdana odbrana, jer se injekcija dešava u fazi renderovanja šablona. Napadači mogu probiti navodnike ili ubaciti operatore putem pažljivo sastavljenog unosa.

Ranljiv obrazac → RCE na runner-u

Ranljiv workflow (pokreće se kada neko otvori novi 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

Ako napadač otvori issue sa naslovom $(id), renderovani step postaje:

echo "New issue $(id) created"

Zamena komande izvršava id na runneru. Primer izlaza:

New issue uid=1001(runner) gid=118(docker) groups=118(docker),4(adm),100(users),999(systemd-journal) created

Zašto citiranje ne štiti:

  • Izrazi se prvo evaluiraju, zatim se izvršava dobijena skripta. Ako nepouzdana vrednost sadrži $(…), ;, "/' ili prelome reda (newlines), može promeniti strukturu programa uprkos vašem citiranju.

Siguran obrazac (shell variables via env)

Ispravna mitigacija: kopirajte nepouzdani ulaz u environment variable, zatim koristite native shell expansion ($VAR) u run skripti. Nemojte ponovo umetati sa ${{ … }} unutar komande.

# safe
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: New issue
env:
TITLE: ${{ github.event.issue.title }}
run: |
echo "New issue $TITLE created"

Napomene:

  • Izbegavajte upotrebu ${{ env.TITLE }} inside run:. To ponovo uvodi template rendering nazad u komandu i stvara isti rizik od injekcije.
  • Preferirajte prosleđivanje nepouzdanih inputa putem env: mapping i referencirajte ih sa $VAR in run:.

Reader-triggerable surfaces (treat as untrusted)

Nalozi sa samo read permission na public repositories i dalje mogu pokrenuti mnoge event-e. Svako polje u kontekstima izvedenim iz ovih event-a mora se smatrati kontrolisanim od strane napadača, osim ako se ne dokaže suprotno. Primeri:

  • issues, issue_comment
  • discussion, discussion_comment (orgs can restrict discussions)
  • pull_request, pull_request_review, pull_request_review_comment
  • pull_request_target (dangerous if misused, runs in base repo context)
  • fork (anyone can fork public repos)
  • watch (starring a repo)
  • Indirectly via workflow_run/workflow_call chains

Koja specifična polja su attacker-controlled zavisi od event-a. Pogledajte GitHub Security Lab’s untrusted input guide: https://securitylab.github.com/resources/github-actions-untrusted-input/

Practical tips

  • Minimizirajte korišćenje expressions inside run:. Prefer env: mapping + $VAR.
  • Ako morate transformisati input, uradite to u shell-u koristeći sigurne alate (printf %q, jq -r, itd.), pri čemu i dalje počinjete od shell promenljive.
  • Budite posebno oprezni pri interpolaciji branch names, PR titles, usernames, labels, discussion titles i PR head refs u skripte, komandne flagove ili putanje fajlova.
  • Za reusable workflows i composite actions primenite isti obrazac: mapirajte u env pa onda referencirajte $VAR.

References

Tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks