Gh Actions - Context Script Injections

Supporta HackTricks

Informazioni di Base

Nota che ci sono certi contesti github i cui valori sono controllati dall'utente che crea la PR. Se l'azione github utilizza quei dati per eseguire qualcosa, potrebbe portare a esecuzione di codice arbitrario. Questi contesti tipicamente terminano con body, default_branch, email, head_ref, label, message, name, page_name,ref, e title. Ad esempio (elenco da questo writeup):

  • github.event.comment.body

  • github.event.issue.body

  • github.event.issue.title

  • github.head_ref

  • github.pull_request.*

  • github.*.*.authors.name

  • github.*.*.authors.email

Nota che ci sono fonti meno ovvie di input potenzialmente non fidati, come nomi di branch e indirizzi email, che possono essere abbastanza flessibili in termini di contenuto permesso. Ad esempio, zzz";echo${IFS}"hello";# sarebbe un nome di branch valido e rappresenterebbe un possibile vettore di attacco per un repository target.

Esempio di attacco di iniezione di script

Un attacco di iniezione di script può verificarsi direttamente all'interno di uno script inline di un workflow. Nel seguente esempio, un'azione utilizza un espressione per testare la validità di un titolo di pull request, ma aggiunge anche il rischio di iniezione di script:

- name: Check PR title
run: |
title="${{ github.event.pull_request.title }}"
if [[ $title =~ ^octocat ]]; then
echo "PR title starts with 'octocat'"
exit 0
else
echo "PR title did not start with 'octocat'"
exit 1
fi

Prima che lo script shell venga eseguito, le espressioni all'interno di ${{ }} vengono valutate e poi sostituite con i valori risultanti, il che può renderlo vulnerabile all'iniezione di comandi shell.

Per iniettare comandi in questo flusso di lavoro, l'attaccante potrebbe creare una pull request con un titolo di a"; ls $GITHUB_WORKSPACE"

In questo esempio, il carattere " viene utilizzato per interrompere l'istruzione title="${{ github.event.pull_request.title }}", consentendo l'esecuzione del comando ls sul runner.

Last updated