Evitare la script injection nelle GitHub Actions

di Matteo Tumiati, in DevOps,

Le GitHub Actions, pur essendo uno strumento potente per l'automazione dei flussi di lavoro, possono essere soggette a vulnerabilità di sicurezza come l'injection di script. Questo accade quando un attore malevolo riesce a inserire codice all'interno delle variabili o dei comandi eseguiti dalle Actions, che poi, una volta eseguito, potenzialmente causa danni ci espone dati e file sensibili. Pertanto, è fondamentale seguire le migliori pratiche di sicurezza quando si lavora con le GitHub Actions.

Vediamo un esempio concreto di una GitHub Action:

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

Assumiamo che, in questo caso, la GitHub Action venga eseguita quando viene aperta una pull request, poiché ne dobbiamo verificare le sue proprietà. Il suo scopo, infatti, è quello di verificare che il titolo della pull request in oggetto inizi con la parola "aspitalia". Se così non fosse, la GitHub Action terminerebbe la sua esecuzione con un errore.

Tuttavia, nonostante questo esempio sia molto semplice, ci espone ad un livello di rischio molto elevato. Infatti, creando una PR con il seguente titolo:


Ci andrà a sostituire il valore di:

title="${{ github.event.pull_request.title }}"

in quest'altro:

title="a"; ls $GITHUB_WORKSPACE"

Che, sebbene farà eseguire la Action nella sua valutazione - anche se con un titolo differente -, di fatto ha esposto dei dati al chiamante del workflow, che può quindi leggere dai log informazioni sensibili. Anche in questo caso l'esempio è molto semplice perché andiamo solamente a stampare un elenco di file, ma nulla ci vieta di fare injection di un qualsiasi script.

Questo succede perché lo script viene eseguito su un file temporaneo e, prima che questo venga creato, la variabile viene valutata. Tuttavia, la remediation a questo problema è molto semplice e ci richiede solamente il passaggio della variabile come variabile d'ambiente:

- name: Check PR title
  env:
    TITLE: ${{ github.event.pull_request.title }}
  run: |
    if [[ "$TITLE" =~ ^aspitalia ]]; then
        echo "PR title starts with 'aspitalia'"
        exit 0
    # ...
    fi

In questo scenario, infatti, lo script viene scritto temporaneamente nell'agent mantenendo TITLE come placeholder e verrà rimpiazzato al momento dell'esecuzione.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi