AWS - Abusing Lambda Extensions

Support HackTricks

Lambda Extensions

As extensões Lambda aprimoram funções integrando-se com várias ferramentas de monitoramento, observabilidade, segurança e governança. Essas extensões, adicionadas via .zip archives usando Lambda layers ou incluídas em container image deployments, operam em dois modos: interno e externo.

  • Extensões internas se fundem com o processo de runtime, manipulando seu início usando variáveis de ambiente específicas da linguagem e scripts wrapper. Esta personalização se aplica a uma variedade de runtimes, incluindo Java Correto 8 e 11, Node.js 10 e 12, e .NET Core 3.1.

  • Extensões externas funcionam como processos separados, mantendo a operação alinhada com o ciclo de vida da função Lambda. Elas são compatíveis com vários runtimes como Node.js 10 e 12, Python 3.7 e 3.8, Ruby 2.5 e 2.7, Java Corretto 8 e 11, .NET Core 3.1, e runtimes personalizados.

Para mais informações sobre como funcionam as extensões lambda, consulte a documentação.

Extensão Externa para Persistência, Roubo de Requisições e Modificação de Requisições

Este é um resumo da técnica proposta neste post: https://www.clearvector.com/blog/lambda-spy/

Foi descoberto que o kernel Linux padrão no ambiente de runtime Lambda é compilado com as chamadas de sistema “process_vm_readv” e “process_vm_writev”. E todos os processos são executados com o mesmo ID de usuário, até mesmo o novo processo criado para a extensão externa. Isso significa que uma extensão externa tem acesso total de leitura e escrita à memória heap do Rapid, por design.

Além disso, enquanto as extensões Lambda têm a capacidade de assinar eventos de invocação, a AWS não revela os dados brutos para essas extensões. Isso garante que as extensões não possam acessar informações sensíveis transmitidas via a requisição HTTP.

O processo Init (Rapid) monitora todas as requisições de API em http://127.0.0.1:9001 enquanto as extensões Lambda são inicializadas e executadas antes da execução de qualquer código de runtime, mas após o Rapid.

A variável AWS_LAMBDA_RUNTIME_API indica o IP e o número da porta da API Rapid para processos de runtime filhos e extensões adicionais.

Alterando a variável de ambiente AWS_LAMBDA_RUNTIME_API para uma porta à qual temos acesso, é possível interceptar todas as ações dentro do runtime Lambda (man-in-the-middle). Isso é possível porque a extensão é executada com os mesmos privilégios que o Rapid Init, e o kernel do sistema permite a modificação da memória do processo, possibilitando a alteração do número da porta.

Como as extensões são executadas antes de qualquer código de runtime, modificar a variável de ambiente influenciará o processo de runtime (por exemplo, Python, Java, Node, Ruby) ao iniciar. Além disso, extensões carregadas após a nossa, que dependem dessa variável, também passarão pela nossa extensão. Esta configuração poderia permitir que malware contornasse completamente medidas de segurança ou extensões de logging diretamente dentro do ambiente de runtime.

A ferramenta lambda-spy foi criada para realizar essa escrita de memória e roubar informações sensíveis de requisições lambda, outras extensões requisições e até mesmo modificá-las.

Referências

Support HackTricks

Last updated