Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2026-44590 — Prova de conceito de exploração para CVE-2026-44590, uma injeção de comandos no fluxo de trabalho do GitHub Actions do Sherlock que permite RCE e exfiltração de GITHUB_TOKEN via pull_request_target. | Kitploit
Ferramentas/GitHubGitHub/astaruf/cve-2026-44590
Análise de VulnerabilidadesExploraçãoExploração de Aplicações WebSegurança da Cadeia de SuprimentosAprendizado e EducaçãoRed Teaming
GitHubastaruf/cve-2026-44590

CVE-2026-44590

Prova de conceito de exploração para CVE-2026-44590, uma injeção de comandos no fluxo de trabalho do GitHub Actions do Sherlock que permite RCE e exfiltração de GITHUB_TOKEN via pull_request_target.

Ver Repositório
há 3 mesesAinda não revisado
Site

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

CVE-2026-44590 - sherlock-project/sherlock CI - RCE via pull_request_target Injection → Supply Chain Compromise

Descoberto e reportado por: Astaruf

Artigo completo: https://nstsec.com/en/posts/sherlock-rce-pull-request-target-cve-2026-44590/

Aviso upstream: Aviso GHSA do sherlock-project/sherlock

Entrada NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-44590

Registro CVE: https://www.cve.org/CVERecord?id=CVE-2026-44590


Este repositório contém a prova de conceito para CVE-2026-44590, uma injeção de comandos no workflow validate_modified_targets.yml do GitHub Actions de sherlock-project/sherlock. Qualquer usuário do GitHub pode abrir um pull request que dispara a execução arbitrária de comandos no contexto privilegiado do CI, exfiltrar o GITHUB_TOKEN do workflow e auto-aprovar o PR malicioso, tudo sem qualquer interação humana.

Para o artigo técnico completo (análise de causa raiz, passo a passo da exploração, discussão de impacto e um capítulo sobre o que um atacante poderia fazer em cenários do mundo real), consulte o post do blog:

nstsec.com/en/posts/sherlock-rce-pull-request-target-cve-2026-44590

Este README foca exclusivamente no script PoC: o que ele faz, como executá-lo e o que esperar.

Sobre o poc.py

poc.py é um único script Python autocontido (apenas stdlib) que automatiza toda a cadeia de ataque de ponta a ponta:

  • faz fork de sherlock-project/sherlock se necessário
  • (opcionalmente) reverte o master do fork para o commit pré-correção para que o bug possa ser reproduzido mesmo após a correção upstream
  • inicia um listener OAST (interactsh-client)
  • cria e envia um branch de PR malicioso
  • dispara o workflow vulnerável
  • extrai o GITHUB_TOKEN do callback OAST (no --mode exfil) e o decodifica em texto claro
  • usa o token roubado para auto-aprovar o mesmo PR via API do GitHub
  • imprime um veredito final claro: VULNERABILITY CONFIRMED ou FIX VERIFIED
  • faz a limpeza após a execução (exclui o branch do PoC, encerra o interactsh-client)

Existe exatamente um passo manual necessário (clicar no banner "I understand my workflows" do GitHub na primeira vez por fork), porque não existe API pública para dispensá-lo. O script detecta esse caso e pausa com um prompt claro.

Início rápido

Verificar se a correção upstream funciona (comportamento padrão)

root@kitploit:~
python3 poc.py --fork-owner <seu-usuario-do-github>

Faz fork do repositório (se necessário), sincroniza com o upstream (master corrigido), abre um PR malicioso, executa a cadeia de ataque e reporta FIX VERIFIED porque o workflow corrigido bloqueia o payload antes que qualquer comando shell seja executado.

Reproduzir a vulnerabilidade original

root@kitploit:~
python3 poc.py --fork-owner <seu-usuario-do-github> --vulnerable

Igual ao anterior, mas primeiro reverte o master do fork para o commit pré-correção (271608fb). Veredito esperado: VULNERABILITY CONFIRMED.

Demonstrar o impacto completo (exfiltração de token + auto-aprovação de PR)

root@kitploit:~
python3 poc.py --fork-owner <seu-usuario-do-github> --vulnerable --mode exfil

O payload de exfiltração despeja git config --list no OAST e dorme por 180 segundos para manter o workflow (e, portanto, o GITHUB_TOKEN) ativo. Enquanto o workflow está dormindo, o script extrai o token do log OAST, o decodifica e imediatamente chama a API do GitHub para aprovar o PR. O PR termina aprovado por github-actions[bot].

Requisitos

  • Python 3.8+ (sem dependências de terceiros, apenas stdlib)
  • gh (GitHub CLI), autenticado:
    root@kitploit:~
    gh auth login
    
  • git
  • interactsh-client (opcional, mas recomendado). Quando instalado, o script o inicia automaticamente e verifica o callback dentro do próprio script:
    root@kitploit:~
    go install github.com/projectdiscovery/interactsh/cmd/interactsh-client@latest
    
    Se preferir usar seu próprio endpoint OAST (Burp Collaborator, oast.fun via interface web, requestbin, etc.), passe-o com --oast-url e a etapa de verificação automática será ignorada.

O script não exige que um fork exista previamente; ele cria um automaticamente.

Modos

--mode harmless (padrão)

O payload é um único POST curl com uma string de confirmação estática. Nenhum segredo é lido, nenhuma chamada de API é feita; o único efeito colateral é o callback OAST. Use isso para confirmar que a vulnerabilidade existe sem expor nenhuma credencial.

--mode exfil

O payload despeja git config --list (que contém o GITHUB_TOKEN codificado em base64 sob http.https://github.com/.extraheader) no OAST e depois dorme por 180 segundos. O script então:

  1. Consulta o log OAST até o despejo chegar.
  2. Extrai o blob base64 com uma regex.
  3. Decodifica e imprime a credencial em texto claro: x-access-token:ghs_XXXXXXXX....
  4. Remove o prefixo x-access-token: e usa o token bruto para chamar POST /repos/<fork>/pulls/<n>/reviews com o payload de aprovação padrão ({"event":"APPROVE","body":"All checks passed. LGTM!"}).
  5. O PR aparece como aprovado por github-actions[bot], indistinguível de automação legítima de CI.

Uma vez registrada a aprovação, o script pula o restante do sono de 180 segundos do workflow, já que a cadeia de ataque está completa e esperar o runner expirar não acrescenta nada.

Opções

FlagDescrição
--fork-owner <user>Obrigatório. Usuário do GitHub que possui (ou possuirá) o fork
--fork-name <name>Nome do repositório do fork (padrão: sherlock)
--oast-url <url>Endpoint OAST que recebe o callback. Se omitido, o script inicia automaticamente o interactsh-client e executa o veredito dentro do script
--mode harmless|exfilTipo de payload (padrão: harmless)
--vulnerableForça a redefinição do master do fork para o commit pré-correção (271608fb) antes de executar. Implica --no-sync
--no-syncIgnora a sincronização do fork com o upstream (útil ao testar um commit fixado)
--base-branch <name>Branch alvo do PR no fork (padrão: master)
--keep-branchNão exclui o branch do PoC após a conclusão
--no-pollIgnora a consulta de execuções do workflow e sai após a criação do PR

Por que o PR tem como alvo o fork, não o repositório upstream

Por design, o PoC abre o PR de um branch no fork para o master do mesmo fork. Ele não tem como alvo sherlock-project/sherlock diretamente. Há duas razões para isso.

1. Evitar a divulgação pública de um exploit

Um pull request em um repositório público é visível para qualquer pessoa. O diff permanece indexado mesmo após o PR ser fechado, e os logs do GitHub Actions são acessíveis pela interface web. Abrir um PR com um payload funcional de injeção de comandos no repositório upstream efetivamente publicaria um exploit funcional antes que os mantenedores tivessem a chance de lançar uma correção. Qualquer pessoa observando o repositório poderia copiar o payload, trocar o callback OAST por um endpoint malicioso e usá-lo para exfiltrar o GITHUB_TOKEN real.

O PoC usa um PR de fork para fork para manter o exploit fora da vista do público, enquanto ainda demonstra o bug de ponta a ponta.

2. Reproduzir o comportamento vulnerável exato

Quando você faz fork de sherlock-project/sherlock, o arquivo de workflow validate_modified_targets.yml é incluído no fork. Abrir um PR com alvo no master do fork dispara o workflow sob o contexto do fork, com um GITHUB_TOKEN emitido para o fork. A mecânica é idêntica ao ataque original:

  • O gatilho pull_request_target dispara automaticamente
  • O workflow é executado no contexto do repositório base (neste caso, o fork)
  • O workflow tem acesso ao seu próprio GITHUB_TOKEN
  • actions/checkout grava o token em .git/config via a configuração http.https://github.com/.extraheader
  • O payload injetado pode extrair ou usar o token

A única diferença é o raio de impacto: o token pertence ao fork, não a sherlock-project/sherlock. A vulnerabilidade é reproduzida; o impacto é contido.

O único passo manual

O GitHub desativa o Actions em forks recém-criados atrás de um banner de interface:

Workflows aren't being run on this forked repository Because this repository contained workflow files when it was forked, we have disabled them from running on this fork. Make sure you understand the configured workflows and their expected usage before enabling Actions on this repository.

Não existe API pública para dispensar esse banner. O script detecta essa condição (fork recém-criado OU zero execuções históricas de workflow) e pausa com um prompt claro:

root@kitploit:~
[*] ======================================================================
[*] MANUAL STEP REQUIRED
[*] ======================================================================
[*] Open this URL in a browser:  https://github.com/<user>/sherlock/actions
[*] Click 'I understand my workflows, go ahead and enable them'.
[*] This is required only once per fresh fork (GitHub-imposed).
[*] ======================================================================
Press ENTER once you've enabled Actions on the fork...

Depois de clicar no banner uma vez em um determinado fork, o script não solicitará novamente em execuções subsequentes contra o mesmo fork.

Exemplo de saída (vulnerável, modo exfil)

root@kitploit:~
10:54:34 [>] No --oast-url provided, spawning interactsh-client
10:54:36 [+] Interactsh URL: https://abc...oast.pro
10:54:36 [*] Target fork:    youruser/sherlock
10:54:36 [*] Payload mode:   exfil
10:54:36 [>] Verifying fork
10:54:40 [+] Fork created
10:54:40 [+] Fork verified (parent: sherlock-project/sherlock)
[... manual prompt + ENTER ...]
10:54:56 [>] Enabling 'Actions can approve PRs' on fork (mirrors upstream setting)
10:54:56 [+] Setting enabled
10:54:56 [>] --vulnerable: rolling fork back to commit 271608fb
10:54:59 [+] Fork master rolled back to vulnerable commit
10:55:00 [+] Injected payload key into sherlock_project/resources/data.json
10:55:04 [+] PR opened: https://github.com/youruser/sherlock/pull/1
10:55:10 [+] Workflow run found: https://github.com/youruser/sherlock/actions/runs/...
10:55:10 [>] Polling OAST for token while workflow is alive
10:55:55 [+] Token captured: x-access-token:ghs_RL6tq56Kmr1USgAHsKeqQdfKc304ij36XOke
10:55:55 [>] Approving PR #1 on youruser/sherlock with stolen token
10:55:56 [+] PR approved by github-actions[bot]: state=APPROVED
10:55:56 [+] Review URL: https://github.com/youruser/sherlock/pull/1#pullrequestreview-...
10:55:56 [+] Attack chain complete, skipping the rest of the workflow run
10:55:56 [+] ======================================================================
10:55:56 [+] VULNERABILITY CONFIRMED: GITHUB_TOKEN exfiltrated
10:55:56 [+] Decoded credential: x-access-token:ghs_RL6tq56Kmr1USgAHsKeqQdfKc304ij36XOke
10:55:56 [+] PR auto-approved via API: state=APPROVED
10:55:56 [+] (Token is short-lived and tied to this workflow run.)
10:55:56 [+] ======================================================================
10:55:56 [>] Cleanup: deleting remote branch poc-cve-pr-target-...
10:55:58 [+] Done

Exemplo de saída (corrigido, modo exfil)

root@kitploit:~
10:18:00 [>] Polling OAST for token while workflow is alive
[... no token captured for the entire 180-second window ...]
10:21:00 [*]   status=completed conclusion=failure
10:21:00 [+] ======================================================================
10:21:00 [*] FIX VERIFIED: no token exfiltrated from the runner
10:21:00 [*] No 'http.extraheader=AUTHORIZATION: basic ...' found in OAST log
10:21:00 [*] Either the injection was blocked, or persist-credentials: false
10:21:00 [*] kept the token out of the git config (defense in depth).
10:21:00 [+] ======================================================================

Aviso legal

Este repositório é publicado apenas para fins educacionais e de pesquisa em segurança. A vulnerabilidade foi divulgada de forma responsável aos mantenedores, corrigida no upstream, e um CVE foi solicitado. Não execute este PoC contra repositórios que você não possui ou para os quais não tem permissão explícita de teste. O autor não é responsável por qualquer uso indevido.

Licença

MIT

Baixar ferramenta