AWS IAM 정책은 권한 에스컬레이션을 허용하지 않아야 합니다.

 

AWS IAM(신원 및 액세스 관리)은 AWS 리소스에 대한 액세스를 정의하는 서비스입니다. IAM의 핵심 구성 요소 중 하나는 ID 또는 리소스에 연결될 때 해당 권한을 정의하는 정책입니다. 아이덴티티(사용자, 그룹 또는 역할)에 권한을 부여하는 정책을 아이덴티티 기반 정책이라고 합니다. 이러한 정책은 리소스 목록에 대해 미리 정의된 일련의 작업을 수행할 수 있는 기능을 ID에 추가합니다.

다음은 사용자에게 자신의 액세스 키를 관리할 수 있는 기능을 부여하는 제한된 권한 집합을 정의하는 정책 문서의 예입니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "iam:CreateAccessKey",
        "iam:DeleteAccessKey",
        "iam:ListAccessKeys",
        "iam:UpdateAccessKey"
      ],
      "Resource": "arn:aws:iam::245500951992:user/${aws:username}",
      "Effect": "Allow",
      "Sid": "AllowManageOwnAccessKeys"
    }
  ]
}

권한 에스컬레이션은 일반적으로 ID 정책에서 ID에 이미 가지고 있는 권한보다 더 많은 권한을 부여할 수 있는 기능을 제공할 때 발생합니다. 다음은 권한 에스컬레이션을 숨기는 정책 문서의 또 다른 예입니다. 이 정책은 높은 권한을 가진 사용자를 포함하여 계정의 모든 사용자에 대해 새 액세스 키를 생성할 수 있도록 허용합니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "iam:CreateAccessKey",
        "iam:DeleteAccessKey",
        "iam:ListAccessKeys",
        "iam:UpdateAccessKey"
      ],
      "Resource": "*",
      "Effect": "Allow",
      "Sid": "AllowManageOwnAccessKeys"
    }
  ]
}

이 정책은 제한된 권한만 부여하는 것처럼 보이지만, 실제로는 연결된 아이디에 가장 높은 권한을 부여합니다.

권한 상승은 악의적인 사용자가 자신이 제어하던 낮은 권한의 계정에서 높은 권한의 계정으로 쉽게 에스컬레이션할 수 있게 해주기 때문에 심각한 문제입니다.

위의 예는 많은 권한 상승 벡터 중 하나에 불과합니다. 다음은 규칙이 탐지할 수 있는 벡터 목록입니다:

벡터 이름 요약
정책 버전 만들기 새 IAM 정책을 만들고 기본값으로 설정합니다.
기본 정책 버전 설정 다른 IAM 정책 버전을 기본값으로 설정합니다.
Create AccessKey 사용자에 대한 새 액세스 키를 만듭니다.
로그인 프로필 만들기 공격자가 선택한 비밀번호로 로그인 프로필 만들기
로그인 프로필 업데이트 기존 비밀번호를 공격자가 선택한 비밀번호로 업데이트합니다.
사용자 정책 첨부 공격자가 제어하는 사용자에게 “AdministratorAccess”와 같은 허용 IAM 정책을 첨부합니다.
그룹 정책 첨부 공격자가 제어하는 사용자가 포함된 그룹에 “AdministratorAccess”와 같은 허용 IAM 정책을 첨부합니다.
역할 정책 첨부 공격자가 제어하는 사용자가 맡을 수 있는 역할에 “AdministratorAccess”와 같은 허용 IAM 정책을 첨부합니다.
사용자 정책 넣기 공격자가 제어하는 사용자로부터 기존 인라인 IAM 정책을 변경합니다.
그룹 정책 넣기 공격자가 제어하는 사용자가 포함된 그룹에서 기존 인라인 IAM 정책을 변경합니다.
역할 정책 넣기 기존 인라인 IAM 역할 정책을 변경합니다. 그러면 공격자가 제어하는 사용자에게 규칙이 적용됩니다.
그룹에 사용자 추가 공격자가 제어하는 사용자를 더 넓은 범위의 권한이 있는 그룹에 추가합니다.
역할 정책 가정 업데이트 공격자가 제어하는 사용자가 역할을 가정할 수 있도록 역할의 “역할 정책 문서”를 업데이트합니다.
EC2 높은 권한으로 실행할 EC2 인스턴스 만들기
람다 생성 및 호출 높은 권한으로 실행할 람다 함수를 생성하고 이를 호출합니다.
람다 생성 및 권한 추가 높은 권한으로 실행할 람다 함수를 생성하고 사용자 또는 서비스에 호출할 권한을 부여합니다.
외부 이벤트로 트리거된 람다 높은 권한으로 실행할 람다 함수를 만들고 외부 이벤트에 연결합니다.
람다 코드 업데이트 높은 권한으로 실행되는 람다 함수의 코드를 업데이트합니다.
CloudFormation 높은 권한으로 실행할 CloudFormation 스택을 생성합니다.
데이터 파이프라인 높은 권한으로 실행할 파이프라인 만들기
Glue 개발 엔드포인트 높은 권한으로 실행할 Glue 개발 엔드포인트 만들기
Update Glue 개발 엔드포인트 Glue 엔드포인트에 연결된 SSH 키를 업데이트합니다.

권한 상승을 방지하기 위한 일반적인 권장 사항은 민감한 권한이 부여되는 리소스를 제한하는 것입니다. 위의 첫 번째 예는 권한 에스컬레이션이 불가능한 좁은 범위의 리소스에 민감한 권한이 사용되는 것을 보여주는 좋은 예입니다.

규칙을 어긴 코드

다음 정책에 따라 공격자는 모든 람다 함수의 코드를 업데이트할 수 있습니다. 공격자는 높은 권한으로 실행되는 람다의 코드를 변경하여 권한 상승을 달성할 수 있습니다.

from aws_cdk.aws_iam import Effect, PolicyDocument, PolicyStatement

PolicyDocument(
    statements=[
        PolicyStatement(
            effect=Effect.ALLOW,
            actions=["lambda:UpdateFunctionCode"],
            resources=["*"]  # 규칙을 어긴 코드
        )
    ]
)

규칙을 준수한 해결책

특정 람다 함수의 코드에 대한 업데이트만 허용되도록 정책을 좁히세요.

from aws_cdk.aws_iam import Effect, PolicyDocument, PolicyStatement

PolicyDocument(
    statements=[
        PolicyStatement(
            effect=Effect.ALLOW,
            actions=["lambda:UpdateFunctionCode"],
            resources=[
                "arn:aws:lambda:us-east-2:123456789012:function:my-function:1"
            ]
        )
    ]
)

같이보면 좋은 자료

If you like SONARKUBE, don’t forget to give me a star. :star2:

원문으로 바로가기

Star This Project