@v12sec: Signal 的联系人发现功能会自动将您的联系人列表信息发送到云端的 SGX 飞地中。V12 破坏了 …

X AI KOLs Timeline 新闻

摘要

Signal 的联系人发现功能被发现会将联系人列表发送到 SGX 飞地,V12 的安全漏洞泄露了密钥,可能导致用户数据暴露,因为存在任意读取和远程代码执行等关键漏洞。

Signal 的联系人发现功能会自动将您的联系人列表信息发送到云端的 SGX 飞地中。 V12 破坏了那个飞地并泄露了密钥,使得服务器主机能够解密所有内容。 两个独立的严重漏洞:任意读取和远程代码执行。 以下是方法。 🧵 https://t.co/gP1Brf5ZDS
查看原文
查看缓存全文

缓存时间: 2026/08/28 05:48

Signal的联系人发现功能会自动将您的联系人列表信息发送到云端的SGX飞地(enclave)。

V12成功入侵了该飞地并泄露了密钥,使得服务器主机能够解密所有内容。

发现了两个独立的关键漏洞:任意读取和远程代码执行(RCE)。

以下是具体过程。

@signalapp的联系人发现服务(CDSI)允许您安全地查询哪些联系人也在使用Signal。

该功能默认开启,应用程序每48小时会发送完整的联系人列表。

查询在SGX飞地内运行,因此即使是Signal的服务器也无法看到查询内容。

SGX加密飞地内存,使主机无法直接读取查询内容,并使用ORAM(混淆RAM)隐藏访问模式。

虽然SGX保护了飞地内存,但主机仍然控制其外围的机器。主机调用飞地调用、调度线程并管理页表。

由于ORAM开销较大,数据库被分割成多个分片(shard),每个分片由一个飞地工作线程处理。

恶意主机可以利用页错误(page fault)在关键点暂停飞地线程,从而实现对数据竞争(data race)的细粒度确定性利用。

关键漏洞一:重复的分片工作线程。

一个分片会排队执行一个查询,然后等待。每个分片只有一个工作线程,消耗等待状态意味着查询已完成。但飞地并未阻止我们生成重复的工作线程:

  1. 工作线程A开始一个查询。
  2. 工作线程B消耗等待状态。
  3. 查询释放其结果缓冲区。
  4. 工作线程A恢复并写入56字节到已释放的内存。

我们通过堆布局(heap grooming)使已释放的内存被重用为protobuf工作区,用主机选择的值替换了一个指针和长度。然后,在正常的客户端响应路径中,protobuf编码器会复制出我们选定的字节。

这使我们实现了任意读取,我们用它来提取Noise协议应答方的私钥,从而允许服务器冒充安全飞地。随后,服务器可以简单解密所有发往飞地的流量。

这使得不受信任的服务器所有者能够窃取您联系人中的所有电话号码。

关键漏洞二:客户端句柄的TOCTOU(检查时间与使用时间)漏洞。

CDSI向主机提供指向客户端状态的不透明指针。在执行操作时,它通过检查秘密金丝雀(canary)值来验证这些客户端指针,然后通过CAS(比较并交换)更新状态字段。

我们利用主机控制原语在上述两个步骤之间暂停,释放客户端对象,进行堆布局,并将其地址重用于我们自己的对象。飞地验证了原始客户端,但使用了我们的替代对象。

我们精心构造了替代对象,覆盖了一个函数指针及其参数,以便使用主机构造的寄存器上下文进入Open Enclave的寄存器恢复路径。这使我们获得了对飞地寄存器的完全控制权,并在可信上下文中执行代码。

我们的概念验证(POC)使被入侵的飞地将其秘密memcpy到主机内存中。

这再次使服务器能够冒充飞地,解密所有传入的联系人信息。

两个POC都在Signal使用的Azure SGX机型上进行了验证,使用的是生产环境中的飞地二进制文件。

对于每个漏洞,我们都提取了私钥,推导出其公钥,并确认与经过认证(attested)的值匹配。

Signal已修复这两个关键问题:飞地现在强制每个分片只允许一个工作线程,且客户端验证/获取操作是原子的。

完整的技术分析报告、漏洞报告和POC:

该漏洞由@rt1rz使用V12发现。

V12是我们的自主人工智能黑客。

在您的代码中发现此类漏洞:

@v12sec 我曾就您平台上的漏洞与您联系,但未收到回复。

相似文章

EX-ARRR:航行于零点击之海

Lobsters Hottest

一位安全研究员描述发现苹果的EXR文件解析器中存在一个零点击堆溢出漏洞,该漏洞允许通过iMessage远程入侵iOS设备,无需任何用户交互。