본문으로 건너뛰기
블로그로 돌아가기
Vercel 2026년 4월 보안 사고 분석 — Context.ai 공급망 침해의 3단계 OAuth 체인 탈취
트렌드

Vercel 2026년 4월 보안 사고 분석 — Context.ai 공급망 침해의 3단계 OAuth 체인 탈취

11분 읽기0

Vercel 2026년 4월 보안 사고 분석 — Context.ai 공급망 침해의 3단계 OAuth 체인 탈취

2026년 4월 19일, Vercel은 공식 보안 회보를 통해 "certain internal Vercel systems"에 대한 무단 접근이 확인되었다고 발표했습니다. 하지만 이 사건의 핵심은 Vercel 자체가 뚫렸다는 사실이 아닙니다. 직원이 사용하던 제3자 AI 도구가 3단계 OAuth 체인의 시작점이 되어, 결국 Vercel 내부 환경에 대한 접근 권한이 유출되었다는 구조입니다.

1인 개발자부터 스타트업까지, Vercel을 배포 플랫폼으로 사용하는 모든 조직이 오늘 당장 환경변수를 점검해야 하는 이유를 분석합니다.

사건 개요 — 무엇이 일어났는가

Vercel이 2026년 4월 20일(현지 시각) 최신 업데이트한 공식 Security Bulletin에 따르면, 사건의 핵심 팩트는 다음과 같습니다.

  • 무단 접근이 확인된 범위: Vercel의 특정 내부 시스템(internal systems)
  • 영향을 받은 고객: "limited subset of customers" — Vercel이 해당 고객들에게 직접 연락 중
  • 대응 상황: Mandiant와 추가 보안 업체, 법 집행기관과 협업 중인 조사 진행 중
  • Vercel 서비스 상태: 정상 운영 중, 배포/도메인/런타임에는 영향 없음
  • 공격자 평가: Vercel 내부 시스템에 대한 상세 이해(detailed understanding)와 빠른 운영 속도(operational velocity)를 보유한 고도로 정교한 행위자(highly sophisticated)

또한 ShinyHunters를 사칭한 위협 행위자가 BreachForums에 Vercel 접근 키, 소스 코드, 데이터베이스 등을 미화 200만 달러에 판매한다고 게시했지만, 이 판매 포스트의 진위 여부는 현재까지 확인되지 않았습니다.

공격 체인 — 3단계 OAuth 공급망 탈취

이 사건에서 가장 기술적으로 의미 있는 부분은 공격이 시작된 지점이 Vercel이 아니라는 사실입니다. 공격 체인은 다음 3단계로 구성되었습니다.

1단계 — Context.ai (초기 침해 지점)

Vercel 직원이 업무에 사용하던 Context.ai라는 제3자 AI 도구가 최초 침해 지점(Initial Access Vector)이었습니다. 공격자는 Context.ai의 Google Workspace OAuth 애플리케이션을 악용해 접근 권한을 획득했습니다. 참고로 이 Context.ai의 OAuth 앱은 단일 조직만의 문제가 아니라 수백 개 조직에 영향을 미친 더 큰 공급망 침해의 일부로 평가되고 있습니다.

2단계 — Google Workspace 계정 탈취

Context.ai에 부여된 OAuth 권한을 발판으로, 공격자는 해당 Vercel 직원의 Google Workspace 계정 자체에 대한 접근 권한을 확보했습니다. 이 지점이 핵심입니다. 사용자가 AI 도구에 "편의를 위해" 허용한 OAuth 스코프가, 공격자에게는 Google ID를 통째로 이용할 수 있는 열쇠가 된 것입니다.

3단계 — Vercel 환경 접근

Google Workspace 계정을 장악한 공격자는 해당 Google 계정이 가지고 있던 Vercel에 대한 OAuth 권한을 이용해 Vercel 환경에 접근했습니다. 단일 비밀번호나 MFA 우회가 아니라, "AI 도구 → Google ID → Vercel"로 이어지는 정당한 OAuth 승인의 연쇄를 그대로 상속받은 침입이었던 셈입니다.

공격 체인을 한 줄로 요약하면 이렇습니다.

직원이 AI 도구에 OAuth를 허용하는 순간, 그 AI 도구의 보안 수준이 조직 전체의 보안 경계가 된다.

무엇이 노출되었고, 무엇은 안전했는가 — Sensitive 플래그의 결정적 차이

이번 사건에서 가장 실무적으로 중요한 교훈은 Vercel의 Sensitive Environment Variables 기능의 역할입니다.

노출 가능성이 있는 항목

공격자가 Vercel 환경에 접근한 동안, "sensitive"로 표시되지 않은 일반 환경변수에 대한 접근 가능성이 확인되었습니다. 여기에는 다음이 포함됩니다.

  • 외부 API 키(OpenAI, Anthropic, Stripe, SendGrid 등)
  • 인증 토큰(JWT signing key, session secret 등)
  • 데이터베이스 자격증명(PostgreSQL, Redis, MongoDB 연결 문자열)
  • 서명 키(webhook signing secret, JWT private key 등)
  • 기타 플랫폼 연동 크리덴셜

Vercel은 이 카테고리에 해당하는 모든 시크릿을 **재발급(rotate)**하라고 권고하고 있습니다.

접근 증거가 없는 항목

반면에 "Sensitive"로 표시된 환경변수는 접근 증거가 발견되지 않았습니다. 왜냐하면 이 타입의 환경변수는 빌드 타임 전용 복호화 방식으로 저장되기 때문입니다. 즉, 일반적인 런타임 관리 화면에서 값을 평문으로 꺼낼 수 없습니다. 같은 시크릿이라도 이 플래그 하나의 차이가 "노출되었을 가능성" 과 "접근되지 않았음" 사이의 경계를 만든 것입니다.

실무 교훈: 이제부터 Vercel에 시크릿을 저장할 때는 기본값을 "Sensitive"로 두는 정책을 고려할 필요가 있습니다. UI 편의성(값을 다시 볼 수 있음)을 포기하고, 대신 "관리 콘솔이 뚫려도 평문 유출이 없다"는 보장을 얻는 선택입니다.

공개된 IOC — 지금 당장 점검할 지표

Vercel과 관련 보안 리포트에서 공개한 구체적인 침해 지표(Indicator of Compromise)는 현재 다음과 같습니다.

  • 악성 OAuth 앱 ID: 110671459871-30f1spbu0hptbs60cb4vsmv79i7bbvqj.apps.googleusercontent.com

Google Workspace 관리자라면 Admin Console의 "API Controls → App access control" 혹은 "Security → API permissions" 영역에서 이 앱 ID가 조직 내에 존재하는지 즉시 확인해야 합니다. 존재한다면 다음 조치를 취합니다.

  1. 해당 OAuth 앱의 접근 권한 즉시 취소(revoke)
  2. 해당 앱에 권한을 부여한 모든 사용자 계정의 로그인 이력 및 토큰 감사
  3. 해당 사용자들이 접근할 수 있었던 외부 서비스(Vercel, GitHub, AWS 등)의 활동 로그 교차 검토

오늘 당장 해야 할 3가지 조치

Vercel 고객이 현 시점에서 수행해야 할 핵심 대응은 다음 3가지로 요약됩니다.

1. Activity Log로 의심스러운 활동 점검

Vercel 대시보드의 "Activity" 탭 또는 CLI를 사용해 팀/프로젝트 레벨에서 최근 활동 로그를 확인합니다. 특히 다음을 주의 깊게 봅니다.

  • 평소와 다른 지역/IP에서의 로그인 이벤트
  • 예정되지 않은 배포(Deployment)가 있었는지
  • 환경변수 변경/조회 이벤트
  • 팀 멤버 초대/권한 변경
  • 토큰 발급 이력

의심스러운 최근 배포본이 있다면, 삭제를 검토합니다.

2. Non-sensitive 환경변수 전체 재발급

현 시점에서 Sensitive로 표시되지 않았던 모든 환경변수는 노출 가능성이 있다고 가정하고 재발급을 권장합니다. 체크리스트:

  • 외부 API 키 로테이션(OpenAI, Anthropic, Stripe, SendGrid, Supabase 서비스 키 등)
  • JWT/세션 서명 키 교체
  • 데이터베이스 비밀번호 재설정 및 연결 문자열 갱신
  • Webhook signing secret 재발급
  • Deployment Protection 토큰 재발급

3. Sensitive Environment Variables로 전환

재발급한 모든 시크릿은 처음부터 Sensitive Environment Variables 기능으로 저장합니다. Vercel 대시보드에서 환경변수를 추가할 때 "Sensitive" 체크박스를 활성화하거나, CLI로는 vercel env add 시점에 해당 옵션을 지정합니다. 기존 환경변수를 바꾸려면 일단 삭제하고 다시 Sensitive로 추가해야 합니다(평문 값을 UI에서 복사해 올 수 없기 때문).

추가로 Deployment Protection을 최소 "Standard" 이상으로 설정하여, 프리뷰 환경에 대한 공개 접근을 차단하는 것이 권장됩니다.

이 사건이 보여준 구조적 교훈

기술적 대응 조치 못지않게 이 사건은 2026년 현재 AI 도구 확산 환경에서의 보안 구조에 대한 질문을 던집니다.

첫째, 제3자 AI/SaaS 도구의 OAuth 권한은 실질적 공급망 공격 벡터입니다. 사용자가 "편의를 위해" 허용한 OAuth 스코프는 공격자가 접근 키를 탈취했을 때 그대로 상속되는 권한입니다. 특히 Google Workspace처럼 조직 전체의 ID 공급자 역할을 하는 서비스에 대한 OAuth 승인은 **단일 실패 지점(Single Point of Failure)**이 될 수 있습니다.

둘째, "편의 기능"과 "보안 기능"은 자주 트레이드오프 관계에 있습니다. Vercel의 일반 환경변수는 UI에서 값을 다시 볼 수 있어 편리하지만, 이번 사건에서는 그 편리함이 "관리 콘솔 침해 시 평문 유출"이라는 비용으로 돌아왔습니다. Sensitive 환경변수는 값을 다시 볼 수 없어 불편하지만, 이번처럼 콘솔 접근이 유출돼도 평문 노출을 막아냅니다. 어느 쪽이 기본값이어야 하는지는 2026년 현재 기준으로 명확해졌다고 봅니다.

셋째, 1인 기업·소규모 팀일수록 OAuth 감사(audit)가 필요합니다. 엔터프라이즈는 Workspace의 OAuth 앱 관리 정책이 있지만, 1인 기업이나 3-10명 팀은 각자 편의에 따라 AI 도구에 로그인하곤 합니다. 분기에 한 번이라도 Google/GitHub/Vercel의 "Connected apps" 또는 "OAuth apps" 목록을 확인하고, 현재 쓰지 않는 OAuth 앱은 revoke하는 루틴이 필요합니다.

결론 — 한 줄 요약

Vercel 2026년 4월 보안 사고는 "AI 도구 하나의 OAuth 권한"이 어떻게 조직 전체의 배포 인프라로 전이될 수 있는지를 보여주는 교과서적 사례입니다. 오늘 해야 할 일은 세 가지입니다. Activity Log를 확인하고, 일반 환경변수를 재발급하고, 이후로는 모든 시크릿을 Sensitive로 저장하는 것. 그리고 Google Workspace 관리자라면 Context.ai OAuth 앱이 당신 조직에도 남아 있는지를 지금 바로 확인하십시오.

공식 출처

FAQ

Q1. 제가 Vercel 고객인데 Vercel에서 직접 연락을 받지 못했습니다. 영향을 받은 건가요?

Vercel은 현재 "limited subset of customers"로 영향 범위를 명시하고 있으며, 해당 고객에게는 직접 연락 중이라고 밝혔습니다. 직접 연락을 받지 않았다면 현재 확인된 범위에는 포함되지 않았을 가능성이 높습니다. 다만 Sensitive로 표시하지 않았던 환경변수에 대한 재발급은 방어적 조치(defense in depth) 차원에서 권장됩니다.

Q2. Sensitive Environment Variables를 쓰면 일반 환경변수보다 얼마나 안전한가요?

핵심 차이는 "평문으로 다시 꺼내 볼 수 있는가"입니다. 일반 환경변수는 권한 있는 사용자(또는 콘솔을 장악한 공격자)가 UI에서 값을 그대로 볼 수 있습니다. Sensitive 환경변수는 빌드 타임에만 복호화되어 배포본에 주입되며, 이후 UI에서 값을 평문으로 재조회할 수 없습니다. 즉 이번 사건처럼 콘솔 접근이 뚫려도 값의 평문 유출을 차단할 수 있습니다.

Q3. Context.ai를 우리 조직에서 쓰지 않았다면 안전한가요?

Context.ai 자체를 쓰지 않았어도, Google Workspace에 연결된 다른 제3자 OAuth 앱들에 동일한 위험이 존재합니다. Google Admin Console의 API 접근 제어에서 현재 허용된 모든 OAuth 앱 목록을 최소 분기 1회 감사할 것을 권장합니다. 또한 공개된 IOC(OAuth App ID 110671459871-30f1spbu0hptbs60cb4vsmv79i7bbvqj.apps.googleusercontent.com)에 대해서는 즉시 존재 여부를 검색하십시오.

Q4. 1인 기업인데 여기까지 대응이 필요한가요?

필요합니다. 오히려 1인 기업은 Vercel + Google + GitHub + Stripe 같은 SaaS들이 개인 계정 하나로 연결돼 있어 **"하나 뚫리면 전체가 뚫린다"**는 구조에 더 노출돼 있습니다. 이번 사건을 계기로 ①Vercel 환경변수 Sensitive 전환, ②Google OAuth 앱 정기 감사, ③1Password/Bitwarden 같은 시크릿 매니저로 로테이션 주기 관리 정도는 2026년의 기본 위생으로 잡는 것이 현실적입니다.