你的代码出去了几跳:六款工具数据流技术拆解

wescode · 2026-10-25 · 代码安全 / 数据流 / 隐私 / 技术分析

利益声明:本文作者参与了 wescode 的开发。文中涉及 wescode 的技术描述基于内部测试数据;涉及其他工具的描述基于各家公开文档和社区反馈。

本文是「代码安全实录」系列第 6 篇。技术拆解,逐工具画数据流,不做价值判断。所有信息来源标注在文末。

在前几篇里,我们回顾了 2026 年发生的安全事件、拆解了 ZCode 的加密机制、分析了 Cursor 的 Embedding 存储。这些都是具体的个案。这一篇退后一步,做一件更基本的事——

画出每款工具的完整数据流:你的代码从按下回车到被模型处理,中间经过了几个节点?

我们把这个指标叫做**"跳数"**——代码从你的电脑到模型供应商之间,经过了几个由不同实体控制的中间服务器。跳数不是越少越好的绝对标准,但它直接决定了攻击面大小、合规审查复杂度和信任链长度。

AI 编程工具安全架构


什么是"跳"

先定义清楚。

一"跳"(hop)是指代码数据经过的一个由独立实体控制的服务节点。这里的"独立实体"是指一家独立的公司或组织——它有自己的服务器、自己的运维团队、自己的数据处理策略。

不算跳的情况:

算一跳的情况:

为什么以"独立实体"而非"网络请求次数"为标准:因为安全审计关心的是谁能看到你的数据,而不是 TCP 连接建了几次。你电脑上一个进程调了三次本地 API——零跳。你的代码经过一家代理公司转发到模型供应商——两跳,即使只有一个 HTTP 请求。


六款工具的完整数据流

1. Cursor(自带 Key 模式)——2 跳

你的电脑                        Cursor 的服务器              模型供应商(OpenAI/Anthropic/…)
┌──────────────┐               ┌──────────────────┐         ┌──────────────────┐
│              │  ① 代码分块   │                  │  ③ API  │                  │
│   VS Code    │──────────────→│  Cursor 后端     │────────→│  OpenAI / Claude │
│   (Cursor    │  + Embedding  │                  │  请求   │                  │
│    Fork)     │  请求         │  · Embedding 计算│         │  · 模型推理      │
│              │               │  · Prompt 组装   │         │  · 返回结果      │
│  · 代码编辑  │  ② Embedding  │  · 缓存索引      │  ④ 响应 │                  │
│  · 文件读写  │  向量返回     │  · 请求转发      │←────────│                  │
│              │←──────────────│                  │         │                  │
└──────────────┘               └──────────────────┘         └──────────────────┘

跳数:2(你 → Cursor → 模型供应商)

关键细节:

2. GitHub Copilot——2 跳

你的电脑                        GitHub / Microsoft 服务器    模型供应商(OpenAI)
┌──────────────┐               ┌──────────────────┐         ┌──────────────────┐
│              │  ① 编辑器     │                  │  ③ API  │                  │
│   VS Code    │──────────────→│  Copilot 后端    │────────→│  OpenAI          │
│   + Copilot  │  上下文       │                  │  请求   │  (Codex/GPT)     │
│   扩展       │               │  · 上下文处理    │         │                  │
│              │               │  · 用量统计      │  ④ 响应 │  · 模型推理      │
│              │  ② 补全结果   │  · 代码片段过滤  │←────────│  · 返回结果      │
│              │←──────────────│                  │         │                  │
└──────────────┘               └──────────────────┘         └──────────────────┘

跳数:2(你 → GitHub → OpenAI)

关键细节:

3. Claude Code(Anthropic 直连)——1 跳

你的电脑                                          模型供应商(Anthropic)
┌─────────────────────────┐                       ┌──────────────────┐
│                         │  ① API 请求           │                  │
│   终端                  │──────────────────────→│  Anthropic API   │
│   + Claude Code CLI     │  (代码上下文 +       │                  │
│                         │   对话历史)           │  · 模型推理      │
│  · 本地文件读写         │                       │  · 返回结果      │
│  · 本地 Shell 执行      │  ② 响应               │                  │
│  · Prompt 本地组装      │←──────────────────────│                  │
│                         │                       │                  │
└─────────────────────────┘                       └──────────────────┘

跳数:1(你 → Anthropic)

关键细节:

4. wescode(BYOK + 云端模型)——1 跳

你的电脑                                          模型供应商(OpenAI/Anthropic/DeepSeek/…)
┌─────────────────────────┐                       ┌──────────────────┐
│                         │  ② API 请求           │                  │
│   VS Code Fork          │──────────────────────→│  模型供应商 API  │
│   (wescode)             │  (Prompt,含代码     │                  │
│                         │   上下文片段)         │  · 模型推理      │
│  ① 本地完成:           │                       │  · 返回结果      │
│  · tree-sitter 代码解析 │  ③ 响应               │                  │
│  · CKG 知识图谱构建     │←──────────────────────│                  │
│  · SQLite 本地存储      │                       │                  │
│  · Prompt 本地组装      │                       │                  │
│  · 上下文选择和排序     │                       │                  │
└─────────────────────────┘                       └──────────────────┘

跳数:1(你 → 模型供应商)

关键细节:

5. wescode(Ollama / vLLM 本地模型)——0 跳

你的电脑
┌──────────────────────────────────────────────────┐
│                                                  │
│   VS Code Fork (wescode)        Ollama / vLLM    │
│   ┌──────────────────┐         ┌──────────────┐  │
│   │                  │  ② API  │              │  │
│   │  ① 本地完成:    │────────→│  本地模型    │  │
│   │  · 代码解析      │  请求   │  (Qwen/Llama │  │
│   │  · CKG 构建      │         │   /DeepSeek  │  │
│   │  · Prompt 组装   │  ③ 响应 │   /Codestral)│  │
│   │  · 上下文选择    │←────────│              │  │
│   │                  │         │              │  │
│   └──────────────────┘         └──────────────┘  │
│                                                  │
│   零出站网络流量                                  │
└──────────────────────────────────────────────────┘

跳数:0(全程本地)

关键细节:

6. 通义灵码 / Trae——2 跳

你的电脑                        阿里云 / 字节云端              模型
┌──────────────┐               ┌──────────────────┐         ┌──────────────────┐
│              │  ① 代码       │                  │  ③ 模型 │                  │
│   VS Code    │──────────────→│  灵码/Trae 云端  │────────→│  通义千问 /      │
│   + 插件     │  上下文       │                  │  调用   │  豆包 /          │
│              │               │  · 上下文处理    │         │  其他模型        │
│              │               │  · 用量统计      │  ④ 响应 │                  │
│              │  ② 结果       │  · 增值服务      │←────────│  · 模型推理      │
│              │←──────────────│                  │         │  · 返回结果      │
└──────────────┘               └──────────────────┘         └──────────────────┘

跳数:2(你 → 阿里云/字节 → 模型)*

*注:当通义灵码调用自家通义千问模型时,中间的云端和模型可能在同一基础设施内,物理上可能是 1 跳。但从控制实体角度看,如果平台层和模型层是同一家公司运营,逻辑上可以视为 1.5 跳。这里统一按最保守的 2 跳计算。

关键细节:


跳数对照表

工具模式跳数代码经过的实体Prompt 组装位置索引存储位置
Cursor自带 Key2Cursor + 模型供应商Cursor 后端Cursor 后端
Cursor官方订阅2Cursor + 模型供应商Cursor 后端Cursor 后端
Copilot标准2GitHub + OpenAIGitHub 后端GitHub 后端
Claude Code直连1Anthropic本地 CLI无持久索引
wescodeBYOK 云端1模型供应商本地本地 SQLite
wescodeOllama0无本地本地 SQLite
通义灵码标准2阿里云 + 模型阿里云端阿里云端
Trae免费2字节 + 模型供应商字节云端字节云端

每多一跳意味着什么

跳数不是越少越好的绝对标准——2 跳的工具不一定比 1 跳的"差"。但跳数直接影响三个维度:

1. 攻击面(Attack Surface)

每多一跳,代码数据就多经过一个独立实体的基础设施。每个实体都有自己的:

2 跳意味着你需要信任两家公司的安全能力和善意。不是说这两家公司一定不安全,而是你的安全面扩大了。

2. 合规审查复杂度

在企业安全审计中,每个数据处理方都需要单独评估:

2 跳的工具意味着安全团队需要审查两家公司的安全资质——不只是最终的模型供应商,还包括中间代理方。

3. 信任依赖链

0 跳:你只需要信任你自己的设备安全。 1 跳:你需要信任一个外部实体(模型供应商)不会滥用你的数据。 2 跳:你需要信任两个外部实体——并且它们之间的数据传输也是安全的。

信任链的每一环都可能断裂。不是一定会断,但断裂的概率随链长增加。


Embedding 的安全含义

在讨论 Cursor 的 2 跳架构时,有一个经常被问到的问题:"Embedding 向量能不能反推出原始代码?"

Embedding 是什么

Embedding 是把代码片段映射成一个高维数字向量(通常是 1536 维或 3072 维的浮点数数组)。映射方式是通过一个预训练的编码器模型(如 OpenAI 的 text-embedding-3-small)。两个语义相似的代码片段,其向量的余弦相似度会比较高。

能推断什么

能:

不能(在当前技术条件下):

对什么级别的安全要求构成风险

对比表

维度原始代码上传Embedding 向量仅 Prompt 片段全程本地
能否还原完整代码✅ 是不能⚠️ 片段级不适用
能否推断技术栈✅ 是⚠️ 大致可以⚠️ 大致可以不适用
能否推断业务逻辑✅ 是不能⚠️ 取决于片段不适用
合规风险🔴 高🟡 中🟡 中🟢 无
示例工具Grok Build / ZCodeCursorClaude Code / wescode BYOKwescode + Ollama

各工具的隐私承诺精确对照

每家工具都有自己的隐私承诺,但用词不同、含义不同。这张表把它们放在一起对比:

承诺维度CursorCopilotClaude Codewescode通义灵码
"不用代码训练模型"✅ Privacy Mode 开启后✅ Business/Enterprise✅ API 政策(不训练)✅ 不经过服务器✅ 企业版
"不存储代码"⚠️ Embedding 存储在后端⚠️ 临时缓存用于过滤⚠️ 请求保留 30 天是(全部在本地)⚠️ 未公开细节
"不经过后端"否(即使自带 Key 仍经过)否(经过 GitHub 后端)✅ 直连 API✅ 直连 API否(经过云端)
"代码不出设备"否否否(发给 Anthropic)支持(Ollama 模式)否(标准版)
客户端可审计闭源闭源闭源是(基于 Code OSS)⚠️ 部分开源
零数据保留(ZDR)⚠️ 需联系申请✅ Enterprise 可配⚠️ 需企业合同✅ 不经过服务器⚠️ 需企业合同

重要说明:


企业安审视角:评估 AI 编程工具的 5 个维度

当企业安全团队评估一款 AI 编程工具时,跳数只是第一个维度。以下是完整的评估框架:

维度一:数据路径(跳数)

核心问题:代码从开发者电脑到被模型处理,经过了几个独立实体的服务器?

维度二:数据留存

核心问题:代码数据在每个经手节点存储多久?

维度三:可审计性

核心问题:工具的客户端代码是否可以被安全团队审查?

维度四:离线能力

核心问题:在完全断网环境下能否使用?

维度五:合规认证

核心问题:工具供应商有哪些安全认证?


各工具在 5 个维度的评估

维度CursorCopilotClaude Codewescode (BYOK)wescode (Ollama)通义灵码
跳数221102
数据留存Embedding 持久化会话级缓存API 请求保留 30 天仅供应商侧无外部留存未公开
可审计性闭源闭源闭源Code OSS 开源Code OSS 开源⚠️ 部分
离线能力否否否否(需连模型 API)支持否
合规认证SOC 2SOC 2, ISO 27001SOC 2不适用(无中间方)不适用等保三级

说明:wescode 在 BYOK 和 Ollama 模式下,"合规认证"标注为"不适用"——不是因为它不安全,而是因为当你的代码不经过 wescode 的任何服务器时,wescode 不是数据处理方,不需要为数据处理行为提供认证。你需要审查的是模型供应商的合规认证(BYOK 模式下)或你自己的设备安全(Ollama 模式下)。


一个容易被忽略的问题:代码在 Prompt 里

很多开发者关注"工具有没有上传我的代码",但忽略了一个更基本的事实:

每一次 AI 编程对话,你的代码片段都作为 Prompt 的一部分发送给了模型。

当你在 Cursor 里问"帮我重构这个函数",Cursor 会把这个函数的代码——以及它认为相关的上下文代码——放进 Prompt 发送给 OpenAI。这不是 bug,这是 AI 编程工具的基本工作原理。模型不读你的代码就无法给你建议。

区别在于:

所以"代码安全"不是一个二元问题。不是"安全 vs 不安全",而是一个程度和场景的问题。每个开发者和每个企业需要根据自己的安全需求,选择合适的跳数和数据路径。


信息来源汇总

#来源类型URL
1Cursor Privacy FAQ官方文档cursor.com
2Cursor "requests routed through backend" 声明官方文档cursor.com/privacy
3GitHub Copilot Trust Center官方文档github.com
4Anthropic API 数据使用政策官方文档anthropic.com
5wescode 技术架构(Code OSS + CKG + BYOK)产品文档weisyn.com
6Ollama 官方文档官方文档ollama.com
7通义灵码隐私政策官方文档tongyi.aliyun.com

本文信息截至 2026 年 10 月。如各方后续发布更新或澄清,请以最新信息为准。