基础设施安全
我们依赖以下子处理器,按关键性从高到低排列。请注意,代码数据会上传至我们服务器,以支持 Cursor 的所有 AI 功能(详见 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 存储部分分析数据,适用于未启用隐私模式的用户。
- 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 是 Microsoft 维护的开源项目 Visual Studio Code (VS Code)的一个分支。Microsoft 在其 GitHub 安全页面 上发布安全公告。每隔一个主要版本的 VS Code 发布后,我们会将上游 ‘microsoft/vscode’
代码库合并到 Cursor 中。您可以通过点击应用中的 "Cursor > 关于 Cursor" 来查看您的 Cursor 版本所基于的 VS Code 版本。如果上游 VS Code 中有严重的安全补丁,我们会在下次合并前先挑选该修补程序,并立即发布。
我们使用 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 请求。这种请求发生在多种场景下。例如,当您在聊天中提问时,我们会发送 AI 请求;在每次键入时也会发送 AI 请求,以便 Cursor Tab 为您提供建议;我们还可能在后台发送 AI 请求,以构建上下文或查找错误提示您。
AI 请求通常包含上下文信息,例如您最近查看的文件、对话记录以及基于语言服务器信息的相关代码片段。这些代码数据会发送到我们基于 AWS 的基础设施上,然后再转发至适当的语言模型推理提供商(Fireworks/OpenAI/Anthropic/Google)。请注意,即使您在设置中配置了自己的 OpenAI API 密钥,请求也始终会先传递到我们在 AWS 上的基础设施。
目前,我们尚不支持直接从 Cursor 应用连接到您的企业部署的 OpenAI/Azure/Anthropic,因为我们的提示构建是在服务器上进行的,并且 Fireworks 上的自定义模型对于提供良好的用户体验至关重要。我们还没有提供自托管的服务器部署选项。
您拥有所有由 Cursor 生成的代码的所有权。
代码库索引
Cursor 允许您对代码库进行语义索引,使其能够在回答问题时具备整个代码库的上下文,并通过引用现有的实现来编写更优质的代码。代码库索引默认启用,但可以在引导流程或设置中关闭。
我们的代码库索引功能工作原理如下:启用时,它会扫描您在 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’
的网络流量,可能会看到超出预期的带宽使用情况。