
보안 사고 분석 「JetBrains 악성 AI 플러그인 사건」과 비보유형 권한 위임
요약
JetBrains Marketplace에서 발생한 악성 AI 플러그인의 API 키 탈취 사건을 분석하고, 이를 방지하기 위한 '비보유형 권한 위임' 개념을 제안합니다. 플러그인이 직접 비밀 정보를 보유하지 않도록 프로세스를 분리하는 보안 아키텍처를 다룹니다.
핵심 포인트
- JetBrains AI 플러그인이 사용자 API 키를 탈취하여 재판매한 보안 사고 발생
- 정상적인 기능 동작을 위장하여 탐지를 회피하는 공격 방식의 위험성
- 플러그인이 API 키를 직접 보유하지 않게 하는 '비보유형 권한 위임'의 필요성
- 앱 내 브라우저와 프로세스 분리를 통한 보안 강화 아키텍처 제안
0. 서론
이 기사는 보안 관련 뉴스를 다루며, 이에 대해 비보유형 권한 위임 (Non-holding Delegation)을 어떻게 적용할 수 있는지 고찰하는 기술 기사입니다.
비보유형 권한 위임에 대해서는 다음 기사를 참조해 주세요.
1. JetBrains 악성 AI 플러그인 사건
2026년 6월, JetBrains는 Marketplace에서 공개되었던 15개의 서드파티 (Third-party) AI 플러그인이 이용자가 입력한 AI 프로바이더 (AI Provider)의 API 키를 훔칠 목적으로 만들어졌다고 공표했습니다. [1]
이러한 플러그인들은 AI를 통한 코드 보조, 코드 리뷰, 테스트 생성, 커밋 메시지 생성 등 일반적인 AI 플러그인으로서 동작하고 있었습니다.
이용자는 플러그인의 설정 화면에 API 키를 입력합니다.
플러그인은 해당 키를 정규 설정 정보로 저장하는 한편, 공격자의 서버로도 전송하고 있었습니다.
2. 정상적인 처리의 조합으로 API 키를 훔치다
플러그인이 수행하던 개별 처리는 일반적인 것이었습니다.
- 설정 화면 표시
- API 키 수신
- 설정 저장
- JSON 생성
- 외부 서버와 통신
- AI 프로바이더 호출
이 공격의 교묘한 점은 API 키 입력란에서 공격자 서버까지의 데이터 흐름에 있습니다.
언뜻 정상적으로 보이는 각 기능에 탈취 처리를 하나 추가하는 것만으로 공격이 성립하기 때문에, 단순한 금지 API 검사나 동작 확인으로는 탐지하기 어려웠던 것으로 보입니다.
훔친 키의 재판매 의혹
플러그인에는 유료 기능도 있었으며, 이용자가 소액을 지불하면 공격자 서버로부터 다른 API 키가 반환되고, 그 키를 사용하여 AI 프로바이더를 호출하는 처리가 확인되었습니다.
Aikido는 무료 이용자로부터 수집한 키를 유료 이용자에게 배포하는 재판매 서비스를 구축했을 가능성을 지적하고 있습니다.
3. X509TrustManager
악성 플러그인은 독자적인 X509TrustManager도 설정하고 있었습니다.
X509TrustManager는 HTTPS 통신 대상 서버의 인증서를 검증하는 기능을 가집니다.
인증서를 무조건 신뢰하도록 X509TrustManager를 설정하면, 자가 서명 인증서(Self-signed certificate)나 신뢰할 수 없는 인증서를 사용하는 HTTPS 서버에도 접속할 수 있습니다.
다만, 이번에 확인된 API 키 전송 대상은 평문 HTTP였기 때문에 이 기능이 API 키 탈취에 필수적인 것은 아니었습니다.
이 처리는 API 키 탈취 자체에는 불필요했지만, 서드파티 플러그인이 IDE의 JVM 전체에 영향을 미치는 설정을 변경할 수 있었다는 것을 보여줍니다.
4. 문제는 플러그인이 API 키를 보유한다는 것
이렇게 살펴보면, JetBrains 사건은 정상으로 위장한 플러그인이 비밀 정보를 훔친 사건이었습니다.
어떻게 하면 이러한 악의적인 플러그인으로부터 비밀 정보를 지킬 수 있을까요?
공개 전 검사에서 엄격하게 체크한다 하더라도, 플러그인이 동작을 위장하고 있다면 이번 사건처럼 검사를 빠져나가게 됩니다.
문제의 본질은 플러그인에 API 키를 전달하는 것에 있습니다.
애초에 비밀 정보를 가지고 있지 않다면, 플러그인에게 빼앗길 것도 없습니다.
5. 분리된 앱 내 브라우저를 통한 비보유화
JetBrains의 IDE에 비보유형 권한 위임을 적용할 경우, IDE 프로세스로부터 분리된 앱 내 브라우저를 마련하고, 플러그인은 해당 브라우저를 경유하여 AI 서버를 이용하는 구성을 생각할 수 있습니다.
구성 요소를 단순화하면 다음과 같습니다.
-
AI 서버
- 비밀키를 보유
-
프로세스 분리된 앱 내 브라우저
- IDE 프로세스로부터 분리되어, 플러그인이 세션 영역에 접근할 수 없을 것
-
AI 플러그인
- AI 서버의 공개키를 보유
이용자는 앱 내 브라우저 상에서 AI 서버에 로그인합니다.
플러그인은 공통키 (Symmetric key)를 생성하여 AI 서버의 공개키로 암호화한 뒤 브라우저로 전송합니다.
브라우저는 로그인 후의 세션 상에서 플러그인으로부터 전달받은 암호화된 공통키를 AI 서버로 전송합니다.
AI 서버는 비밀키로 암호화된 공통키를 복호화하여 공통키와 세션을 대응시킵니다.
AI 기능을 이용할 때, 플러그인은 공통키로 인증된 처리 요청을 앱 내 브라우저로 전달합니다.
브라우저는 자신이 보유한 인증된 세션을 사용하여 요청을 AI 서버로 중계합니다.
플러그인
↓ 공통키로 인증된 요청
앱 내 브라우저
...
이 구성에서는 Cookie나 세션 ID (Session ID)와 같은 인증 정보가 앱 내 브라우저(In-app browser)에 격리되어, 플러그인에서 직접 접근할 수 없습니다. 또한, AI 서버를 이용하기 위한 API 키 (API Key)를 플러그인에 발급할 필요도 없습니다.
악성 플러그인이 공통키 (Common Key)를 외부로 전송하더라도, 해당 공통키에 대응하는 브라우저 세션 (Browser Session)이 존재하지 않는 다른 단말기에서는 이용할 수 없습니다.
이와 같이 플러그인에 AI 서버의 인증 정보를 보유하게 하지 않음으로써, 인증 정보의 유출과 탈취한 권한을 이용한 다른 단말기로의 횡적 이동 (Lateral Movement)을 방지합니다.
6. Marketplace 심사가 아닌 구조로 방어
JetBrains는 이번 사건을 계기로 해당 플러그인의 삭제, 게시자 계정 정지, 검사 규칙 강화 조치를 취했습니다.
이러한 대응은 필요하지만, Marketplace의 심사만으로 유사한 공격을 완전히 방어하기는 어렵습니다.
AI 플러그인에게 있어 API 키 입력, 설정 정보 저장, 외부 서버와의 통신은 모두 정상적인 기능입니다.
악성 플러그인과의 차이점은 입력된 API 키를 공격자의 서버로도 전송했다는 점에 있습니다.
정상 기능과 악성 동작의 차이가 작기 때문에, 공개 전 심사에서 모든 것을 체크하는 데에는 한계가 있습니다.
구조의 전환
플러그인이 악성이라 하더라도, 재사용 가능한 인증 정보를 획득할 수 없는 구조로 전환해야 합니다.
비보유형 권한 위임 (Non-holding Delegation)에서는 플러그인에 비밀 정보를 안전하게 저장하게 하는 대신, 비밀 정보가 없어도 기능할 수 있도록 설계합니다.
악성 코드를 탐지하는 방어와 더불어, 탐지를 우회하더라도 피해가 횡적으로 확산되지 않는 메커니즘을 마련하는 것이 중요합니다.
JetBrains Marketplace Ecosystem Security Update: Addressing Malicious Third-Party AI Plugins
Discussion

AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기