하루 1억 AWS 요금 폭탄은 어떻게 만들어지나 — 해킹, 그리고 보이지 않는 비용

하루 1억 AWS 요금 폭탄은 어떻게 만들어지나 — 해킹, 그리고 보이지 않는 비용

최근 지인 회사의 이야기를 전해 들었다. AWS 계정이 해킹당했는데, 서버가 털린 것도 데이터가 유출된 것도 아니었다. 청구서였다. Amazon Bedrock API 호출만으로 하루 1억 원 가까이 과금되고 있었다.

처음엔 과장이라고 생각했다. 그런데 수치를 찾아보니 무시할 규모가 아니었다. Sysdig는 2024년 당시 Claude 3 Opus를 여러 리전 한도까지 악용하면 피해액이 하루 10만 달러를 넘을 수 있다고 추산했다.12 이는 실측 청구서가 아니라 당시 가격과 쿼터에 기반한 잠재 상한 추정이다.

이 글은 그 사고를 계기로 썼다. 공격이 실제로 어떻게 들어오는지, 그리고 우리가 클라우드 운영에 기본으로 적용하는 계정 관리·키 관리·비용 차단 장치를 순서대로 짚는다.

공격은 이렇게 들어온다: LLMjacking

Sysdig가 2024년 5월 LLMjacking이라고 이름 붙인 공격이다.1 구조는 단순하다.

  1. 개발자의 액세스 키가 유출된다. GitHub 공개 커밋에 딸려 올라간 .env, CI 로그에 찍힌 환경 변수, 개발 PC의 인포스틸러 감염이 대표적인 경로다.
  2. 공격자는 훔친 키로 리소스를 만들지 않는다. 조용히 InvokeModel 권한만 확인한다.
  3. 탈취한 Bedrock 접근 권한을 리버스 프록시에 물려 월 30달러짜리 "무제한 LLM" 상품으로 재판매한다.2
  4. 전 세계 구매자들의 트래픽이 피해자 계정으로 흘러들고, 과금은 리전별 쿼터 한도까지 치솟는다.

무서운 점은 조용함이다. EC2를 수십 대 띄우는 코인 채굴형 침해는 리소스 목록만 봐도 티가 난다. LLMjacking은 아무것도 생성하지 않는다. API 호출 로그와 청구서에만 흔적이 남고, 청구서는 보통 다음 달에야 읽힌다.

1억은 얼마 만에 쌓이나

숫자로 규모를 확인해 보자. 아래는 2025년 11월 공개된 Bedrock의 Claude Opus 4.5 가격 스냅샷인 입력 100만 토큰당 5달러, 출력 100만 토큰당 25달러를 적용한 산술 예시다.3 환율 1,400원이면 1억 원은 약 71,000달러다.

호출 패턴토큰 가정호출당 비용1억 원(약 71,000달러)까지 호출 수
짧은 채팅입력 1K·출력 1K약 0.03달러약 238만 회
장문 생성입력 2K·출력 8K약 0.21달러약 34만 회
대용량 컨텍스트입력 200K·출력 8K약 1.20달러약 6만 회

이 표는 청구 규모의 산술만 보여 준다. 실제 도달 시간은 모델별 TPM·TPD 쿼터, 교차 리전 추론, 응답 길이와 지연에 따라 크게 달라지므로 동시 스트림 수만으로 단정할 수 없다. 리소스를 만들지 않아도 토큰 사용량만으로 큰 비용은 발생한다.

탈취된 자격증명에서 피해 계정 청구로 이어지는 LLMjacking 공격 사슬과 단기 자격증명, SCP, 애플리케이션 한도, Bedrock 런타임 알람, 지연된 예산 백스톱
LLMjacking의 공격 사슬과 네 겹의 방어 레이어. 앞의 세 층은 노출을 줄이거나 사용량을 알리고, 예산 층은 지연된 재무 백스톱이 된다.

계정 관리의 기본: 훔칠 키를 없앤다

LLMjacking의 흔한 시작점은 코드·로그·개발 장비에서 유출된 자격증명이다. 특히 만료 시간이 긴 IAM 액세스 키는 공격자에게 악용 시간을 넓혀 준다. 우리가 계정을 설정할 때 따르는 기본 순서는 이렇다.

  • 루트 계정: MFA를 걸고, 루트 액세스 키는 만들지 않는다. 이미 있다면 삭제한다.
  • 사람: IAM 사용자 대신 IAM Identity Center(SSO)로 로그인한다. 발급되는 자격증명은 세션이 끝나면 만료된다.
  • 워크로드: EC2 인스턴스 프로파일, EKS의 IRSA, Lambda 실행 역할처럼 IAM 역할을 통해 STS 단기 자격증명을 받는다. 코드와 설정 파일에 키가 존재할 이유가 없다.
  • 감사: CloudTrail을 전 리전에 켜고, GuardDuty로 비정상 API 호출을 탐지한다.

여기까지가 기본이다. 새로운 것도, 비싼 것도 없다. 그런데 유출 사고의 대부분은 이 기본이 빠진 자리에서 난다.

Bedrock 키 관리: 발급보다 회수를 설계한다

Bedrock에는 함정이 하나 더 있다. 2025년 7월에 도입된 Bedrock API 키다.4 개발 편의를 위해 나온 기능인데, 두 종류의 성격이 완전히 다르다.

단기 API 키장기 API 키
유효 기간콘솔 세션 동안, 최대 12시간1일 ~ 무기한
실체현재 IAM 주체의 권한을 그대로 사용IAM 사용자가 자동 생성되어 연결
용도개발·테스트AWS 권고: 탐색 용도에 한정

장기 키는 사실상 만료 없는 IAM 사용자 자격증명이 하나 더 생기는 것과 같다. Wiz가 "AWS에 새로 등장한 장기 수명 키"라고 경고한 지점이다.5 우리가 잡는 원칙은 세 가지다.

  • 프로덕션 워크로드는 API 키가 아니라 IAM 역할 + STS로 Bedrock을 호출한다.
  • 장기 API 키가 필요 없는 조직이라면 IAM condition key로 장기 키 생성 자체를 차단한다. 2025년 9월에 키 생성·만료·종류를 통제하는 조건 키가 추가됐다.6
  • 모델 호출 로깅(invocation logging)을 켜서 누가 어떤 모델을 얼마나 호출하는지 남긴다.7 침해 조사 때 CloudTrail과 함께 첫 번째로 보는 데이터다. 요청·응답 본문까지 저장할 수 있으므로 민감정보의 보존 기간과 접근 정책을 먼저 정한다.
비슷한 과제를 다루고 계신가요?기술 과제 검토 요청

폭주를 구조적으로 막는 장치

키 관리가 뚫려도 피해를 하루 1억이 아니라 몇만 원에서 끊어야 한다. 여기부터는 예방이 아니라 폭발 반경(blast radius)의 문제다.

  • 사용하지 않는 리전과 모델은 SCP·IAM 정책으로 거부한다. 여러 리전의 한도를 악용하는 공격 경로를 줄이고,2 서울 리전만 쓰는 조직이라면 다른 리전의 고비용 모델을 허용하지 않는다.
  • 앱에서 호출량과 토큰을 제한한다. Service Quotas 기본값을 비용 상한처럼 낮추는 대신 모델 허용 목록, 주체별 호출 속도 제한, max_tokens 상한을 둔다.
  • Bedrock 런타임 지표에 알람을 건다. 모델·리전별 Invocations, InputTokenCount, OutputTokenCount를 감시해 평소 범위를 벗어난 사용량을 바로 운영 알림으로 보낸다.8
  • AWS Budgets는 지연된 재무 백스톱으로 둔다. Marketplace 필터 예산과 IAM·SCP 액션을 연결할 수 있지만,9 비용 데이터는 보통 8~12시간 간격으로 갱신되며 최대 하루 늦을 수 있다.10 Cost Anomaly Detection도 최대 24시간이 걸리고 AWS Marketplace의 Anthropic Claude Bedrock 비용은 모니터링 대상이 아니다.11

이 통제들을 출시 전 판정 기준과 운영 책임으로 연결하는 방법은 AI PoC 운영 전환의 여섯 게이트에서 더 자세히 다룬다.

이미 털렸다면: 대응 런북

  1. 자격증명부터 죽인다. 유출된 키 비활성화, 해당 주체의 활성 세션 무효화. 원인 분석은 그다음이다.
  2. CloudTrail로 범위를 확정한다. 어떤 키로, 어느 리전에서, 어떤 API가 호출됐는지. Bedrock이면 모델 호출 로그를 함께 본다.
  3. 남은 뒷문을 찾는다. 공격자가 만들어둔 IAM 사용자, 역할, 액세스 키가 있는지 전수 확인한다.
  4. AWS Support에 즉시 신고한다. 무단 사용과 예상치 못한 과금, 관련 로그와 차단 조치를 제출한다. 청구 조정 여부는 사례별 판단이며 보장되지 않는다.12
  5. 재발 방지 장치를 위 순서대로 적용한다.

폭탄은 해킹만이 아니다: 조용히 새는 비용

해킹은 하루 1억이라 눈에 띈다. 그런데 클라우드 비용 문제의 더 흔한 얼굴은 반대쪽에 있다. 아무도 침입하지 않았는데 매달 수백만 원씩, 몇 년을 새는 보이지 않는 비용이다.

  • 트래픽이 지날 때마다 처리 요금이 붙는 NAT Gateway
  • 아키텍처 다이어그램에는 안 보이는 AZ 간 데이터 전송 요금
  • 지운 인스턴스가 남긴 EBS 스냅샷과 연결 해제된 탄력적 IP
  • 보존 기한 없이 무한히 쌓이는 CloudWatch Logs
  • 퇴근 후에도 도는 개발·스테이징 환경

흥미로운 건 처방이 겹친다는 점이다. 리소스 태깅 규율과 서비스별 사용량·비용 알람을 함께 두면 급격한 오용과 구조적인 낭비를 같은 운영 체계에서 살필 수 있다. 비용 가시성은 보안 장치이기도 하다.

이 목록의 비용 구조와 진단 순서는 AWS 보이지 않는 비용에서 실제 계산과 함께 이어서 다룬다.


계정·SCP·비용 통제는 클라우드 & 인프라에서, Bedrock 호출 관측과 애플리케이션 한도는 데이터 & ML 엔지니어링에서 함께 설계할 수 있다.

참고 자료

출처와 각주12개펼치기접기

Footnotes

  1. Sysdig Threat Research Team, LLMjacking: Stolen Cloud Credentials Used in New AI Attack (2024-05) 2

  2. Sysdig Threat Research Team, The Growing Dangers of LLMjacking (2024-09) 2 3

  3. AWS, Claude Opus 4.5 now in Amazon Bedrock (2025-11). 입력 100만 토큰당 5달러, 출력 100만 토큰당 25달러의 출시 시점 가격이며 현재 처리량을 보장하지 않는다.

  4. AWS, Amazon Bedrock introduces API keys for streamlined development (2025-07)

  5. Wiz, A new type of long-lived key on AWS: Bedrock API keys

  6. AWS, Three new condition keys to govern API keys for Amazon Bedrock (2025-09)

  7. AWS Docs, Model invocation logging — Amazon Bedrock

  8. AWS Docs, Monitoring Amazon Bedrock with CloudWatch. 모델 호출·입력 토큰·출력 토큰 지표.

  9. AWS Docs, Configuring AWS Budgets actions. 예산 임계값에 IAM·SCP 액션을 연결하는 절차.

  10. AWS Docs, Managing your costs with AWS Budgets. 예산 정보는 보통 하루 최대 세 번 갱신된다.

  11. AWS Docs, AWS Cost Anomaly Detection. 탐지에는 최대 24시간이 걸릴 수 있고 AWS Marketplace의 Anthropic Claude Bedrock 비용은 제외된다.

  12. AWS re:Post, What do I do if I notice unauthorized activity in my AWS account?. 계정 차단과 AWS Support 신고 절차.

이 주제와 연결된 구축 서비스를 확인하세요.

클라우드 & 인프라

이런 작업을 실제 환경에 적용합니다.

엔지니어가 현재 환경과 제약을 먼저 검토하고, 필요한 경우 30분 기술 대화로 실행 범위를 정합니다.

이미 금융·헬스케어·미디어·공공의 팀들과 함께
기술 과제 검토 요청