Not in the middle: why a Context AI–style breach against Caiioo would yield nothing useful

본 문서는 영어 원본을 기계 번역한 것입니다. 번역본과 영어 원본 사이에 내용이 상충할 경우 영어 원본이 우선합니다. 영어 원본 보기


중간에 끼지 않기: 왜 Context AI 스타일의 침해 사고가 Caiioo에게는 아무런 소용이 없는가

2026-04-22 · Caiioo Team

2026년 4월 19일, Vercel은 단일 직원의 서드파티 AI 도구가 침해되었으며, 유출된 OAuth 토큰이 Vercel 내부 환경으로 침투하는 데 사용되었다고 발표했습니다. 일부 고객의 비민감 환경 변수가 노출되었으나, 암호화된 민감 환경 변수는 영향을 받지 않았습니다.

해당 도구는 Context AI였습니다. 직원은 기업용 Google Workspace에 대해 광범위한 "모두 허용" 액세스 권한을 부여했습니다. Context AI 서버에 보관되어 있던 그 단 하나의 OAuth 권한이 이후 발생한 모든 사건의 지렛대가 되었습니다.

BreachForums의 한 위협 행위자는 580명의 Vercel 직원 기록이라고 주장하는 데이터를 200만 달러에 판매한다고 별도로 게시했습니다. Vercel은 해당 게시물의 진위 여부를 확인하지 않았습니다.

사건은 아직 끝나지 않았습니다. 하지만 아키텍처 측면의 교훈은 이미 명확하며, 이는 AI 워크스페이스를 검토하는 모든 이들에게 유용한 정보입니다.

공격의 형태

SaaS-AI 모델은 사용자가 부여하는 모든 OAuth 권한의 중간에 벤더를 위치시킵니다.

서드파티 AI 생산성 도구를 설치하고 OAuth 동의 화면을 클릭하면, Google(또는 Microsoft나 기타 ID 제공업체)이 발행한 액세스 토큰과 리프레시 토큰은 사용자의 기기에 머물지 않습니다. AI가 벤더의 클라우드에서 실행되어야 하므로 이 토큰들은 벤더의 서버로 전달됩니다. 벤더의 인프라는 대부분의 사용자가 읽지 않고 클릭한 "모두 허용" 권한이 부여된 모든 사용자의 토큰 세트를 지속적으로 갱신하며 보유하게 됩니다.

이러한 중앙 집중식 토큰 저장소가 바로 공격자의 목표입니다. 벤더를 한 번만 침해하면 수천 명의 고객 워크스페이스에 접근할 수 있습니다. Vercel의 공지에서도 다운스트림 영향이 "여러 조직에 걸친 수백 명의 사용자"에게 미칠 수 있다고 경고합니다.

보고에 따르면 최초의 체인은 2026년 2월에 개인 기기가 침해된 Context AI 직원으로 거슬러 올라갑니다. 보도에 따르면 Lumma Stealer 정보 탈취 악성코드가 포함된 Roblox 게임 익스플로잇을 다운로드한 것이 원인이었습니다. 해당 악성코드는 직원의 Google Workspace 및 AWS 자격 증명을 탈취했고, 이는 다시 OAuth 토큰 금고를 여는 열쇠가 되었습니다. 감염된 개인 기기 하나, 기업용 SaaS 금고 하나가 수백 개의 다운스트림 워크스페이스를 위험에 빠뜨린 것입니다.

Context AI 스타일의 침해 사고가 발생하더라도 Caiioo에서 유용한 정보를 얻을 수 없는 세 가지 아키텍처적 이유

Caiioo는 사이드 패널에서 실행되는 에이전트 오케스트레이터와 채팅 인터페이스를 갖춘 강력한 프라이버시 우선(privacy-first) 워크스페이스입니다. "프라이버시 우선"은 마케팅 문구가 아니라 구체적인 아키텍처적 태세를 설명하는 용어입니다. 여기에는 세 가지 구체적인 속성이 작용합니다.

1. 귀하의 Workspace OAuth 토큰은 서버가 아닌 귀하의 기기에 암호화되어 저장됩니다

Caiioo에서 Google 또는 Microsoft 계정을 연결하면, 부여하려는 권한 범위(scopes)가 표시된 Google의 표준 OAuth 동의 화면이 나타납니다. 여기까지는 Context AI를 승인하는 과정과 동일해 보입니다.

구조적인 차이점은 해당 동의 절차에서 생성된 토큰에 어떤 일이 일어나는가에 있습니다. Google이 발행한 액세스 토큰(access token)과 리프레시 토큰(refresh token)은 귀하의 기기에 암호화되어 저장됩니다. macOS 및 iOS에서는 Keychain에, Android에서는 Android Keystore에, 브라우저 확장 프로그램에서는 브라우저의 보안 저장소에 저장됩니다. 이 토큰들은 Caiioo의 중앙 데이터베이스에 저장되지 않습니다. 당사는 귀하를 대신하여 토큰을 보관하는 토큰 금고(token vault)를 보유하고 있지 않습니다.

에이전트 오케스트레이터가 귀하의 캘린더를 읽거나 편지함을 검색해야 할 때, API 호출은 귀하 기기의 보안 저장소에 있는 토큰을 첨부하여 귀하의 기기에서 Google로 직접 전달됩니다. 당사의 인프라는 귀하의 Workspace 콘텐츠에 대한 데이터 경로에 관여하지 않습니다.

소스 코드에서 이를 직접 확인할 수 있습니다. src/shared/auth/connections-manager.ts는 Google/Microsoft OAuth 연결이 유지되는 곳입니다. accessTokenrefreshToken 필드를 포함한 OAuthConnection 레코드는 중앙 토큰 저장소로 전송되지 않고 로컬 스토리지 어댑터를 통해 기록됩니다.

2. 릴레이의 메시지 버스는 종단간 암호화(end-to-end encrypted)되어 있습니다

서로 다른 기기에 있는 Caiioo 구성 요소들이 조정이 필요할 때(예: 브라우저 확장 프로그램이 데스크톱 앱과 통신하거나, 휴대폰이 홈 서버와 통신하거나, 사이드 패널 UI가 macOS에서 기본적으로 실행되는 도구를 호출할 때), 이들은 당사가 relay.pebbleflow.ai에서 호스팅하는 릴레이를 통해 통신합니다. 릴레이는 귀하의 기기들이 네트워크를 가로질러 서로를 찾을 수 있게 해주는 만남의 장소(rendezvous point)입니다.

해당 릴레이는 종단간 암호화되어 있습니다. 각 사용자의 기기는 릴레이 엔벨로프를 통해 키 교환을 수행하며, 그 이후부터 기기 간의 메시지는 릴레이의 관점에서 암호문(ciphertext)이 됩니다. 릴레이는 메시지를 라우팅할 수는 있지만 읽을 수는 없습니다.

이것은 단순한 목표가 아닙니다. WebSocket 연결을 처리하는 Durable Object인 cloud/relay/src/user-relay.ts에는 다음과 같이 문서화되어 있습니다: "단일 사용자를 위한 WebSocket 연결을 관리합니다. E2E 암호화된 메시지(릴레이는 내용을 알 수 없음) 및 키 교환을 처리합니다." ENCRYPTED 메시지 유형을 처리하는 코드 경로에는 *"특정 클라이언트로 보내는 암호화된 메시지(당사는 읽을 수 없음)"*라는 주석이 명시적으로 달려 있습니다. 릴레이는 아키텍처적으로 자신이 전달하는 메시지의 내용을 검사할 수 없도록 설계되었습니다.

3. 릴레이는 구조적으로 사용자당 단일 테넌트(single-tenant) 방식입니다

Caiioo의 릴레이는 Cloudflare Durable Objects를 기반으로 구축되었습니다. 각 사용자는 자신만의 UserRelay 인스턴스, 즉 런타임이 격리된 별도의 컴퓨팅 및 스토리지 공간을 할당받습니다. 모든 사용자의 라이브 세션 상태를 보유하는 공유 멀티 테넌트 데이터베이스는 존재하지 않습니다. 해당 역할을 위한 멀티 테넌트 데이터베이스 자체가 아예 없기 때문입니다. 각 사용자의 릴레이는 별개의 객체입니다.

이는 단일 공유 타겟 장애 모드(single-shared-target failure mode)를 제거한다는 점에서 중요합니다. 공격자가 한 사용자의 Durable Object를 침해할 방법을 찾아낸다 하더라도, 다른 사용자의 데이터로 횡적 이동(lateral access)을 할 수 없습니다. 피벗(pivot)을 통해 침투할 수 있는 공유 백엔드 저장소가 없기 때문입니다. 각 사용자는 구조적으로 자신만의 테넌트가 됩니다.

중앙 데이터베이스에 있는 것과 없는 것

우리는 중앙 집중화가 필요한 항목을 위해 중앙 데이터베이스(Cloudflare D1)를 운영합니다. 정직함이 중요합니다. 데이터베이스에는 다음이 저장됩니다.

  • 계정 식별 정보: 이메일, 이메일/비밀번호 로그인을 사용하는 경우 해싱된 비밀번호, 소셜 로그인 버튼을 사용하는 경우 Google/Apple/Microsoft에서 반환한 제공업체 ID.
  • 결제 상태: Stripe 고객 ID, 구독 등급, 라이선스 키 및 구독 상태.
  • AI 추론 제공업체별 사용자 API 키 (특히 OpenRouter). 이는 Workspace OAuth 토큰과는 별개인 추론 제공업체 자격 증명입니다. 이는 관리형 크레딧 흐름과 Caiioo의 AI 기능 전반에서 자신의 OpenRouter 키를 사용하려는 사용자를 위해 존재합니다.
  • 라이선스 집행을 위한 기기 활성화 목록.
  • 감사 로그, SOC 2 증거 요구 사항을 위해 보관됨.
  • 옵트인 인바운드 웹훅을 위한 라우팅 테이블 (WhatsApp, Telegram 등) — 해당 메시징 연동을 구성한 경우에만 사용됨.

데이터베이스에 저장되지 않는 것:

  • 사용자의 Workspace OAuth 토큰 (Gmail, Calendar, Drive, Microsoft 365). 이는 사용자의 기기에만 저장됩니다.
  • 대화 내용. 에이전트 오케스트레이터는 사이드 패널에서 실행되며 대화는 로컬 저장소에 저장됩니다.
  • 사용자의 Workspace 데이터 — 이메일, 캘린더 일정, Drive 파일. 이러한 데이터는 Google/Microsoft에서 사용자의 기기로 직접 읽어오며, 우리의 인프라를 절대 거치지 않습니다.
  • WebSocket 릴레이를 통해 흐르는 모든 메시지의 내용. 릴레이는 암호문만 봅니다.

우리의 중앙 데이터베이스가 침해되더라도 계정/결제 식별 정보, 감사 로그, OpenRouter 추론 키 열만 노출될 뿐입니다. Workspace 토큰, 대화 내용 또는 Workspace 데이터는 그 안에 존재하지 않기 때문에 유출되지 않습니다.

정직한 주의 사항

이것은 다른 위협 모델일 뿐, 마법의 방패가 아닙니다. 나중에 직접 발견하시기보다 저희가 먼저 말씀드리는 것이 나을 몇 가지 제한 사항이 있습니다.

OAuth 코드 교환은 저희 릴레이를 잠시 거칩니다. Google (및 Microsoft, GitHub, Slack)은 토큰 교환 단계에서 OAuth client_secret을 제시할 것을 요구하며, 이 비밀 키는 클라이언트 코드에 포함되어 배포될 수 없습니다. 따라서 저희의 상태 비저장(stateless) 릴레이가 client_secret을 첨부하여 귀하의 인증 코드를 Google에 전달하고 실제 토큰으로 교환합니다. 토큰은 릴레이를 통해 돌아와 즉시 귀하의 기기에 저장됩니다. 이 토큰들은 저희 인프라에 영구적으로 저장되지 않습니다. 이는 귀하가 사용해 온 모든 기본 Google 통합 앱에 서버 구성 요소가 있는 것과 같은 이유입니다. 이는 Google의 제약 사항이지 Caiioo의 설계 선택이 아닙니다.

사용자 정의 엔드포인트를 통해 저희 OAuth 클라이언트를 완전히 우회할 수 있습니다. Caiioo는 사용자 정의 OAuth 엔드포인트 설정을 지원합니다. 즉, Google Cloud Console (또는 Microsoft Entra의 해당 서비스)에서 직접 OAuth 클라이언트를 프로비저닝하려는 사용자는 Caiioo의 OAuth 범위와 저희 릴레이의 교환 단계를 완전히 피할 수 있습니다. 일단 설정되면, 인증 흐름은 귀하의 기기와 Google 사이에서만 이루어지며 Caiioo는 그 과정에 전혀 관여하지 않습니다. 대부분의 사용자에게는 필요하지 않고 기본 아키텍처만으로도 Workspace 데이터를 저희 서버로부터 분리할 수 있기 때문에 이를 일반 소비자용 설정으로 전면에 내세우지는 않습니다. 하지만 이 기능은 존재하며, 이전에 Google Cloud Console에서 OAuth 클라이언트를 설정해 본 적이 있는 분이라면 구현 방식이 익숙할 것입니다.

기기 보안 침해는 여전히 중요합니다. 만약 귀하의 노트북이 해킹당한다면, 귀하의 토큰도 해킹당한 것입니다. 로컬 우선(Local-first) 방식은 공격 표면을 "공급업체의 금고"에서 "귀하의 엔드포인트"로 옮깁니다. 이는 더 작고 방어하기 쉬운 표면이지만, 위험이 0인 것은 아닙니다.

로그인 단계의 "Google로 로그인"은 Workspace 액세스와 별개입니다. 만약 Google이나 Apple을 통해 Caiioo 자체에 로그인한다면, 해당 흐름은 신원 확인 전용이며 귀하의 계정으로 범위가 지정된 기본 연결을 생성합니다. 이는 위에서 설명한 Workspace 액세스 흐름과 동일한 경로가 아니며, AI에게 귀하의 받은 편지함이나 캘린더에 대한 액세스 권한을 부여하지 않습니다.

Caiioo 자체에 대한 공급망 공격은 여전히 생각할 수 있습니다. 이론적으로 보안이 침해된 업데이트 채널은 귀하의 기기에서 토큰을 탈취하는 코드를 배포할 수 있습니다. 저희는 배포하는 모든 플랫폼에서 코드 서명 및 공증(notarization)을 통해 이를 완화하지만, 이 완화 방식은 공급업체 금고 모델과는 다르며 공격자의 경제적 논리 또한 다릅니다.

직접 확인하는 방법

정직하게 말씀드리면, 마케팅 페이지에 기재된 벤더의 개인정보 보호 주장은 회의적인 시각을 가진 분들에게 완벽히 증명될 수 없습니다. 따라서 저희가 주장하는 바를 여러분의 도구로 직접 확인할 수 있는 방법을 안내해 드립니다.

Caiioo를 사용하는 동안 네트워크 모니터를 실행해 보세요. macOS에서는 Little Snitch, Windows에서는 GlassWire, 또는 모든 플랫폼에서 Wireshark를 사용할 수 있습니다. 한 시간 동안 평소처럼 Caiioo를 사용해 보십시오. 여러분이 보게 될 트래픽과 각 연결의 의미는 다음과 같습니다:

목적지 시점 의미
oauth2.googleapis.com, gmail.googleapis.com, calendar.googleapis.com, www.googleapis.com 에이전트가 Workspace 데이터를 읽을 때마다 온디바이스(on-device) 토큰을 사용하여 기기에서 Google로 직접 통신합니다. 저희는 이 경로에 관여하지 않습니다.
login.microsoftonline.com, graph.microsoft.com Microsoft 365를 연결한 경우 위와 동일한 방식으로, 기기에서 Microsoft로 직접 통신합니다.
api.anthropic.com, openrouter.ai, api.openai.com, generativelanguage.googleapis.com, localhost:11434 (Ollama) 채팅을 보내거나 LLM을 사용하는 도구를 실행할 때 기기에서 설정된 AI 제공업체와 직접 통신합니다. 저희는 이 경로에 관여하지 않습니다.
relay.pebbleflow.ai (HTTPS) 초기 Workspace OAuth 설정 및 주기적인 토큰 갱신 시 잠시 동안 상태를 저장하지 않는(stateless) OAuth 코드 교환입니다. 토큰은 통과만 할 뿐, 서버 측에 저장되지 않습니다.
relay.pebbleflow.ai (HTTPS) 주기적으로 라이선스 유효성 검사, 릴리스 노트 / 사용자 가이드 콘텐츠 가져오기, 모델 인텔리전스 데이터, 구독 상태 확인.
relay.pebbleflow.ai (HTTPS) 웹사이트를 로드하거나 연결된 계정 상태를 볼 때 표준 API 트래픽.
relay.pebbleflow.ai (WebSocket) 여러 Caiioo 구성 요소가 설치된 경우(확장 프로그램 + 데스크톱 앱, 또는 모바일 + 데스크톱) 지속적으로 기기 간의 통신을 가능하게 하는 기능 브리지입니다. 종단간 암호화(End-to-end encrypted)되어 있으며, 저희는 암호문만 볼 수 있습니다.
relay.pebbleflow.ai/api/messaging/... 메시징 연동(WhatsApp, Telegram, Slack 수신)을 설정한 경우에만 수신 메시지를 위한 웹훅 라우팅.

절대로 보게 되지 않을 항목들:

  • relay.pebbleflow.ai로 전송되는 Workspace 데이터(이메일, 캘린더 일정, Drive 파일). 해당 호출은 기기에서 *.googleapis.com으로 직접 전송됩니다.
  • relay.pebbleflow.ai로 전송되는 대화 내용. 오케스트레이터는 사이드 패널에서 실행되며, 채팅 기록은 로컬 스토리지에 저장됩니다.
  • relay.pebbleflow.ai로 전송되는 AI 제공업체 API 키. 이 키들은 기기에 저장됩니다. (예외: 관리형 크레딧 플로우를 사용하는 경우 서버에서 할당된 OpenRouter 하위 계정을 사용하게 되며, 이 경우에도 추론 호출은 여전히 기기에서 이루어집니다.)

만약 기기에서 저희 인프라로 전송되는 요청 중 위의 표에 해당하지 않는 것을 발견하신다면, 그것은 중요한 발견입니다. 저희에게 알려주시면 설명해 드리거나 수정하도록 하겠습니다.

Vercel 또는 Context AI 고객인 경우 조치 사항

Vercel, Context AI 및 보안 연구 커뮤니티에서 발표한 가이드는 다음과 같은 일관된 체크리스트로 수렴됩니다:

  1. 모든 비밀 정보 교체: 암호화되지 않은 Vercel 환경 변수로 저장된 모든 비밀 정보를 교체하십시오. 암호화된/민감한 변수는 영향을 받지 않은 것으로 보고되었지만, 교체 비용은 저렴합니다.
  2. 팀의 서드파티 OAuth 권한 감사: Google Workspace(및 해당되는 경우 Microsoft 365)에서 권한을 확인하십시오. 인식하지 못하는 항목은 취소하고, 광범위한 "모두 허용" 범위를 부여한 도구는 교체가 필요한 자격 증명으로 간주하십시오.
  3. 향후 동의 강화: 최소 권한 범위를 요청하는 도구를 선호하고, 아키텍처상 수명이 긴 토큰을 넘겨줄 필요가 없는 워크스페이스를 선택하십시오.

세 번째 사항은 구조적인 변화이며, 이번 사건이 조용히 권고하고 있는 핵심입니다.

Caiioo 체험하기

Vercel/Context AI 사건의 교훈이 벤더가 침해당했을 때 OAuth 토큰의 위치가 피해 범위를 결정한다는 것이라면, 정답은 토큰을 보유하지 않는 워크스페이스를 선택하는 것입니다.

Caiioo는 사이드 패널에서 실행되는 에이전트 오케스트레이터와 채팅 인터페이스를 갖춘 강력한 프라이버시 우선 워크스페이스입니다. 브라우저 확장 프로그램, 네이티브 macOS 앱, 네이티브 iOS 앱, 네이티브 Android 앱, Windows 및 Linux용 데스크톱 앱으로 제공됩니다. 무료로 시작하기.


출처: