메뉴
HN
Hacker News 51일 전

버셀(Vercel) 클로드 플러그인, 사용자의 모든 프롬프트 읽어 논란

IMP
8/10
핵심 요약

버셀(Vercel)의 클로드 코드(Claude Code) 플러그인이 사용자의 모든 프롬프트를 수집하려 한다는 사실이 밝혀져 개인정보 침해 우려가 커지고 있습니다. 이 플러그인은 사용자 동의를 받는 과정에서 정상적인 UI 대신 시스템 컨텍스트에 프롬프트를 주입(injection)하고 셸 명령어를 실행하는 방식을 사용하며, 배포와 무관한 프로젝트에서도 기본적으로 전체 배시 명령어 문자열을 수집합니다.

번역된 본문

2026년 4월 9일 — 클로드 코드(Claude Code)의 버셀(Vercel) 플러그인이 여러분의 모든 프롬프트를 읽으려고 합니다!

저는 버셀과 전혀 상관없는 프로젝트를 진행하고 있었습니다. vercel.json도, next.config도, 버셀 종속성도 없었습니다. 아무것도 없었죠. 그런데 갑자기 이런 메시지가 떴습니다: “버셀 플러그인이 익명 사용 데이터를 수집합니다… 프롬프트 텍스트도 공유하시겠습니까?”

버셀 프로젝트가 아닌데도 모든 단일 프롬프트에 대해 요청했습니다. 이건 뭔가 잘못되었다고 느껴졌습니다. 그래서 클로드를 이용해 소스 코드를 깊이 파고들었습니다.

요약하자면: 배포 플러그인이 모든 프로젝트에 걸쳐 여러분이 입력하는 모든 프롬프트를 읽겠다고 요청하고 있습니다. 왜요?

동의 질문은 실제 UI 요소가 아닙니다. 이것은 클로드의 시스템 컨텍스트(context)에 프롬프트 주입(injection) 방식으로 전달됩니다. 플러그인이 클로드에게 질문을 하고, 사용자의 답변에 따라 셸 명령어를 실행하도록 지시하는 것입니다.

“익명 사용 데이터”에는 버셀 서버로 전송되는 전체 배시(bash) 명령어 문자열이 포함됩니다. 이것이 선택 사항이라는 안내는 결코 하지 않습니다. 이 모든 것은 버셀 프로젝트뿐만 아니라 모든 프로젝트에서 실행됩니다. 플러그인에는 프레임워크 감지 기능이 내장되어 있지만, 원격 측정(telemetry)을 제한하는 데는 사용하지 않습니다.

문제 1: 동의는 가짜입니다

먼저 요청 자체를 보겠습니다. 버셀 플러그인은 배포, 프레임워크 지침 및 스킬 주입을 돕습니다. 그런데 왜 모든 프로젝트에서 여러분이 입력하는 모든 프롬프트를 읽어야 합니까? 이것은 플러그인 개선을 위한 분석이 아닙니다. 버셀 배포를 도와야 하는 도구의 범위를 훨씬 벗어난 일입니다.

이 요청을 받아들인다 해도, 요청하는 방식이 더 나쁩니다. 버셀 플러그인이 원격 측정에 대해 묻고 싶을 때 CLI 프롬프트나 설정 화면을 보여주는 것이 아닙니다. 대신, 시스템 컨텍스트에 자연어 지침을 주입하여 AI에게 질문을 하도록 지시합니다. 클로드는 그 지침을 읽고, AskUserQuestion을 사용하여 질문을 렌더링한 다음, 사용자의 답변에 따라 echo 'enabled' 또는 echo 'disabled'를 실행하여 파일 시스템에 기본 설정 파일을 작성합니다.

다음은 플러그인 소스에서 주입된 지침의 모습입니다. 결과는 네이티브 클로드 코드 질문과 완전히 동일하게 보입니다. 서드파티 플러그인에서 왔다는 시각적 표시가 없습니다. 차이를 구분할 수 없습니다.

이것은 단순한 컨텍스트 주입(스킬, 문서, 프레임워크 지침 등 플러그인의 의도된 용도)이 아닙니다. 버셀 플러그인은 클로드에게 특정 질문을 하고 응답에 따라 파일 시스템에서 셸 명령을 실행하도록 지시하는 행동 지침을 주입합니다. “다음은 Next.js 라우팅에 대한 컨텍스트입니다”와 “사용자에게 이 질문을 한 다음 파일 시스템에 기록하세요”는 큰 차이가 있습니다.

누군가 GitHub에서 이와 정확히 같은 우려를 제기했습니다(이슈 #34). 버셀 개발자는 이렇게 응답했습니다: “Cursor, CC 또는 Codex 같은 1st party 마켓플레이스를 사용할 때 일회성 CLI 프롬프트를 만들 수 없습니다. 활성화는 에이전트 내부에서 이루어집니다. 이 부분은 얼마든지 개선할 의향이 있지만, 더 나은 솔루션이 필요합니다.”

그 제약은 이해합니다. 하지만 “적절한 동의를 구현할 수 없다”는 답변은 기능을 배포하지 않는 것이어야지, 대신 프롬프트 주입을 해서는 안 됩니다. 오늘날의 제약 내에서도 질문 텍스트에 “이 질문은 버셀 플러그인에서 나온 것입니다”라고 추가하고, 훅(hook)의 JavaScript에서 직접 기본 설정 파일을 기록하도록 클로드에게 셸 명령을 실행하도록 지시할 수 있었습니다.

문제 2: “익명 사용 데이터”는 생각과 다릅니다

동의 질문은 이렇게 말합니다: “버셀 플러그인은 스킬 주입 패턴과 기본적으로 사용되는 도구와 같은 익명 사용 데이터를 수집합니다.”

무해해 보입니다. 하지만 실제로 수집하는 것은 다음과 같습니다:

수집 항목 | 시기 | 질문 여부 장치 ID, OS, 감지된 프레임워크, 버셀 CLI 버전 | 모든 세션 시작 시 | 아니오 - 항상 켜짐 전체 배시 명령어 문자열 | 클로드가 배시 명령을 실행할 때마다 | 아니오 - 항상 켜짐 전체 프롬프트 텍스트 | 입력하는 모든 프롬프트 | 예 - 동의한 경우에만

중간 행을 보십시오. 모든 배시 명령어 — 단순한 도구 이름이 아니라 전체 명령어 문자열 — 이 telemetry.vercel.com으로 전송됩니다. 파일 경로, 프로젝트 이름, 환경 변수 이름, 인프라 세부 정보 등 명령어에 있는 모든 것을 얻게 됩니다.

원문 보기
원문 보기 (영어)
09 Apr 2026 The Vercel Plugin on Claude Code wants to read all your prompts! I was working on a project that has nothing to do with Vercel. No vercel.json , no next.config , no Vercel dependencies. Nothing. And then this popped up: “The Vercel plugin collects anonymous usage data… Would you like to also share your prompt text?” Every single prompt. On a non-Vercel project. That felt wrong. So I went deep into the source code with Claude. tl;dr: A deployment plugin is asking to read every prompt you type, across every project. Why? The consent question isn’t even a real UI element. It’s delivered via prompt injection into Claude’s system context - the plugin tells Claude to ask you a question and run shell commands based on your answer. “Anonymous usage data” includes your full bash command strings sent to Vercel’s servers. You’re never told this is optional. All of this runs on every project, not just Vercel ones. The plugin has framework detection built in - it just doesn’t use it to gate telemetry. Problem 1: The consent is fake First, the ask itself. The Vercel plugin helps with deployments, framework guidance, and skill injection. Why does it need to read every prompt you type? Across every project? That’s not analytics for improving the plugin - that’s way outside its scope for a tool that’s supposed to help you ship to Vercel. But even if you accept the ask, the way they ask is worse. When the Vercel plugin wants to ask you about telemetry, it doesn’t show a CLI prompt or a settings screen. Instead, it injects natural-language instructions into Claude’s system context telling the AI to ask you a question. Claude reads those instructions, renders the question using AskUserQuestion , and then - based on your answer - runs echo 'enabled' or echo 'disabled' to write a preference file on your filesystem. Here’s what those injected instructions look like in the plugin source: The result looks identical to a native Claude Code question. There is no visual indicator that it’s from a third-party plugin. You cannot tell the difference. This isn’t just context injection - which is the intended use for plugins (skills, docs, framework guidance). The Vercel plugin injects behavioral instructions telling Claude to ask a specific question AND execute shell commands on your filesystem based on your response. There’s a big difference between “here’s context about Next.js routing” and “ask the user this question and then write to their filesystem.” Someone raised this exact concern on GitHub ( issue #34 ). A Vercel dev responded : “When using a 1st party marketplace like Cursor, CC or Codex, you can’t create a one time CLI prompt. The activation comes from within the agent harness. Totally open to visiting this, but we need a better solution.” I get the constraint. But the answer to “we can’t build proper consent” should be not shipping the feature - not doing prompt injection instead. Even within today’s constraints, they could have added “This question is from the Vercel plugin” in the question text, and written the preference file directly from the hook’s JavaScript instead of instructing Claude to run shell commands. Problem 2: “Anonymous usage data” is not what you think The consent question says: “The Vercel plugin collects anonymous usage data such as skill injection patterns and tools used by default.” Sounds harmless. Here’s what it actually collects: What gets sent When Do they ask? Your device ID, OS, detected frameworks, Vercel CLI version Every session start No - always on Your full bash command strings After every bash command Claude runs No - always on Your full prompt text Every prompt you type Yes - only if you opt in That middle row. Every bash command - the full command string, not just the tool name - sent to telemetry.vercel.com . File paths, project names, env variable names, infrastructure details. Whatever’s in the command, they get it. Describing this as “anonymous usage data such as skill injection patterns and tools used” is a stretch. The consent question frames your choice as “share prompts too, or don’t.” It never tells you the bash command collection is optional. It never says you can turn it off. The actual choice isn’t between telemetry and no telemetry - it’s between “some” and “more.” All of this is tied together with a persistent device UUID stored on your machine, created once and reused forever. Every session, every project, linkable across time. The opt-out exists - an env var VERCEL_PLUGIN_TELEMETRY=off that’s documented in the plugin’s README. But that README lives inside the plugin cache directory. Not anywhere you’d see during installation or first run. Problem 3: This runs on all your projects This is what originally set me off - the consent question popping up on a non-Vercel project. I went through every telemetry file looking for project detection. There is none. The hook matchers confirm it. The UserPromptSubmit matcher is literally an empty string - match everything. Install the plugin for your Next.js app, and it’s watching your Rust project, your Python scripts, your client work. Everything. The irony? The plugin already has framework detection built in. It scans your repo and identifies what frameworks you’re using on every session start. But it only uses this to report what it found - not to decide whether telemetry should fire. The gate exists. They just didn’t use it. What should change Vercel All telemetry should require explicit opt-in. “We’d like to collect: (1) session metadata, (2) bash commands, (3) your prompts - which would you like to enable?” Honest disclosure with a real choice. “Anonymous usage data” should not be the description for full bash command strings sent to a server with a persistent device ID. Telemetry should be scoped to Vercel projects only. The framework detection already exists - use it. Claude Code Plugins need visual attribution. Even [Vercel Plugin] before any question surfaced through a plugin hook. Right now, all plugin-injected questions look identical to native UI. Plugins need granular permissions. When a plugin installs, Claude Code should show: “This plugin requests access to: your bash commands, your prompt text, session metadata. Allow?” Plugins should declare scope - which files or dependencies must be present for hooks to fire. This is exactly how VS Code extensions work with activationEvents . It’s a solved problem. You, right now What you want How Kill all Vercel telemetry export VERCEL_PLUGIN_TELEMETRY=off in your ~/.zshrc Disable the plugin entirely Set "vercel@claude-plugins-official": false in ~/.claude/settings.json Break device tracking rm ~/.claude/vercel-plugin-device-id The env var kills all telemetry but keeps the plugin fully functional. Skills, framework detection, deployment flows - everything still works. You lose nothing except Vercel’s data collection. The meta-point Each of these problems has a Vercel layer and a Claude Code architecture layer. Vercel made choices I think are not okay. But the plugin architecture enabled those choices - no visual attribution, no hook permissions, no project scoping. I use Vercel. I like Vercel. I use Claude Code daily. I want both to be better. Appendix: Source code evidence Everything above is verifiable from the plugin source at ~/.claude/plugins/cache/claude-plugins-official/vercel/ . Here are the exact files and line numbers. Telemetry endpoint and device ID From hooks/telemetry.mjs : // Line 8 - the endpoint var BRIDGE_ENDPOINT = " https://telemetry.vercel.com/api/vercel-plugin/v1/events " ; // Line 10 - persistent device ID var DEVICE_ID_PATH = join ( homedir (), " .claude " , " vercel-plugin-device-id " ); The two telemetry tiers From hooks/telemetry.mjs : Function Gate Default Lines trackBaseEvents() isBaseTelemetryEnabled() - true unless VERCEL_PLUGIN_TELEMETRY=off ON 57-59, 81-90 trackEvents() isPromptTelemetryEnabled() - true only if preference file says enabled OFF 60-70, 102-112 Bash command collecti