내가 인기 있는 AI 확장 프로그램을 역공학(Reverse Engineering)한 방법
요약
인기 AI 확장 프로그램인 Blackbox AI를 역공학하여, UI에서 제공하는 프리미엄 모델들이 실제로는 단일 Azure OpenAI 배포로 라우팅되고 있음을 밝혀냈습니다. LiteLLM을 활용한 프록시 구조와 숨겨진 Electron 앱의 존재 등 기술적 실체를 분석합니다.
핵심 포인트
- Blackbox AI는 프리미엄 모델을 표방하지만 실제로는 저렴한 모델로 라우팅함
- LiteLLM을 사용하여 Azure OpenAI로 요청을 프록시하는 구조 확인
- 확장 프로그램 내부에 보안이 취약한 Electron 음성 채팅 앱 포함됨
- 네트워크 헤더 분석을 통해 모델 라우팅의 허위 사실을 검증 가능
요약 (TL;DR)
Blackbox AI (수백만 건의 설치 수를 기록한 VS Code 확장 프로그램)는 Minimax M2 및 Kimi K2.6과 같은 프리미엄 LLM (대규모 언어 모델)에 대한 무료 액세스를 제공한다고 주장하지만, 실제로는 모든 무료 티어 요청을 gpt-5.4-nano를 서비스하는 단일 Azure OpenAI 배포로 조용히 라우팅(Routing)합니다. UI는 25개 이상의 모델 선택지를 제시하지만, 프록시 허용 목록(Allowlist)에는 정확히 3개의 모델 문자열만 수용되며, 이들은 모두 동일한 백엔드로 연결됩니다. 응답 헤더(Response headers)가 이를 증명합니다: 모든 모델 선택에 대해 동일한 x-litellm-model-id, x-litellm-model-api-base, 그리고 llm_provider-azureml-model-session이 나타납니다. 백엔드는 Google Cloud Run에서 LiteLLM v1.80.11을 실행하며, 스웨덴 중부(Sweden Central)의 Azure OpenAI로 프록시(Proxying)합니다. 이 확장 프로그램은 하드코딩된 Xirsys TURN 자격 증명과 안티 탬퍼(Anti-tamper, 변조 방지) 보호 기능이 전혀 없는 숨겨진 Electron 음성 채팅 앱을 포함하고 있습니다. 전체 재현 명령은 하단에 있습니다. 모든 주장을 curl로 검증하십시오.
서론 (Introduction)
AI 코딩 어시스턴트(AI coding assistants)는 어디에나 있습니다. 그중 특히 인기 있는 확장 프로그램 하나가 내 눈을 사로잡았습니다: 바로 Blackbox AI입니다. 이 프로그램은 수백만 건의 설치 수, 25개 이상의 프리미엄 모델(GPT-5, Claude Sonnet 4, Grok, Gemini 등)을 갖춘 UI, 그리고 특히 Minimax M2와 Kimi K2.6을 유인책으로 내세우는 무료 티어를 자랑합니다.
AI의 세계에서 컴퓨팅 자원(Compute)은 저렴하지 않습니다. 수천 명의 개발자를 지구상에서 가장 비싼 LLM으로 라우팅하는 무료 사용 확장 프로그램은 구조적인 의문을 제기합니다. 이것은 미끼 상품(Loss-leader) 전략일까요? 양자화된(Quantized) 로컬 모델을 사용하고 있는 걸까요? 아니면 UI와 실제 추론(Inference) 사이에 멀티 프로바이더 게이트웨이(Multi-provider gateway)가 위치하고 있는 걸까요?
나는 이를 알아내기로 했습니다. 이것은 내가 확장 프로그램을 다운로드하고, 압축을 풀고, 난독화된(Minified) JavaScript를 디컴파일(Decompile)하고, 네트워크 요청을 추적하며, 사용자와 모델 사이의 프록시 인프라(Proxy infrastructure)를 매핑한 과정에 대한 이야기입니다.
계획 (The Plan)
코드에 뛰어들기 전에, 조사 전략이 필요했습니다. 확장 프로그램을 역공학할 때는 수천 줄의 난독화된 Webpack 스파게티 코드 속에서 길을 잃기 쉽습니다. 나는 답을 얻고자 하는 정확한 질문들을 적어 내려갔습니다:
- 설치 중에 어떤 일이 일어나는가? 어떤 파일들이 기기에 다운로드되는가?
- 어떤 권한을 요청하는가? 파일 시스템 전체에 대한 접근 권한을 가지고 있는가?
- 실제로 어떤 코드가 실행되는가? 백그라운드 워커 (Background Worker)는 어떻게 구성되어 있는가?
- 서버와 어떻게 통신하는가? 어떤 API 엔드포인트 (API endpoints)를 호출하는가?
- 모델 라우팅 (Model routing)은 어떻게 작동하는가? UI에서 "Minimax"를 클릭하면 어떤 일이 발생하는가?
- 주장하는 대로 작동하고 있는가? 아니면 프리미엄이 아닌 사용자들이 몰래 더 저렴한 모델로 라우팅되고 있는가?
체크리스트를 준비한 후, 나는 시작했습니다.
1단계: 마켓플레이스에서 확장 프로그램 다운로드하기
나는 공식 VS Code 마켓플레이스(Marketplace)에서 시작했습니다. Blackbox AI의 페이지는 매우 세련되게 다듬어져 있었습니다.
첫인상
- 주장하는 기능: 코드 자동 완성 (Code autocomplete), 전체 코드베이스 컨텍스트 (Full codebase context), 그리고 프리미엄 모델로 구동되는 채팅 인터페이스.
- 권한: 표준 VS Code 워크스페이스 (Workspace) 접근 권한.
- 리뷰: 대부분 긍정적이었으나, 일부 사용자들은 특정 모델을 사용할 때 AI가 예상보다 "멍청하게" 느껴질 때가 있다고 언급했습니다. 이것이 나의 첫 번째 경고 신호 (Red flag)였습니다.
나는 '설치(Install)'를 클릭했습니다.
2단계: 확장 프로그램 설치하기
나는 일상적으로 사용하는 OS를 오염시키지 않으면서 파일 시스템의 변화를 모니터링하기 위해, 이번 조사를 위해 격리된 리눅스 (Linux) 환경 (Ubuntu)을 사용했습니다.
설치하자마자 매끄러운 웹뷰 (Webview) 패널이 열렸습니다. 거기에는 모델을 선택할 수 있는 드롭다운 메뉴가 포함된 채팅 인터페이스가 나타났습니다: GPT-4o, Claude 3.5 Sonnet, Gemini 1.5 Pro, Kimi K2.6, Minimax, DeepSeek, Grok 등이 있었습니다.
로그인을 요청했지만, 흥미롭게도 계정 없이도 몇 개의 메시지를 보낼 수 있게 허용했습니다. 나는 간단한 질문을 던졌습니다: "당신은 누구인가요?"
그것은 다음과 같이 응답했습니다:
"저는 API를 통해 통합된 AI 소프트웨어 엔지니어링 어시스턴트, BLACKBOXAI입니다. 귀하의 레포지토리 (Repo)에 있는 파일을 읽고 편집할 수 있습니다..."
매우 기업적이고, 매우 정해진 스크립트(Scripted) 같았습니다. 나는 나중에 참고하기 위해 이 동작을 기록해 두었습니다.
3단계: 디스크 상에서 확장 프로그램이 위치한 곳 찾기
Chrome에 확장 프로그램을 설치하면 ~/.config/google-chrome/Default/Extensions로 들어갑니다 (Firefox는 ~/.mozilla/firefox/ 아래에 유사한 구조를 사용합니다). VS Code의 경우, 홈 폴더 내의 숨겨진 디렉토리에 기본적으로 압축이 풀린 상태로 저장됩니다.
나는 터미널을 열고 추적을 시작했습니다:
cd ~/.vscode/extensions/
ls -la | grep blackbox
찾았습니다: blackboxapp.blackboxagent-3.7.0/.
브라우저 및 에디터 확장 프로그램은 마법 같은 컴파일된 바이너리(Compiled Binaries)가 아닙니다. 그것들은 단지 HTML, CSS, JavaScript, 그리고 매니페스트 파일(Manifest file)을 포함하고 있는 압축된 폴더일 뿐입니다. 이 디렉토리로 이동함으로써, 나는 마켓플레이스(Marketplace)를 효과적으로 우회하여 원본 소스 코드(Raw source code)를 손에 넣을 수 있었습니다.
4단계: 설치된 파일 복사하기
활성화된 확장 프로그램 디렉토리에서 직접 라이브 분석(Live analysis)을 수행하는 것은 결코 권장되지 않습니다. 만약 에디터가 확장 프로그램을 자동으로 업데이트하거나, 실수로 파일을 손상시키면 작업 상태를 잃게 되기 때문입니다.
나는 전체 폴더를 나의 분석 샌드박스(Analysis sandbox)로 복사했습니다:
mkdir -p ~/Desktop/BLACKBOX/
cp -r ~/.vscode/extensions/blackboxapp.blackboxagent-3.7.0/ ~/Desktop/BLACKBOX/
cd ~/Desktop/BLACKBOX/blackboxapp.blackboxagent-3.7.0/
이제 나는 마음껏 코드를 수정하고, 망가뜨리고, grep으로 검색할 수 있게 되었습니다.
5단계: 코드베이스 첫 살펴보기
tree -L 2 명령어를 빠르게 실행하여 전체적인 구조를 파악했습니다.
blackboxapp.blackboxagent-3.7.0/
├── package.json <-- 매니페스트 (The Manifest)
├── dist/
...
초기 생각
이것은 표준적인 현대적 확장 프로그램 아키텍처(Architecture)이지만, 예상했던 것보다 더 복잡했습니다:
webview-ui/: 채팅 인터페이스와 모델 선택을 처리하는 컴파일된 React 애플리케이션 (Application).dist/extension.js: 두뇌 역할을 하는 부분입니다. 9,945줄에 달하는 미니파이(Minified)된 Webpack 출력물(13.7 MB)입니다. 제가 지금까지 봐온 일반적인 4,000~5,000줄 규모의 번들(Bundle)보다 훨씬 크며, 이는 내장된 통합 기능(Integrations)의 수가 엄청나다는 것을 암시합니다.electron-audio/: 놀라운 발견이었습니다. LiveKit을 사용하여 음성 기반 AI 채팅을 수행하는 독립적인 Electron 앱입니다. 이는 마켓플레이스 페이지에는 광고되지 않았던 기능입니다.dist/*.wasm: 13개의 프로그래밍 언어(Python, JS, TS, Rust, Go, Java, C, C++, Ruby, PHP, Swift, C#, TSX)를 파싱하기 위한 tree-sitter WASM 바이너리(Binaries)입니다. 이 확장 프로그램은 문맥 인식 자동 완성(Context-aware autocomplete) 및 분석을 위해 사용자의 코드를 로컬에서 파싱합니다.dist/win/x64/7za.exe: 압축 해제에 사용되는 번들링된 7zip 실행 파일(Executable)입니다.
6단계: 매니페스트 파일 (The Manifest File)
브라우저 확장 프로그램에서는 이것이 manifest.json입니다. 여기서는 package.json입니다. 저는 이 확장 프로그램이 어떤 권한(Permissions)과 활성화 이벤트(Activation events)를 요청하는지 확인하기 위해 파일을 열었습니다.
{
"name": "blackboxagent",
"displayName": "Blackbox Agent - Coding Copilot",
...
눈에 띄는 점:
- 이 확장 프로그램은
onStartupFinished및onInlineCompletionRequest에서 활성화됩니다. 즉, 에디터가 로드되는 즉시 백그라운드에서 실행되며, 자동 완성 시스템에도 후킹(Hooking)됩니다. - 설정에서 MCP (Model Context Protocol) 설정을 노출합니다. 이 확장 프로그램은 MCP 호스트(Host)로 동작하여 외부 MCP 서버에 연결할 수 있습니다.
package.json에 노출된blackbox.userId설정 속성은 없습니다. 대신,userId는 런타임(Runtime)에 UUID 라이브러리를 통해 생성되며 VS Code의globalState에 저장됩니다 ("uuid": "^11.0.3"의존성을 통해 확인됨). 참고:globalState는 암호화된 비밀 저장소(Secret storage)가 아닌 일반 JSON입니다. 따라서 다른 확장 프로그램이나 워크스페이스 저장소 디렉토리에 대한 파일 시스템 접근 권한이 있는 모든 프로세스에서 읽을 수 있습니다.
7단계: 전체 확장 프로그램 아키텍처(Architecture) 매핑
매니페스트(Manifest)에 대한 초기 정찰(Recon)과 파일들에 대한 하이레벨 스캔을 바탕으로, 저는 데이터가 애플리케이션을 통해 어떻게 흐르는지에 대한 멘탈 모델(Mental Model)을 구축했습니다. 복잡한 UI를 특징으로 하는 VS Code 확장 프로그램은 거의 항상 **웹뷰 아키텍처 (Webview architecture)**에 의존하며, 이는 본질적으로 애플리케이션을 두 개의 별개 영역으로 분리합니다:
- 프론트엔드 (Webview UI): 이것은 샌드박스화된 React 애플리케이션(
webview-ui/main.js)입니다. 채팅 인터페이스, 모델 선택 드롭다운의 렌더링을 처리하고 사용자 입력을 받습니다. 격리된 iframe과 유사한 환경에서 실행되기 때문에, 파일 시스템이나 VS Code API에 직접 접근할 수 없습니다 (단,fetch를 통한 네트워크 요청은 가능합니다). - 백엔드 (Extension Host): 이것은 핵심 Node.js 프로세스(
dist/extension.js)입니다. VS Code API(vscode.*), 사용자의 로컬 파일 시스템(프로젝트 파일을 읽기 위함), Secret Storage(토큰 저장용), 그리고 네트워크 스택에 대한 완전한 접근 권한을 가집니다.
이 두 환경은 postMessage API를 사용하여 직렬화된 JSON 메시지를 서로 주고받음으로써만 통신할 수 있습니다.
다음은 전체 분석 후에 제가 매핑한 전체 아키텍처 흐름입니다:
graph TD
User([User]) -->|Selects Model & Types Prompt| UI[Webview UI<br>React / main.js]
...
핵심 요약 (Key Takeaway)
이것은 단순한 "박스 안의 채팅" 확장 프로그램이 아닙니다. 다음과 같은 기능을 갖춘 멀티 프로바이더 LLM 오케스트레이션(Orchestration) 플랫폼입니다:
- 16개 이상의 API 프로바이더 통합 (API provider integrations) (Anthropic, OpenAI, Google Vertex, AWS Bedrock, OpenRouter, Ollama, LM Studio, Mistral, DeepSeek, Together, Requesty, Gemini, LiteLLM (Step 10의 UV switch 문을 통해 확인됨))
- ACP 브리지 (ACP bridge) (에이전트 통신 프로토콜 (Agent Communication Protocol, 비표준이며 확장 프로그램 자체 용어); Codex CLI, Claude Code, Gemini CLI와 같은 외부 코딩 에이전트를 서브프로세스 (subprocesses)로 생성 가능)
- MCP (Model Context Protocol) 허브; 외부 도구 서버(데이터베이스, API)에 연결
- LiveKit 음성 채팅 (LiveKit voice chat); AI와의 실시간 오디오 대화
- tree-sitter 코드 파싱 (tree-sitter code parsing); 문맥 인식 자동 완성을 위한 로컬 코드 분석
- Google Cloud Storage; 서버 측 문맥을 위해 워크스페이스 파일 업로드
- Stripe 결제 통합 (Stripe billing integration); 크레딧 기반 소비 모델
- 리비전 관리 (Revision management); 롤백(rollback) 기능을 갖춘 모든 파일 수정 사항 추적
Step 8: JavaScript 읽기 (압축된 악몽 (The Minified Nightmare))
나는 dist/extension.js 파일을 열었다.
그것은 9,945줄, 13.7 MB에 달하는 압축된(minified) Webpack 번들로, 내가 역공학해 본 일반적인 확장 프로그램 크기의 두 배가 넘었다. 변수 이름은 단일 문자로 축소되어 있었다 (a, b, c, t, e). 주석은 전혀 없었다. 이 엄청난 크기는 번들링된 방대한 양의 SDK와 통합 기능(OpenAI SDK, Anthropic SDK, Google Generative AI SDK, Mistral SDK, LiveKit SDK, MCP SDK, Stripe SDK
터미널에는 압축된(minified) 코드의 거대한 벽이 쏟아져 나왔습니다. 저는 지원되는 모든 모델의 기능과 가격 정보를 포함하고 있는 중앙 집중식 모델 설정 레지스트리인 KH 객체를 추출했습니다. 다음은 Minimax에 대한 정확한 엔트리(entry)입니다:
"minimax-m2":{
maxTokens: 8192,
contextWindow: 2e5,
...
이것은 그야말로 금광이었습니다. 해당 확장 프로그램은 Minimax에 대해 requiresInterleavedReasoning: !0 및 supportsNativeTools: !0를 명시적으로 플래그(flag) 처리하고 있었습니다. 이를 통해 저는 이 확장 프로그램이 특정 제공업체(provider)를 위해 내장된 커스텀 로직(custom logic)을 실제로 가지고 있음을 알 수 있었습니다.
증거: rg -n 'KH=' dist/extension.js | rg 'custom/blackbox-base-2'; KH 객체는 dist/extension.js 내부의 wp 모듈에 존재합니다. 디스크 상의 모든 엔트리는 여기에 표시된 내용과 일치합니다. KH 객체에는 다음과 같은 23개 이상의 모델 엔트리가 포함되어 있습니다: custom/blackbox-base-2, minimax-m2, moonshotai/kimi-k2.6, custom/blackbox-pro, claude-3-5-sonnet-20241022, blackbox-pro-plus, claude-3-7-sonnet-20250219, gpt-4o-mini, deepseek-v3, deepseek-r1, o3-mini, o1, gpt-5, grok-3-beta, grok-4, llama-4-maverick, z-ai/glm-4.7, moonshotai/kimi-k2, anthropic/claude-sonnet-4, anthropic/claude-opus-4, anthropic/claude-opus-4.7, google/gemini-2.5-pro-preview, google/gemini-3-pro-preview 등이 있습니다.
9단계: 데이터 흐름(Data Flow) 추적하기
해당 모델 문자열이 API로 전달될 때 어떤 일이 발생하는지 확인해야 했습니다. 저는 네트워크 요청(network request)을 생성하는 책임이 있는 함수에 도달할 때까지 압축된 함수들을 통해 `
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기