针对MEGA的密钥恢复攻击剖析
立即解锁
发布时间: 2025-08-31 01:39:15 阅读量: 4 订阅数: 15 AIGC 

### 针对MEGA的密钥恢复攻击剖析
#### 1. 研究背景与相关工作
在数据安全领域,MEGA平台用户数据的保密性和完整性面临着诸多挑战。此前已有研究对MEGA基础设施进行了详细概述,并探讨了针对平台上用户数据的机密性和完整性的攻击。后续工作虽减少了部分攻击所需的用户交互,但被MEGA的补丁所阻止。本次研究中的攻击从DH的小阶子群攻击以及OpenPGP的密钥覆盖攻击中获取灵感,使用明文检查预言机的方式类似于Bleichenbacher对采用PKCS#1 v1.5编码的RSA的攻击,不过目标是恢复私钥而非明文。
#### 2. 验证过程
为验证攻击的可行性,研究使用了TLS - MitM设置和mitmproxy,以减少与真实MEGA服务器的交互,并使用本地运行的MEGA Web客户端(版本4.21.4)。对Web客户端进行了一项修改,使其在首次手动登录后自动模拟重复的客户端登录尝试。攻击成功恢复了测试用户RSA私钥的任意AES - ECB加密块,查询成本与分析结果一致(首次攻击平均29.30次登录尝试)。还使用格技术实现了在已知四个块的情况下恢复整个RSA私钥的概念验证,代码作为补充材料提供。
#### 3. 漏洞披露
在2022年9月29日,研究团队联系了MEGA,告知其系统中的漏洞,并建议90天的披露期,同时提出了缓解措施,强调为用户主密钥下存储的数据提供适当的加密完整性的重要性。MEGA于2022年9月30日确认收到披露信息,表示将开始修复工作并在部署前与研究团队沟通。2022年11月28日,MEGA称正在加强其客户端软件,包括更改私钥存储方式、移除ECB加密预言机以及替换asmcrypto.js库。研究团队提供了对提议更改的高级反馈。鉴于更改规模,双方同意将披露时间推迟到2023年3月6日,以配合升级后的客户端软件的推出和论文的发表。MEGA还授予了漏洞赏金。
#### 4. 预言机相关内容
##### 4.1 符号表示
为便于后续描述,定义了一系列符号:
- 连接用“∥”表示。
- [m]k表示m在密钥k下的加密,算法由上下文决定。
- B表示字节,|x|B表示x的字节长度,|x|b表示x的比特长度。
- 对于元组X = (x0, ..., xn - 1),|X| = n表示其大小。
- 对于字节串m = b0 ∥b1 ∥... ∥bn - 1,m[s] := bs,m[s : t] := bs ∥... ∥bt - 1(s < t)。
- 空对象用null表示,零字节用00表示。
- ZeroPad(m, n) := 00 ∥00 ∥... ∥m,使|m|B = n。
- B表示目标明文块,|B|b = 128,计算值用B∗表示。
##### 4.2 ECB加密预言机
MEGA的Web客户端在用户主密钥kM下暴露了一个ECB加密预言机,允许MEGA或控制其基础设施的人在一次查询中以AES - ECB模式对32字节的选定明文进行加密。由于AES - ECB没有额外的完整性保护措施,若没有对明文预期结构的额外测试,攻击者无法区分包含其查询块的密文。
该预言机源于MEGAdrop功能相关代码。MEGAdrop允许任何人在无需MEGA账户的情况下将文件上传到收件人的云存储文件夹。收件人激活MEGAdrop并分享链接,发送者看不到上传文件夹中的文件。
在上传过程中,攻击者可以选择文件密钥kF、随机数NF和文件F。上传功能使用kF和客户端选择的随机数NF对文件进行AES - CCM本地加密。服务器端会将RSA加密的密钥转换为AES加密的密钥。攻击者可以构造特定的加密文件和密钥上传到服务器,Web客户端会对其进行重新加密,恶意服务器因此可以获取AES - ECB的明文 - 密文对。通过mitmproxy测试发现,服务器可以假装上传新文件,即使收件人未使用MEGAdrop且文件路径无效,Web客户端也会重新加密密钥。这就形成了一个高效的ECB加密预言机,无需用户交互,且不会在用户云存储中留下持久痕迹,每次查询可加密32字节,可重复访问。
MEGAdrop相关伪代码如下:
```plaintext
MEGAdrop.upload(kF, NF, F, L)
1 : [F]kF , Tcond ←File.enc(kF, NF, F)
2 : kobf F ←ObfKey(kF, NF, Tcond)
3 : pk ←Server.lookup(L)
4 : [kobf F]pk ←RSA.Enc(pk, kobf F )
5 : Server.upload([F]kF , [kobf F]pk)
Webclient.update()
1 : while true do
2 : τ ←Server.fetch update(kM, sk)
3 : if τ ̸= ⊥ then
4 : [F]kF , [kobf F]pk ←τ
5 : kobf F ←RSA.Dec(sk, [kobf F]pk)
6 : [kobf F]kM ←AES-ECB.Enc(kM, kobf F )
7 : Server.upload([kobf F]kM)
8 : endif
9 : endwhile
```
##### 4.3 解码和解密错误报告预言机
用户每次登录账户时会进行身份验证和会话ID交换。服务器会响应一个元组([kM]ke , [privk]kM , [m]pk , uh),其中[kM]ke和[privk]kM是AES - ECB加密的,[m]pk是RSA加密的,uh是明文。privk编码了RSA - CRT的私钥sk,m编码了会话ID sid,uh是11字节的用户句柄字符串。
客户端解密[kM]ke后的处理过程如下伪代码所示:
```pla
```
0
0
复制全文
相关推荐









