Gh Actions - Context Script Injections

Support HackTricks

Informações Básicas

Note que existem certos contextos do github cujos valores são controlados pelo usuário que cria o PR. Se a ação do github estiver usando esses dados para executar qualquer coisa, isso pode levar à execução de código arbitrário. Esses contextos normalmente terminam com body, default_branch, email, head_ref, label, message, name, page_name, ref e title. Por exemplo (lista deste escrito):

  • github.event.comment.body

  • github.event.issue.body

  • github.event.issue.title

  • github.head_ref

  • github.pull_request.*

  • github.*.*.authors.name

  • github.*.*.authors.email

Note que existem fontes menos óbvias de entrada potencialmente não confiável, como nomes de branches e endereços de email, que podem ser bastante flexíveis em termos de conteúdo permitido. Por exemplo, zzz";echo${IFS}"hello";# seria um nome de branch válido e poderia ser um vetor de ataque para um repositório alvo.

Exemplo de um ataque de injeção de script

Um ataque de injeção de script pode ocorrer diretamente dentro do script inline de um workflow. No exemplo a seguir, uma ação usa uma expressão para testar a validade do título de um pull request, mas também adiciona o risco de injeção de 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

Antes que o script shell seja executado, as expressões dentro de ${{ }} são avaliadas e, em seguida, substituídas pelos valores resultantes, o que pode torná-las vulneráveis a injeção de comandos shell.

Para injetar comandos neste fluxo de trabalho, o atacante poderia criar um pull request com um título de a"; ls $GITHUB_WORKSPACE"

Neste exemplo, o caractere " é usado para interromper a declaração title="${{ github.event.pull_request.title }}", permitindo que o comando ls seja executado no runner.

Support HackTricks

Last updated