宇宙逃逸:控制 Azure Cosmos DB 中的每个数据库
Wiz Research 揭示了 CosmosEscape,这是 Azure 旗舰数据库服务 Azure Cosmos DB 中的一个关键漏洞,利用其 Gremlin API。该漏洞可能会被利用,危及服务中的每个数据库,包括微软自己的内部数据库——这可能使跨服务攻击成为可能。通过 CosmosEscape,攻击者可以获得我们称之为 Cosmos 主密钥的信息——这是一个平台范围的秘密,授予两个极其强大的功能:接管 - 按需检索任何 Cosmos DB 账户的主密钥,从而获得完全的读写访问权限。枚举 - 列出服务中的所有数据库,能够通过特定的组织标识符(如订阅和租户 ID)进行筛选。这些功能可以结合在一起,使攻击者能够在平台规模上进行精确的目标定位:从识别特定组织的数据库到危及这些数据库,所有过程均可通过公开可访问的端点完成。Cosmos DB 在微软内部得到广泛使用——服务如 Microsoft Entra ID、Microsoft Teams 和 Microsoft Copilot 都将数据存储在 Cosmos DB 中。通过此漏洞,这些数据库可能会被访问。微软已经完全修复了该问题,包括消除 Cosmos 主密钥。微软还为 Cosmos DB 引入了新的防护措施,以防止类似攻击。图 1:CosmosEscape 的影响 此项研究得到了 Atlas 的早期版本的支持,这是我们 AI 漏洞研究者。请期待 Atlas 近期提供更多信息。所需行动 微软已经完全修复了此问题。客户无需采取任何行动。微软进行了彻底调查,发现除了本文描述的研究之外,没有发现利用该漏洞的证据。从单个查询到解锁每个数据库 Cosmos DB 支持多种查询 API,其中包括 Gremlin,一种流行的图形查询语言:在针对 Cosmos DB 运行 Gremlin 查询时,我们注意到一个可疑的 .NET 异常。由于大多数开源 Gremlin 堆栈基于 JVM,该异常表明 Cosmos DB 使用了一个自定义的 Gremlin 引擎。这一点十分有趣——与标准 SQL 不同,标准 SQL 引擎将查询映射到一组固定的内置操作,Gremlin 服务器通常会将查询编译成可执行代码,并在受限环境中运行。历史上,这些沙箱的安全性并不强。我们怀疑 Cosmos DB 的 Gremlin 沙箱也可能存在漏洞,而事实证明它确实存在。Cosmos DB 的引擎将 Gremlin 查询转换为 .NET 代码,强制施加了一套限制,以防止查询超出 Gremlin 操作的范围。然而,这些限制并未充分考虑到 .NET 反射——使我们能够开发文件读写,最终能够通过对我们自己数据库的查询执行任意代码的原语。下面的图像显示了针对我们数据库运行的一个特殊构造的 Gremlin 查询的输出,导致在 Cosmos DB 后端执行 `hostname` 命令:图 2:通过 Gremlin API 在 Cosmos DB 后端执行 hostname。请在我们即将进行的 BlackHat USA 讲座中查看完整查询。通过绕过 Gremlin 沙箱,我们获得了在 DB Gateway 上的代码执行,DB Gateway 是一个代表客户执行查询的服务,运行在多租户的 Service Fabric 集群上。环顾四周,客户数据库并不托管在这些集群上,但 DB Gateway 仍需以某种方式访问它们。事实证明,它是通过使用目标账户的主密钥来访问的,该主密钥授予对该账户数据库的完全读写访问权限。但是,DB Gateway 如何检索我们 Cosmos DB 账户的主密钥呢? Cosmos 主密钥 通过集群上可用的凭证,DB Gateway 访问了可以检索请求账户主密钥的签名密钥。我们很快发现签名密钥并不是针对单一账户的。它适用于不同租户、地区,甚至 API 类型——SQL、MongoDB、Cassandra 和 Gremlin。它是一个平台范围的密钥,可以通过公共可访问的端点检索服务中任何 Cosmos DB 账户的主密钥。我们称之为 Cosmos 主密钥。 配置存储 - Cosmos DB 的账户目录 主密钥还解锁了配置存储:这是每个 Cosmos DB 账户的区域注册表——包含账户名称、订阅 ID、租户 ID、网络设置、标签等。DB Gateway 依赖其账户设置,如哪些 IP 可以访问数据库。配置存储本身是一个 Cosmos DB 数据库,这意味着可以使用 CosmosDB SQL 引擎的全部灵活性进行查询。这也意味着 Cosmos 主密钥可以检索其主密钥——使得利用 CosmosEscape 的攻击者能够列出区域内的所有账户,或根据特定的租户 ID 查询以识别特定组织的数据库。影响 Cosmos 主密钥和配置存储共同实现了一次强有力的攻击。
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡