Vercel이 직원이 OAuth 프롬프트에서 'Allow'를 클릭해 해킹당했다. 우리 모두 이런 일을 한다.

발행: (2026년 4월 23일 PM 10:07 GMT+9)
5 분 소요
원문: Dev.to

Source: Dev.to

배경

Vercel 침해는 정교한 제로‑데이 익스플로잇의 결과가 아니었습니다. 한 직원이 OAuth 프롬프트에서 Allow 버튼을 클릭했는데, 이는 우리 대부분이 매달 수십 번씩 권한을 읽지 않고 수행하는 행동입니다.

침해 전개 과정

  • 초기 침해Lumma Stealer 악성코드가 Context.ai 직원의 자격 증명을 수집했으며, 여기에는 Context.ai의 Google Workspace 통합에 사용되는 OAuth 토큰도 포함되었습니다. 이 토큰은 Vercel 시스템과 연결되어 있었습니다.
  • 지속 토큰 – OAuth 토큰은 세션이 종료되어도 만료되지 않았으며, 이후 공격자에 의해 Vercel 인프라로 횡방향 이동하는 데 사용되었습니다.
  • 탐지되지 않은 접근 – 공격자는 대략 2024년 6월부터 2026년 4월까지(거의 2년) 동안 접근 권한을 유지했습니다. OAuth 토큰은 부여된 뒤 보이지 않기 때문에 전통적인 보안 알림(실패 로그인, 무차별 대입 시도, 의심스러운 IP)에서는 트리거되지 않았습니다.

OAuth 토큰이 위험한 이유

  • 한 번 부여하고 영원히 잊음 – 사용자는 한 번 권한을 부여하고 다시 확인하지 않는 경우가 많습니다.
  • 가시적인 인증 이벤트 없음 – 유효한 토큰은 정상 트래픽과 구분되지 않는 API 호출을 수행하므로, 모니터링 시스템은 이를 정상으로 처리합니다.
  • 인증이 아닌 위임 – “Allow”를 클릭하면 권한을 위임하는 것이며, 사용자를 인증하는 것이 아닙니다. 신뢰 모델은 제3자 서비스가 영구적으로 안전할 것이라고 가정하지만, 실제로는 그렇지 않은 경우가 대부분입니다.

개인 감사 경험

  • GitHub → Settings → Applications를 확인하고 3년 전의 여러 OAuth 부여 내역을 발견했으며, 그 중 다수는 어떤 서비스인지 알 수 없었습니다.
  • 서비스 전반(GitHub, Vercel, Slack, Notion 등)에서 OAuth 연결을 검토하고 최근 90일 이내에 사용되지 않은 모든 연결을 해제했습니다. 이 과정은 약 20분 정도 걸렸으며, 생각보다 많은 잔여 권한이 존재함을 확인했습니다.

팀 차원의 완화 방안

  1. 분기별 OAuth 부여 감사 – 모든 OAuth 권한을 정기적으로 검토하도록 일정에 포함합니다.
  2. 오래된 토큰 폐기 – 정의된 기간(예: 90일) 내에 활발히 사용되지 않은 토큰은 모두 삭제합니다.
  3. 이상 API 사용 모니터링 – 유효 토큰이 사용되더라도 비정상적인 패턴을 감지하는 알림을 구현합니다.

모두를 위한 권고 사항

  • 오늘 바로 OAuth 부여를 확인하세요 – 사용 중인 각 서비스(GitHub, Vercel, Slack 등)의 OAuth 설정으로 이동해 더 이상 필요하지 않은 권한을 해제합니다.
  • 정기적인 감사 주기를 도입하세요 – OAuth 부여 검토를 일회성 작업이 아닌 정기적인 보안 업무로 취급합니다.
  • 인증과 인가의 차이를 팀에 교육하세요 – “Allow” 버튼은 인증 이벤트가 아니라 권한 위임임을 강조합니다.

“Allow” 버튼은 현대 개발 환경에서 가장 잊혀지기 쉬우면서도 잠재적으로 위험한 UI 요소입니다. 정기적으로 OAuth 권한을 검토하고 정리하는 것은 공격 표면을 줄이는 간단하고 효과적인 방법입니다.

0 조회
Back to Blog

관련 글

더 보기 »

Tokenmaxxing 논쟁은 요점을 놓치고 있다

Jensen Huang는 모든 엔지니어가 매일 100,000 토큰을 소비해야 한다고 말합니다. Shopify의 CTO는 실제 지표는 토큰을 어떻게 활용하느냐라고 말합니다. 두 사람 모두 옳습니다. 두 사람 모두 …