lambda:UpdateFunctionCode による権限昇格のおそれがある IAM ロール

Lambda コードの変更を、承認されたデプロイロールと関数に限定してください。

説明

lambda:UpdateFunctionCode を広く許可すると、既存の Lambda 関数コードを任意に変更できます。変更したコードが実行されると、その関数の実行ロールの権限でデータにアクセスし、AWS 操作を行えるため、間接的な権限昇格の経路になり得ます。

コード変更の権限自体が、関数呼び出しの権限を付与するわけではありません。実際の実行経路、使用中のバージョン・エイリアス、実行ロールの権限を併せて確認してください。

想定される影響

  • 変更したコードの実行により、実行ロールがアクセスできるデータが漏えい・変更されるおそれがあります。
  • 正常な機能の改変や、サービス動作の中断につながる場合があります。

対処方法

  • 不要なロールから lambda:UpdateFunctionCode を削除し、承認済みの CI/CD ロールと対象関数 ARN に限定してください。
  • 実行ロールを最小権限に保ち、重要なコードのデプロイにはレビューと承認を適用してください。
  • コード変更を監視し、実行されるバージョンとエイリアスが承認済みのデプロイを指すことを確認してください。

例

ロール権限の抜粋です。省略した必須の assume_role_policy は、承認された主体だけを信頼するよう別途構成してください。

変更前

hcl
resource "aws_iam_role" "example" {
  name = "cosmic"
}

resource "aws_iam_role_policy" "example" {
  name = "test_inline_policy"
  role = aws_iam_role.example.name

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = [
          "lambda:UpdateFunctionCode",
        ]
        Effect   = "Allow"
        Resource = "*"
      },
    ]
  })
}

変更後

hcl
resource "aws_iam_role" "example" {
  name = "cosmic"
}

resource "aws_iam_role_policy" "example" {
  name = "inline_policy_run_instances"
  role = aws_iam_role.example.name

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = [
          "ec2:Describe*",
        ]
        Effect   = "Allow"
        Resource = "*"
      },
    ]
  })
}

補足:

  • 変更前: 対象関数を限定せずにコード変更を許可します。影響は変更したコードの実行と実行ロールの権限に左右されます。
  • 変更後: 同じロールの例示ポリシーを EC2 の参照に限定します。他のポリシーのコード変更権限も削除し、ec2:Describe* は必要な参照だけを許可してください。

参考資料