
Versão maliciosa de rwl.angular-console executava payload ofuscado ao abrir um workspace, coletava segredos de ferramentas de desenvolvimento e mantinha backdoor em sistemas macOS.
| Componente | Extensão rwl.angular-console do Nx Console para Visual Studio Code, especificamente a versão 18.95.0 publicada no VS Code Marketplace. |
| Vetor | Execução automática ao abrir qualquer workspace no VS Code, com download e execução de um payload index.js ofuscado a partir de um commit órfão no repositório nrwl/nx. |
| Impacto | Coleta e exfiltração de credenciais de desenvolvedor, incluindo segredos de 1Password, configurações do Anthropic Claude Code, tokens de npm, credenciais do GitHub e chaves da AWS. |
| Prioridade | Atualizar para 18.100.0 ou versão posterior, remover artefatos maliciosos, encerrar processos associados e rotacionar credenciais acessíveis a partir da máquina afetada. |
| Versões | 18.95.0 foi a versão afetada; a versão Open VSX não foi indicada como comprometida. |
| Artefatos | ~/.local/share/kitty/cat.py, ~/Library/LaunchAgents/com.user.kitty-monitor.plist, /var/tmp/.gh_update_state, /tmp/kitty-* e processo com variável de ambiente __DAEMONIZED=1. |
| Janela | Instalações da versão 18.95.0 durante a exposição entre 18 de maio de 2026, 14:36 CEST, e 18 de maio de 2026, 14:47 CEST, exigem investigação. |
A cadeia de distribuição do Nx Console foi afetada por uma versão comprometida da extensão rwl.angular-console no Microsoft Visual Studio Code Marketplace. O componente é usado como interface de desenvolvimento para projetos Nx em editores como VS Code, Cursor e ambientes JetBrains, e a extensão no VS Code acumula mais de 2,2 milhões de instalações. O incidente ficou concentrado na versão 18.95.0, enquanto a variante distribuída por Open VSX não foi apontada como afetada. A versão maliciosa não dependia de interação complexa do usuário: bastava que o desenvolvedor abrisse um workspace para que a rotina implantada na extensão disparasse a cadeia de execução.
O comprometimento foi viabilizado pelo uso indevido de credenciais GitHub de um desenvolvedor do projeto, obtidas em um incidente anterior não detalhado. Com esse acesso, o invasor conseguiu inserir um commit órfão e não assinado no repositório oficial nrwl/nx, usado como ponto de hospedagem do payload. A extensão comprometida buscava esse conteúdo e executava um arquivo index.js ofuscado de aproximadamente 498 KB. A escolha de um commit órfão dentro de um repositório legítimo reduzia a aparência de infraestrutura externa suspeita e aproximava a carga maliciosa do fluxo normal de confiança usado por desenvolvedores.
A carga executada combinava roubo de credenciais, exfiltração por múltiplos canais e capacidade de envenenamento de supply chain. O malware procurava segredos em cofres e ferramentas de desenvolvimento, incluindo 1Password, configurações do Anthropic Claude Code, credenciais associadas a npm, GitHub e AWS. Em sistemas macOS, havia ainda a instalação de um backdoor em Python que abusava da API GitHub Search como mecanismo de resolução de comandos. O objetivo operacional era obter material de autenticação com valor direto para publicação de pacotes, acesso a repositórios, uso de serviços em nuvem e movimentação para outros ativos de desenvolvimento.
O fluxo começava dentro do próprio editor. Após a instalação da versão 18.95.0, a extensão ativava a lógica maliciosa quando qualquer workspace era aberto. Essa condição é crítica porque transforma uma ação rotineira do desenvolvedor em gatilho de execução. Em vez de depender de um comando manual ou de uma etapa explícita de build, o código comprometido era acionado no ciclo normal de uso do VS Code. A rotina instalava o runtime JavaScript Bun para executar o payload ofuscado index.js, criando uma dependência de execução externa ao Node.js normalmente esperado em muitos ambientes.
Depois da ativação, o payload executava verificações para evitar infecção em máquinas que aparentassem estar em fusos horários russos ou da Comunidade dos Estados Independentes. Esse tipo de exclusão geográfica é um sinal comum em operações criminosas, mas não prova atribuição por si só. Em seguida, a carga passava a operar como processo em segundo plano, separado do fluxo visível do editor. A presença de um processo com __DAEMONIZED=1 no ambiente e de um processo Python executando cat.py foi listada como indicador local da execução maliciosa.
A etapa de coleta focava em segredos de alto valor para ambientes de engenharia. Credenciais de 1Password e dados de configuração do Claude Code podiam expor sessões, tokens e integrações usadas por desenvolvedores. Tokens de npm e GitHub poderiam permitir publicação, alteração de pacotes, acesso a repositórios privados e leitura de configurações de pipeline. Credenciais da AWS ampliariam o impacto para infraestrutura em nuvem, com risco condicionado às permissões reais das chaves. A exfiltração era feita por HTTPS, pela API do GitHub e por tunelamento DNS, oferecendo caminhos alternativos caso um dos canais fosse bloqueado ou menos confiável.
Um ponto técnico relevante era a presença de integração com Sigstore, incluindo emissão de certificados Fulcio e geração de proveniência SLSA. Em combinação com tokens OIDC de npm roubados, essa capacidade poderia permitir publicação de pacotes derivados com atestações criptográficas válidas, fazendo com que artefatos maliciosos parecessem builds verificados. O risco, portanto, não se limitava à máquina infectada: credenciais extraídas de um ambiente de desenvolvimento poderiam sustentar novos comprometimentos em pacotes, pipelines e consumidores downstream.
A superfície primária é composta por desenvolvedores que instalaram a versão 18.95.0 da extensão rwl.angular-console pelo VS Code Marketplace durante a janela de exposição informada, entre 18 de maio de 2026, 14:36 CEST, e 18 de maio de 2026, 14:47 CEST. Organizações que sincronizam extensões de editor, usam imagens de estáção de trabalho padronizadas ou permitem instalação automática de extensões em ambientes de engenharia devem verificar se a versão afetada foi propagada para múltiplos endpoints. A ausência de impacto informado para Open VSX reduz o escopo para esse canal, mas não elimina a necessidade de validar instalações locais do VS Code e editores compatíveis que consumam a extensão do Marketplace.
A exposição é especialmente sensível em estáções usadas para manutenção de pacotes, administração de repositórios, publicação em npm, uso de GitHub Actions, acesso a contas AWS e desenvolvimento com assistentes baseados em LLM. Máquinas com cofres 1Password, configurações do Claude Code, chaves SSH, tokens persistidos no ambiente, perfis de cloud e credenciais em arquivos de configuração têm maior probabilidade de conter dados úteis para o invasor. O incidente também exige atenção a caches, lockfiles, diretórios temporários e artefatos de sessão, porque o payload procurava credenciais já presentes no endpoint, não apenas segredos declarados no workspace ativo.
O backdoor em Python observado no macOS amplia a superfície pós-execução. O arquivo ~/Library/LaunchAgents/com.user.kitty-monitor.plist indica tentativa de persistência via LaunchAgent, enquanto ~/.local/share/kitty/cat.py, /var/tmp/.gh_update_state e arquivos sob /tmp/kitty-* são artefatos locais que ajudam a distinguir máquinas executadas apenas brevemente de sistemas onde a persistência foi instalada. Em ambientes Windows e Linux, a investigação deve partir da instalação da versão afetada, do histórico de execução da extensão, dos processos do editor e da presença de tráfego de exfiltração, ainda que alguns indicadores listados sejam específicos de caminhos Unix ou macOS.
- Instalações de
rwl.angular-consolena versão18.95.0obtidas pelo VS Code Marketplace. - Estáções de trabalho de desenvolvedores com tokens de
npm, GitHub, AWS, chaves SSH, cofres1Passwordou configurações do Claude Code. - Ambientes macOS com
LaunchAgentsuspeito em~/Library/LaunchAgents/com.user.kitty-monitor.plist. - Endpoints que abriram workspaces no VS Code após a instalação da versão comprometida.
A investigação deve começar pelo inventário de extensões instaladas. Em estáções gerenciadas, colete versão, origem e horário de instalação de rwl.angular-console, com foco na versão 18.95.0 e na janela de 18 de maio de 2026. Em seguida, correlacione a abertura de workspaces no VS Code com criação de processos filhos, instalação do Bun, execução de JavaScript ofuscado e abertura de processos em segundo plano. A cadeia descrita cria uma relação temporal curta entre uso do editor, execução do payload e início de coleta de segredos.
No endpoint, procure arquivos e processos associados aos indicadores confirmados. Em macOS, a presença de ~/Library/LaunchAgents/com.user.kitty-monitor.plist deve ser tratada como sinal de persistência até prova em contrário. O arquivo ~/.local/share/kitty/cat.py merece análise estática e preservação forense antes da remoção, porque pode conter lógica de backdoor e parâmetros de comunicação. O arquivo /var/tmp/.gh_update_state e caminhos /tmp/kitty-* ajudam a reconstruir estado de execução, temporários e possível staging. Processos Python executando cat.py e processos com __DAEMONIZED=1 no ambiente devem ser encerrados somente após coleta mínima de evidências necessárias para resposta.
Na rede, a telemetria deve buscar conexões HTTPS incomuns feitas a partir do processo do VS Code, do runtime Bun ou de processos Python recém-criados. Chamadas à API do GitHub em sequência anormal, especialmente quando originadas de processos não esperados para aquele usuário, podem indicar exfiltração ou uso do GitHub Search como mecanismo de resolução de comando. Consultas DNS com volume, entropia ou tamanho fora do padrão devem ser avaliadas como possível tunelamento. A análise precisa considerar que GitHub e HTTPS são serviços legítimos no fluxo de desenvolvimento; por isso, a correlação com árvore de processos e horários de instalação é mais útil do que bloqueios genéricos.
Em identidade e DevOps, revise logs de npm, GitHub e AWS em busca de uso de tokens a partir de endereços, horários, agentes de usuário ou regiões incomuns após a exposição. Para GitHub, verifique criação de commits incomuns, acesso a repositórios privados, geração ou uso de tokens, execução de workflows e alterações em segredos de Actions. Para npm, priorize eventos de publicação, alteração de mantenedores, criação de tokens e uso de OIDC. Para AWS, valide chamadas feitas com credenciais de desenvolvedores, principalmente ações de leitura de segredos, enumeração, criação de chaves e alterações em políticas.
- Versão
18.95.0derwl.angular-consoleinstalada pelo VS Code Marketplace durante a janela de exposição. - Execução de Bun ou
index.jsofuscado iniciada a partir do processo do VS Code. - Processo Python executando
cat.pye processo com variável de ambiente__DAEMONIZED=1. - Arquivos
~/.local/share/kitty/cat.py,~/Library/LaunchAgents/com.user.kitty-monitor.plist,/var/tmp/.gh_update_statee/tmp/kitty-*. - Chamadas anormais à API do GitHub, tráfego HTTPS de processos do editor e padrões compatíveis com tunelamento DNS.
A primeira ação é remover a versão comprometida e atualizar o Nx Console para 18.100.0 ou posterior. Essa atualização deve ser acompanhada de validação do inventário, porque apenas atualizar a extensão não invalida segredos que já possam ter sido coletados. Máquinas com instalação confirmada de 18.95.0 devem ser tratadas como potencialmente expostas se qualquer workspace tiver sido aberto após a instalação. O processo de resposta deve preservar logs e metadados suficientes para determinar janela de execução, contas afetadas e credenciais acessíveis a partir do endpoint.
A contenção local deve encerrar processos associados após coleta de evidências, remover artefatos em disco e eliminar persistência. Em macOS, revise LaunchAgents do usuário e remova com.user.kitty-monitor.plist quando confirmado como parte do incidente. Apague cat.py, arquivos de estado e temporários relacionados apenas depois de registrar hashes internos, horários de criação, proprietário, permissões e caminho completo. Em estáções corporativas, use EDR ou MDM para consultar a presença dos artefatos em larga escala e isolar endpoints com execução confirmada antes que continuem usando tokens corporativos.
A rotação de credenciais é obrigatória para segredos acessíveis pela máquina afetada. Isso inclui tokens de npm, GitHub, AWS, chaves SSH, segredos de CI/CD, credenciais armazenadas em 1Password, configurações do Claude Code e qualquer token presente em arquivos .env, histórico de shell, caches de ferramenta ou perfis locais. A ordem deve priorizar credenciais com permissão de publicação, administração, escrita em repositórios, acesso a segredos e controle de infraestrutura. Quando possível, revogue tokens antes de emitir substitutos, force nova autenticação e reduza escopos permissivos que não sejam necessários.
Depois da contenção, valide integridade de pacotes, repositórios e pipelines mantidos por usuários afetados. Revise publicações recentes em npm, alterações em workflows, commits, tags, releases e atestações de proveniência que tenham ocorrido após a janela de exposição. O uso de Sigstore e SLSA pelo payload aumenta a importância de não confiar apenas na presença de assinatura como prova de legitimidade. Assinaturas e proveniência continuam úteis, mas devem ser avaliadas junto com identidade emissora, origem do workflow, repositório, horário, runner e evento que gerou o artefato.
- Atualizar
rwl.angular-consolepara18.100.0ou posterior e bloquear a versão18.95.0em políticas de extensão. - Isolar endpoints com execução confirmada, coletar evidências mínimas e remover
cat.py,com.user.kitty-monitor.plist,/var/tmp/.gh_update_statee/tmp/kitty-*quando aplicável. - Revogar e recriar tokens de
npm, GitHub, AWS, chaves SSH e segredos de CI/CD acessíveis pela máquina afetada. - Revisar publicações, commits, workflows, releases e atestações geradas após 18 de maio de 2026 na janela de risco.
- Monitorar uso posterior de credenciais antigas e criar alertas para chamadas GitHub,
npme AWS fora do padrão do usuário.
0 Comentários