安全

上次更新:2024年11月8日

保护您的源代码和开发环境的安全对我们至关重要。此页面概述了我们如何处理 Cursor 的安全问题。

请将潜在的漏洞提交到我们的 GitHub 安全页面.

对于任何与安全相关的问题,请随时联系我们: [email protected].

虽然我们已经有许多大型组织信任 Cursor,但请注意,我们仍在不断发展产品和改进安全态势的过程中。如果您在高度敏感的环境中工作,则在使用 Cursor 或任何其他 AI 工具时应谨慎。我们希望此页面能深入了解我们的进展,并帮助您进行适当的风险评估。

认证和第三方评估

Cursor 已获得 SOC 2 Type I 认证,并且正在完成 SOC 2 Type II 认证(预计 2024 年 11 月)。请发送电子邮件至 [email protected] 以请求报告副本。

我们承诺每年至少由信誉良好的第三方进行一次渗透测试。我们的第一份报告已于 2024 年 9 月发布。请发送电子邮件至 [email protected] 以请求报告副本。

基础设施安全

我们依赖以下子处理器,大致按重要性从高到低排序。请注意,代码数据会发送到我们的服务器以支持所有 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 的 Vertex API 提供的一些 Gemini 模型来提供 AI 响应。即使您在聊天中选择了 OpenAI(或其他人的)模型,也可能会向 Google Cloud Vertex API 发送请求(例如,用于摘要)。
  • Turbopuffer存储模糊处理后的代码数据: 已索引代码库的嵌入以及与嵌入关联的元数据(模糊处理的文件名)存储在 Google Cloud 的美国服务器上的 Turbopuffer 中。您可以在 Turbopuffer 安全页面 上了解更多信息。用户可以禁用代码库索引;有关详细信息,请参阅本文档中的 代码库索引 部分。
  • ExaSerpApi查看搜索请求(可能源自代码数据): 用于网页搜索功能。搜索请求可能源自代码数据(例如,在聊天中使用“@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 是开源 Visual Studio Code (VS Code)的一个分支,由微软维护。他们在其 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.shus-asia.gcpp.cursor.sh us-eu.gcpp.cursor.sh, us-only.gcpp.cursor.sh:根据您的位置用于 Cursor Tab 请求(仅限 HTTP/2)。
  • marketplace.cursorapi.comcursor-cdn.com:用于从扩展程序市场下载扩展程序。
  • download.todesktop.com:用于检查和下载更新。

需要注意的一个与 VS Code 相关的安全差异

  1. 工作区信任 在 Cursor 中默认情况下处于禁用状态。您可以通过将 security.workspace.trust.enabled 设置为 true在您的 Cursor 设置中启用它。默认情况下禁用它是为了避免工作区信任的“受限模式”与 Cursor 的“隐私模式”之间产生混淆,并且因为其信任属性很微妙且难以理解(例如,即使启用了工作区信任,您也无法免受恶意扩展的侵害,只能免受恶意文件夹的侵害)。我们乐于接受社区关于是否应默认启用它的反馈。

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 文件来解决阻止文件在任何请求中发送的需求——如果您对此功能感兴趣,请在论坛发帖或联系 [email protected]
  • 文件路径模糊处理细节:路径以/. 分隔,每个片段都使用存储在客户端上的密钥和确定性的 6 字节短 nonce 进行加密。这会泄漏有关目录层次结构的信息,并且会发生一些 nonce 冲突,但会隐藏大部分信息。
  • 嵌入反转:学术研究表明,在某些情况下可以反转嵌入。目前的攻击依赖于访问模型并将短字符串嵌入到大型向量中,这让我们相信这种攻击在这里实施起来会比较困难。也就是说,入侵我们向量数据库的攻击者肯定有可能了解已索引代码库的信息。
  • 在 Git 仓库中启用代码库索引时,我们还会索引 Git 历史记录。具体来说,我们会存储提交 SHA、父信息和模糊的文件名(与上面相同)。为了允许在同一个 Git 仓库和同一个团队中的用户共享数据结构,用于模糊文件名的密钥是从最近提交内容的哈希值派生的。提交消息和文件内容或差异不会被索引。
  • 我们的索引功能通常会承受很大的负载,这会导致许多请求失败。这意味着有时,文件需要上传多次才能完全索引。这的一种表现形式是,如果您检查到 repo42.cursor.sh 的网络流量, 您可能会看到使用的带宽超出预期。

隐私模式保证

隐私模式可以在入职期间或设置中启用。启用后,我们保证代码不会存储在我们的服务器或我们的子处理程序上。任何用户(免费或专业用户)都可以启用隐私模式,并且默认情况下,对于任何团队成员,都会强制启用隐私模式。

我们非常重视隐私模式的保证。大约 50% 的 Cursor 用户启用了隐私模式。您可以在我们的隐私政策中阅读更多关于隐私保证的信息。

启用隐私模式后,代码数据不会保留在我们的服务器或任何子处理程序上。代码数据在请求的生命周期内仍然可以在我们的服务器内存中可见,并且可能在较长一段时间内存在(大约几分钟到几小时),用于长时间运行的后台作业、KV 缓存或临时文件缓存。对于文件缓存,所有数据都使用客户端生成的密钥进行加密,这些密钥仅在请求期间保留。隐私模式用户提交的代码数据永远不会用于训练。

用户的隐私模式设置存储在客户端上。对我们服务器的每个请求都包含一个 x-ghost-mode 标头。为了防止意外地将隐私模式用户视为非隐私模式用户,如果缺少标头,我们始终默认为用户处于隐私模式。

所有对我们服务器的请求首先都会到达一个代理,该代理决定哪个逻辑服务应该处理请求(例如,“聊天服务”或“Cursor Tab 服务”)。每个逻辑服务都有两个几乎相同的副本:一个副本处理隐私模式请求,另一个副本处理非隐私模式请求。代理会检查 x-ghost-mode 标头的值,并将请求发送到相应的副本。副本本身也会出于冗余性检查标头。默认情况下,来自隐私模式副本的所有日志功能都是空操作,除非以 infoUnrestricted 为后缀,我们对其进行了仔细审查,以确保永远不会附加任何潜在的代码数据或提示。对于生成后台任务的请求,我们也有类似的并行队列和工作副本,用于隐私模式和非隐私模式。这种并行基础设施使我们对隐私模式保证及其对意外错误或漏洞的弹性充满信心。

对于团队级别的隐私模式强制执行,每个客户端每 5 分钟向服务器发送一次 ping 以检查用户是否属于强制执行隐私模式的团队。如果是,它会覆盖客户端的隐私模式设置。为了防止客户端的隐私模式 ping 因任何原因失败的情况,我们的服务器还在热路径中检查用户是否属于强制执行隐私模式的团队,如果是,则将请求视为处于隐私模式,即使标头指示并非如此。在延迟敏感的服务中,我们会将此值缓存 5 分钟,对于任何缓存未命中,我们都假设用户处于隐私模式。总而言之,这意味着当用户加入团队时,最晚在加入团队 5 分钟后,他们将保证处于隐私模式。作为特殊情况,如果用户在入职时登录团队帐户,则他们将立即保证处于隐私模式。

账户删除

您可以在任何时候在 设置仪表板(点击“高级”,然后点击“删除帐户”)中删除您的帐户。这将删除与您的帐户关联的所有数据,包括任何已索引的代码库。我们保证在 30 天内完全删除您的数据(我们会立即删除数据,但我们的一些数据库和云存储最多有 30 天的备份)。

值得注意的是,如果您的任何数据用于模型训练(这只有在您当时未处于隐私模式时才会发生),我们现有的训练模型不会立即重新训练。但是,任何未来训练的模型都不会使用您的数据进行训练,因为这些数据将已被删除。

漏洞披露

如果您认为在 Cursor 中发现了漏洞,请按照我们 GitHub 安全页面 上的指南操作,并在那里提交报告。如果您无法使用 GitHub,您也可以联系我们: [email protected].

我们承诺在 15 个工作日内处理漏洞报告,并将结果以安全公告的形式发布到我们的 GitHub 安全页面。重大事件将在 GitHub 安全页面和通过电子邮件通知所有用户。

Anysphere开发
SOC 2 认证