AWS - Abusing Lambda Extensions
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
Last updated