Cursor是一款基于Visual Studio Code(VS Code)的开源项目,它集成了AI功能以提升编程效率。然而,对于任何涉及代码和数据的软件,安全性和隐私保护是用户最关心的问题。
本文将详细梳理Cursor官方安全文档,揭示其基础设施安全、客户端安全、AI请求处理以及代码库索引的工作原理,以增强用户对Cursor安全性的理解。
基础设施安全
Cursor依赖多个子处理器来支持其AI功能(详见 AI 请求部分),包括AWS、Fireworks、OpenAI、Anthropic、Google Cloud Vertex API等。这些服务分布在全球多个地区,以确保服务的稳定性和响应速度。Cursor在隐私模式下不会保留用户的代码数据(详见 隐私模式保证 部分),并且与主要的AI服务提供商有零数据保留协议,确保用户数据的安全。
隐私模式说明(点击查看隐私模式如何影响代码数据的传输)
-
AWS 见代码数据:我们的基础设施主要托管于 AWS。大部分服务器位于美国,部分延迟敏感的服务器位于亚洲(东京)和欧洲(伦敦)的 AWS 区域。
-
Fireworks 见代码数据:我们在 Fireworks 的服务器上托管自定义模型,位于美国、亚洲(东京)和欧洲(伦敦)。如果未启用隐私模式,为加速模型推理,Fireworks 可能会存储一些代码数据。
-
OpenAI 见代码数据:我们依赖许多 OpenAI 的模型来提供 AI 响应。即使在聊天中选择了 Anthropic(或其他)的模型(如用于摘要),请求也可能发送至 OpenAI。我们与 OpenAI 有零数据保留协议。
-
Anthropic 见代码数据:我们依赖许多 Anthropic 的模型来提供 AI 响应。即使在聊天中选择了 OpenAI(或其他)的模型(如用于摘要),请求也可能发送至 Anthropic。我们与 Anthropic 有零数据保留协议。
-
Google Cloud Vertex API 见代码数据:我们依赖一些 Google Cloud 提供的 Gemini 模型来提供 AI 响应。即使在聊天中选择了 OpenAI(或其他)的模型(如用于摘要),请求也可能发送至 Google Cloud Vertex API。
-
Turbopuffer 存储混淆的代码数据:索引代码库的嵌入以及与嵌入相关的元数据(混淆的文件名)存储在位于美国的 Google Cloud 的 Turbopuffer 上。您可以在 Turbopuffer 安全页面 了解更多。用户可以禁用代码库索引;详情请参见本文档的 代码库索引 部分。
-
Exa 和 SerpApi 见搜索请求(可能源于代码数据):用于网页搜索功能。搜索请求可能来源于代码数据(例如,在聊天中使用 "@web" 时,单独的语言模型会根据您的消息、会话历史和当前文件来确定搜索内容,Exa/SerpApi 将看到生成的搜索查询)。
-
MongoDB 不见代码数据:我们使用 MongoDB 存储部分分析数据,适用于未启用隐私模式的用户。
-
Datadog 不接触代码数据:我们使用 Datadog 进行日志记录和监控。如在 隐私模式保证部分 中所述,涉及隐私模式用户的日志不包含任何代码数据。
-
Databricks 不接触代码数据:我们使用 Databricks MosaicML 来训练一些自定义模型。隐私模式用户的数据不会传递到 Databricks。
-
Foundry 不接触代码数据:我们使用 Foundry 来训练一些自定义模型。隐私模式用户的数据不会传递到 Foundry。
-
Slack 不接触代码数据:我们将 Slack 作为内部沟通工具。在内部聊天中,可能会发送非隐私用户的提示片段以便调试。
-
Google Workspace 不接触代码数据:我们使用 Google Workspace 进行协作。在内部邮件中,可能会发送非隐私用户的提示片段以便调试。
-
Pinecone 不接触代码数据:索引文档的嵌入和元数据存储在 Pinecone。这些文档从公共网络中获取。目前我们正将这些迁移到 Turbopuffer。
-
Amplitude 不接触代码数据:我们使用 Amplitude 进行部分数据分析。Amplitude 中不存储代码数据;仅记录事件数据,例如“Cursor Tab 请求次数”。
-
HashiCorp 不接触代码数据:我们使用 HashiCorp Terraform 来管理基础设施。
-
Stripe 不接触代码数据:我们使用 Stripe 处理账单。Stripe 会存储您的个人数据(姓名、信用卡、地址)。
-
Vercel 不接触代码数据:我们使用 Vercel 部署网站。该网站无法访问代码数据。
-
WorkOS 不接触代码数据:我们使用 WorkOS 处理身份验证。WorkOS 可能存储一些个人数据(姓名、电子邮件地址)。
官方说明:
我们的基础设施均不在中国境内。我们没有直接使用任何中国公司作为子处理器,据我们所知,我们的任何子处理器也没有这样做。
我们在分配基础设施访问权限时遵循最低权限原则,并对 AWS 实施多因素身份验证。我们通过网络级控制和秘密管理来限制资源访问。
客户端安全
Cursor作为VS Code的一个分支,继承了其安全性,并定期合并上游代码库的安全更新。它使用ToDesktop平台进行应用分发和自动更新,确保了客户端的安全性。此外,Cursor默认禁用Workspace Trust功能,以避免与隐私模式混淆,用户可以根据需要自行启用。
官方说明:
我们使用 ToDesktop 来分发我们的应用并执行自动更新。多款广泛使用的应用(如 Linear 和 ClickUp)也信任该平台。
我们的应用会向以下域名发送请求,以与我们的后端通信。如果您处于企业代理环境,请将这些域名列入白名单以确保 Cursor 正常运行。
‘api2.cursor.sh’
:用于大多数 API 请求。
‘api3.cursor.sh’
:用于 Cursor Tab 请求(仅限 HTTP/2)。
‘repo42.cursor.sh’
:用于代码库索引(仅限 HTTP/2)。
‘api4.cursor.sh’
,‘us-asia.gcpp.cursor.sh’
,‘us-eu.gcpp.cursor.sh’
,‘us-only.gcpp.cursor.sh’
:根据您所在位置用于 Cursor Tab 请求(仅限 HTTP/2)。
‘marketplace.cursorapi.com’
,‘cursor-cdn.com’
:用于从扩展市场下载扩展。
‘download.todesktop.com’
:用于检查和下载更新。需要注意的一个与 VS Code 不同的安全特性:
Workspace Trust 在 Cursor 中默认是禁用的。您可以在 Cursor 设置中将
‘security.workspace.trust.enabled’
设置为‘true’
来启用它。默认禁用是为了避免 Workspace Trust 的 "限制模式" 与 Cursor 的 "隐私模式" 之间的混淆,并且因为其信任属性较为复杂难以理解(例如,即使启用了 Workspace Trust,您也不会受到恶意扩展的保护,只会避免恶意文件夹的影响)。我们欢迎社区对是否应默认启用 Workspace Trust 提出反馈。
AI请求处理
Cursor在提供功能时会向服务器发送AI请求,这些请求可能包含上下文信息,如最近查看的文件、对话记录和代码片段。这些数据会被发送到AWS基础设施,并转发至相应的语言模型推理提供商。即使用户配置了自己的API密钥,请求也会先经过Cursor的基础设施。
官方说明:
目前,我们尚不支持直接从 Cursor 应用连接到您的企业部署的 OpenAI/Azure/Anthropic,因为我们的提示构建是在服务器上进行的,并且 Fireworks 上的自定义模型对于提供良好的用户体验至关重要。我们还没有提供自托管的服务器部署选项。
您拥有所有由 Cursor 生成的代码的所有权。
代码库索引
Cursor允许用户对代码库进行语义索引,以提供更准确的代码建议和问题解答。索引功能默认启用,但用户可以在设置中关闭。索引过程中,Cursor会计算文件的哈希值并同步到服务器,仅上传更改的文件。服务器上的文件会被分块和嵌入,存储在TurboPuffer中,而不会存储明文代码。
官方说明:
我们的代码库索引功能工作原理如下:启用时,它会扫描您在 Cursor 中打开的文件夹,并计算所有文件的哈希组成的 Merkle 树。
‘.gitignore’
或‘.cursorignore’
中指定的文件和子目录会被忽略。然后将 Merkle 树同步到服务器。每 10 分钟检查一次哈希是否匹配,并利用 Merkle 树确定更改的文件,仅上传那些文件。在我们的服务器上,我们对文件进行分块和嵌入,并将嵌入存储在 Turbopuffer 中。为允许按文件路径筛选向量搜索结果,我们为每个向量存储了一个混淆的相对文件路径,以及与分块对应的行范围。我们还在 AWS 缓存中按分块的哈希值索引嵌入,以确保第二次索引相同的代码库时速度更快(这对团队尤其有用)。
在推理阶段,我们计算一个嵌入,让 Turbopuffer 执行最近邻搜索,将混淆后的文件路径和行范围发送回客户端,并在客户端本地读取这些文件块。然后,我们将这些块发送回服务器以回答用户的问题。这意味着没有明文代码存储在我们的服务器或 Turbopuffer 中。
一些注意事项:
虽然
‘.cursorignore’
文件可以防止文件被索引,但这些文件可能仍会包含在 AI 请求中,例如当您最近查看了一个文件并随后在聊天中提出问题时。我们正在考虑增加‘.cursorban’
文件来应对希望阻止文件在任何请求中被发送的场景——如果您对此功能感兴趣,请在论坛发帖或通过 hi@cursor.com 联系我们。文件路径混淆细节:路径通过
‘/’
和‘.’
拆分,并使用存储在客户端的密钥和一个确定性的 6 字节短随机数对每个片段加密。这泄露了目录层级结构的一些信息,且会有一些随机数冲突,但隐藏了大部分信息。嵌入反转:学术研究表明,在某些情况下可以反转嵌入。当前攻击依赖于访问模型并将短字符串嵌入大向量中,这让我们认为在此情境下执行这种攻击较为困难。不过,如果有对手突破我们的向量数据库,他们可能会对被索引的代码库有一定了解。
当在 Git 仓库中启用代码库索引时,我们还会索引 Git 历史记录。具体来说,我们存储提交 SHA、父信息和混淆的文件名(与上述相同)。为允许在同一 Git 仓库和团队中共享数据结构,文件名混淆的密钥从最近提交内容的哈希派生。提交消息和文件内容或差异不会被索引。
我们的索引功能通常承受较大负载,这可能导致许多请求失败。这意味着有时文件需要多次上传才能完全被索引。此问题的一种表现是,如果您查看
‘repo42.cursor.sh’
的网络流量,可能会看到超出预期的带宽使用情况。
总结