Devlery
Blog/Open Source

OpenCode Console에 맡긴 OpenAI·Anthropic 키가 샜다, 로컬 CLI는 해당 없음

Anomaly Innovations가 10월 17일 OpenCode Console 침해를 공개했습니다. 사용자 1.4%의 워크스페이스에 저장된 OpenAI·Anthropic·Google API 키가 노출됐을 수 있습니다.

OpenCode Console에 맡긴 OpenAI·Anthropic 키가 샜다, 로컬 CLI는 해당 없음
AI 요약
  • OpenCode Console 사용자 1.4%의 공급자 API 키가 노출됐습니다.
  • 키는 Console에만 있었고 로컬 CLI 사용자는 해당하지 않습니다.
  • 업체는 침해 경로를 밝히지 않았고 사후 보고서도 아직 없습니다.

오픈소스 코딩 에이전트 OpenCode를 만드는 Anomaly Innovations가 10월 17일 보안 침해를 공개했습니다. 폐기 작업 중이던 옛 시스템에 외부인이 접근했고 사용자 워크스페이스에 저장돼 있던 OpenAI·Anthropic·Google API 키가 노출됐을 수 있습니다. 영향 범위는 호스팅 서비스인 OpenCode Console 사용자의 약 1.4%입니다.

터미널에서 오픈소스 OpenCode만 쓰는 사용자는 이번 건에 해당하지 않습니다. 공식 문서를 보면 /connect로 넣은 키는 사용자 컴퓨터의 ~/.local/share/opencode/auth.json에 저장됩니다. opencode.json에서 {env:ANTHROPIC_API_KEY}처럼 환경변수를 참조하는 방법도 있습니다. 키는 별개 서비스인 Console에 자기 공급자 계정을 연결했을 때 OpenCode 서버로 갑니다.

Hacker News에 올라온 글 제목이 "OpenCode Hacked"였던 탓에 이 구분이 한동안 섞였습니다. 435점·댓글 75개가 달린 그 스레드에서는 글을 올린 사람과 다른 참가자들이 제목에 Console을 넣자고 거듭 요청했습니다. 한 참가자는 "자기 키를 쓰는 로컬 CLI 사용자는 해당 없는 것 아니냐"고 물었습니다. OpenCode 저장소는 10월 18일 조회 기준 별 215,127개입니다. 이 정도 규모면 영향 범위를 잘못 읽은 사람이 많을 수밖에 없습니다.

키가 어디에 있었나

OpenCode Console은 쓰든 안 쓰든 상관없는 선택 서비스입니다. 공식 문서는 Console을 AI 게이트웨이로 설명하고 시작 방법으로 Go 구독(월 10달러), Go Plus 구독(월 40달러), 크레딧 충전, "자기 공급자 계정을 Console 게이트웨이를 통해 연결하기" 네 가지를 제시합니다. 마지막 항목이 이번에 문제가 된 경로입니다. OpenCode 요금을 내는 대신 자기 OpenAI·Anthropic 계정을 그대로 쓰려면 그 계정의 키를 Console 워크스페이스에 저장해야 합니다.

터미널 CLI만 사용

키 저장 위치: 내 컴퓨터 홈 디렉터리 아래 .local/share/opencode/auth.json 또는 환경변수

이번 침해 해당 없음
Console에 공급자 계정 연결

키 저장 위치: OpenCode가 운영하는 Console 워크스페이스

노출 가능 대상

이런 구조를 흔히 BYOK(Bring Your Own Key)라고 부릅니다. 쉽게 말해 중개 서비스가 요금을 받는 대신, 사용자 본인 계정 명의로 모델을 대신 호출해주는 방식입니다. 그러려면 중개 서비스가 사용자 키를 들고 있어야 하므로 키 보관은 이 방식의 선택 사항이 아니라 전제입니다. HN 스레드에서도 OpenRouter가 같은 기능을 제공한다는 지적이 나왔습니다. OpenCode만의 설계는 아닙니다. 오픈소스 본체가 키를 로컬에 두는 것과 그 회사의 호스팅 서비스가 키를 서버에 두는 것은 서로 다른 신뢰 결정입니다. 저장소가 MIT이고 별이 21만 개라는 사실은 호스팅 쪽 보관 방식을 보증하지 않습니다.

지금 쓸 수 있는 조건은 이렇게 정리됩니다.

항목내용
노출 대상Console 사용자 중 외부 공급자 계정을 연결해 둔 일부, 전체의 약 1.4%
해당 없음오픈소스 CLI만 쓰는 사용자
통지 방법10월 17일 오전 발송 이메일 1건. 업체는 이메일을 못 받았으면 영향이 없다고 밝힘
한국 사용 가능Console은 웹 가입이고 공식 문서에 지역 제한 조항이 없어 한국 사용자도 영향 범위에 포함. 영향 사용자의 지역 분포는 미공개
요금제Console은 선택 서비스. Go 월 10달러, Go Plus 월 40달러, 또는 크레딧 충전

"대규모 증류 공격"이 설명하지 않는 것

업체가 X에 올린 공지문은 이번 사건을 「대규모 증류 공격(large scale distillation attack)과 관련된 보안 침해」라고 적었습니다. 증류는 보통 어떤 모델에 질문을 대량으로 던져 답을 모은 뒤, 그 답으로 다른 모델을 학습시키는 행위를 가리킵니다. 훔친 키로 남의 계정에서 모델을 돌리면 그 결과가 증류에 쓰일 수 있으니 동기로는 말이 됩니다. 다만 증류라는 목적은 저장된 키가 어떻게 밖으로 나갔는지를 설명하지 않습니다.

HN 스레드에서 가장 많이 반복된 요구가 그 설명이었습니다. 한 참가자는 보안 침해와 증류 공격이라는 두 설명이 맞물리지 않는다고 적었습니다. 글을 올린 사람은 증류 공격이 어떻게 자격증명 노출로 이어지는지 상세 설명을 요구했습니다. 업체는 "조사가 진행 중이라 지금은 더 밝힐 수 없다"고만 답했습니다. 10월 18일 기준 opencode.ai에는 공개 상태 페이지도, 사후 보고서도 없습니다. 체인지로그 최신 항목은 10월 16일 v2.0.32이고 침해 관련 내용이 없습니다.

아직 공개되지 않은 것을 모아보면 이렇습니다. 어느 시스템이 뚫렸는지, 결함이 무엇이었는지, 접근이 얼마나 오래 지속됐는지, 1.4%가 몇 명인지, 노출된 키가 실제로 사용됐는지(업체는 확인할 수 없다고 밝혔습니다), 무단 사용으로 발생한 청구를 누가 부담하는지입니다. 사용자들이 하룻밤 400달러 초과 같은 무단 청구를 보고했지만 업체도 공급자도 그 건들을 확인해주지 않았습니다.

anomalyco/opencode 저장소의 GitHub 보안 자문 GHSA-632h-h47v-g4x4 카드. 심각도 High, 패키지 opencode-ai, 2026년 9월 24일 공개로 표시돼 있다

이 회사가 보안 보고에 응답하지 않는 곳은 아닙니다. 9월 24일 공개된 GHSA-632h-h47v-g4x4는 OpenCode 로컬 서버의 업그레이드 엔드포인트를 악성 웹페이지가 호출해 임의 npm 패키지를 설치시킬 수 있던 결함입니다. 이 결함은 Datadog Security Labs가 8월 11일 보고했습니다. Anomaly는 2주 만에 수정본 1.18.22를 냈습니다. 영향 버전은 npm·pnpm·Bun으로 설치한 1.14.30부터 1.18.21까지였습니다. 코딩 에이전트의 로컬 서버가 공격 경로가 되는 유형은 코딩 에이전트 플러그인의 SHA 고정 문제에서도 다룬 적이 있습니다.

다만 그때도 Anomaly는 CVE 번호를 신청하지 않았습니다. CVE가 없으면 취약점 스캐너와 의존성 감사 도구가 그 결함을 자동으로 잡아내지 못합니다. 빠른 수정과 좁은 공개를 함께 고르는 쪽이 이 회사의 방식입니다. 이번 침해에서 공지가 X 게시물 두 건으로 끝난 것도 같은 선택입니다.

8월 11일부터 9월 24일까지

별건 원격 코드 실행 결함을 Datadog이 보고, 8월 24일 1.18.22로 수정, 9월 24일 자문 공개. CVE 신청 없음

10월 16일 밤

폐기 작업 중이던 옛 시스템에 무단 접근 발생(업체 표현 기준)

10월 17일 오전

영향 사용자에게 이메일 발송. 이후 X에 공지 2건. 일부 사용자는 그 전에 이미 무단 청구를 보고

10월 18일 기준

상태 페이지·사후 보고서 없음. 업체는 Anthropic·OpenAI·Google과 함께 대응 중이라고 밝힘

키를 맡기더라도 범위는 묶어둘 수 있다

Console을 안 쓰는 독자가 이번 사건에서 챙길 것은 하나입니다. 공급자 키를 제3자에게 넘길 때 그 키가 할 수 있는 일의 범위를 미리 좁혀두는 것입니다. 공급자 두 곳 모두 이미 그 수단을 문서로 제공합니다.

Anthropic은 API 키마다 범위(scope) 객체를 둡니다. {"type": "workspace", "workspace_id": "wrkspc_..."}로 발급하면 그 키는 해당 워크스페이스 안에서만 동작합니다. {"type": "organization"}은 계정이 접근할 수 있는 모든 워크스페이스에 닿습니다. 키마다 만료 시각(expires_at)도 둘 수 있습니다. OpenAI는 프로젝트 단위로 키를 발급합니다. 프로덕션 모범 사례 문서는 "프로젝트별로 요청 한도와 지출 한도를 따로 건다"는 사용법과 함께 프로젝트 API 키 생성 시 만료일 지정, 월간 하드 지출 한도를 안내합니다.

차이는 사고가 났을 때 드러납니다. 조직 전체 범위 키 하나를 중개 서비스에 넘겨두면 그 키가 새는 순간 계정 전체가 열립니다. 반대로 전용 워크스페이스나 전용 프로젝트에 묶고 지출 한도를 월 몇십 달러로 걸어둔 키는 같은 사고에서도 피해가 그 한도에서 멈춥니다. 하룻밤 400달러 청구가 400달러에서 더 안 올라가는 이유가 한도 설정 하나입니다. HN 스레드에서도 키 체계마다 무효화 엔드포인트가 있어야 한다는 지적과 에이전트에서 키를 떼어내 프록시 뒤에 두자는 제안이 나왔습니다.

OpenCode Console에 공급자 계정을 연결한 적이 있으면 이메일을 받았는지와 상관없이 그 키를 지금 폐기하고 새로 발급하는 편이 낫습니다. 업체 스스로 키가 실제로 쓰였는지 확인할 수 없다고 밝혔습니다. 1.4%라는 숫자도 조사 중 수치입니다. 폐기는 이메일 안의 링크가 아니라 각 공급자 콘솔에서 직접 하고 10월 16일 이후 사용량 기록을 한 번 훑어보면 됩니다. 새 키를 만들 때는 전용 워크스페이스나 전용 프로젝트에 묶고 지출 한도와 만료일을 같이 걸어두면, 다음에 어느 중개 서비스가 뚫려도 청구서가 그 선에서 멈춥니다.