AWS - Lambda Layers Persistence
Camadas Lambda
Uma camada Lambda é um arquivo de arquivo .zip que pode conter código adicional ou outro conteúdo. Uma camada pode conter bibliotecas, um tempo de execução personalizado, dados ou arquivos de configuração.
É possível incluir até cinco camadas por função. Quando você inclui uma camada em uma função, o conteúdo é extraído para o diretório /opt
no ambiente de execução.
Por padrão, as camadas que você cria são privadas para sua conta AWS. Você pode optar por compartilhar uma camada com outras contas ou tornar a camada pública. Se suas funções consomem uma camada que uma conta diferente publicou, suas funções podem continuar a usar a versão da camada depois que ela foi excluída, ou depois que sua permissão de acesso à camada for revogada. No entanto, você não pode criar uma nova função ou atualizar funções usando uma versão de camada excluída.
Funções implantadas como uma imagem de contêiner não usam camadas. Em vez disso, você empacota seu tempo de execução preferido, bibliotecas e outras dependências na imagem do contêiner quando você constrói a imagem.
Caminho de carregamento Python
O caminho de carregamento que o Python usará no lambda é o seguinte:
Verifique como o segundo e terceiro posições são ocupadas por diretórios onde camadas lambda descompactam seus arquivos: /opt/python/lib/python3.9/site-packages
e /opt/python
Se um atacante conseguir inserir um backdoor em uma camada lambda usada ou adicionar uma que executará código arbitrário quando uma biblioteca comum for carregada, ele poderá executar código malicioso a cada invocação lambda.
Portanto, os requisitos são:
Verificar as bibliotecas que são carregadas pelo código das vítimas
Criar uma biblioteca proxy com camadas lambda que irá executar código personalizado e carregar a biblioteca original.
Bibliotecas pré-carregadas
Ao abusar dessa técnica, encontrei uma dificuldade: Algumas bibliotecas são já carregadas em tempo de execução do python quando seu código é executado. Eu esperava encontrar coisas como os
ou sys
, mas até a biblioteca json
estava carregada.
Para abusar dessa técnica de persistência, o código precisa carregar uma nova biblioteca que não está carregada quando o código é executado.
Com um código python como este, é possível obter a lista de bibliotecas que estão pré-carregadas dentro do tempo de execução do python no lambda:
E esta é a lista (verifique se bibliotecas como os
ou json
já estão lá)
E esta é a lista de bibliotecas que o lambda inclui instaladas por padrão: https://gist.github.com/gene1wood/4a052f39490fae00e0c3
Inserção de Backdoor na Camada Lambda
Neste exemplo, vamos supor que o código alvo está importando csv
. Vamos inserir um backdoor na importação da biblioteca csv
.
Para fazer isso, vamos criar o diretório csv com o arquivo __init__.py
nele, em um caminho que é carregado pelo lambda: /opt/python/lib/python3.9/site-packages
Então, quando o lambda é executado e tenta carregar o csv, nosso arquivo __init__.py
será carregado e executado.
Este arquivo deve:
Executar nossa carga útil
Carregar a biblioteca csv original
Podemos fazer ambos com:
Em seguida, crie um arquivo zip com este código no caminho python/lib/python3.9/site-packages/__init__.py
e adicione-o como uma camada lambda.
Você pode encontrar este código em https://github.com/carlospolop/LambdaLayerBackdoor
O payload integrado irá enviar as credenciais IAM para um servidor NA PRIMEIRA VEZ que for invocado ou APÓS um reset do contêiner lambda (mudança de código ou lambda fria), mas outras técnicas como as seguintes também podem ser integradas:
AWS - Steal Lambda RequestsCamadas Externas
Observe que é possível usar camadas lambda de contas externas. Além disso, uma lambda pode usar uma camada de uma conta externa mesmo que não tenha permissões. Também observe que o número máximo de camadas que uma lambda pode ter é 5.
Portanto, para melhorar a versatilidade desta técnica, um atacante poderia:
Inserir um backdoor em uma camada existente do usuário (nada é externo)
Criar uma camada em sua conta, dar acesso da conta da vítima para usar a camada, configurar a camada na Lambda da vítima e remover a permissão.
A Lambda ainda poderá usar a camada e a vítima não terá uma maneira fácil de baixar o código das camadas (exceto obtendo um shell reverso dentro da lambda)
A vítima não verá camadas externas usadas com
aws lambda list-layers
Last updated