Check Point的研究人员发现Everscale钱包的Web版本中存在漏洞,如果成功将其武器化,攻击者就可以完全控制受害者的钱包。通过利用这个漏洞,攻击者可以解密存储在浏览器本地存储中的私钥和种子短语。换句话说,攻击者可以完全控制受害者的钱包。该漏洞被披露后,新的桌面应用程序已经发布以取代易受攻击的web版本,后者现在被标记为不推荐使用,仅用于开发目的。
通过利用该漏洞,攻击者可以完全控制受害者的钱包。
区块链技术和去中心化应用程序(dAPP)为用户提供了许多优势。例如,用户可以在不创建帐户的情况下使用该服务,并且可以将其实现为用 JavaScript 编写的单页应用程序。这种类型的应用程序不需要与网络服务器等集中式基础设施进行通信,它可以直接与区块链交互,也可以使用 Metamask 等浏览器扩展。
在这种情况下,使用仅存储在浏览器扩展或网络钱包内的本地计算机上的密钥来识别用户。如果去中心化应用程序或钱包在本地存储敏感数据,则必须确保这些数据得到可靠保护。在大多数情况下,dAPP 在浏览器内部运行,因此可能容易受到 XSS 等攻击。
本文介绍了 Ever Surf 的 Web 版本中发现的漏洞,这是 Everscale 区块链(以前称为 Free TON)的钱包。通过利用该漏洞,可以解密存储在浏览器本地存储中的私钥和助记词。换句话说,攻击者可以完全控制受害者的钱包。
CPR 向 Ever Surf 开发人员披露了该漏洞,然后他们发布了一个桌面版本来缓解此漏洞。 Web 版本现已宣布弃用,仅应用于开发目的。不应该在网络版 Ever Surf 中使用来自以加密货币存储实际价值的账户的种子短语。
漏洞技术分析
Ever Surf 是一个跨平台的消息应用、区块链浏览器和 Everscale 区块链的加密钱包。它是用 React Native 编写的,可在 Google Play Market 和 Apple Store 中下载。 Ever Surf 还有一个可在任何平台上运行的网络版本。
Ever Surf 的网络版
Surf 不需要后端来使用区块链,因为它实现了非托管钱包。这意味着签署交易所需的密钥仅存储在用户的设备上。区块链的操作完全在客户端执行。因此,与其他非托管钱包一样,它没有使用登录名和密码进行注册。
当用户第一次运行应用程序时,它会建议创建一个新钱包。 Surf 生成一个助记词和一对公钥和私钥。此外,系统会提示用户创建一个 6 位 PIN 码:
Ever Surf 中的 PIN 码设置
然后使用此 PIN 登录应用程序并确认交易。 Surf 具有防止暴力破解 PIN 码的功能。当用户连续 5 次输入错误的 PIN 码时,应用程序将被暂时阻止,并禁止用户输入额外的 PIN 码:
Ever Surf 防止暴力破解 PIN 码
即使没有这种保护,在大多数情况下,手动暴力破解 PIN 码的性能也不够高效。因此,要实施真正的攻击,攻击者需要从应用程序中提取密钥库。
创建的密钥和助记词存储在 Web 浏览器的本地存储中。本地存储是使用“localStorage”属性从 JavaScript 访问的键值存储。例如:
Surf 将密钥和助记词存储在本地存储的“surf.ton.wallet”密钥中,格式如下:
加密的钱包数据存储在浏览器的 localStorage
本地存储在 Web 浏览器中不受保护。例如,在 Firefox 中,它存储在文件中的非加密 SQLite 数据库中:
Mozilla\Firefox\Profiles\{profile_name}\webappstore.sqlite
Chrome 将本地存储以非加密形式存储在文件夹中的 LevelDB 数据库中:
Google\Chrome\User Data\Default\Local Storage\leveldb\
这意味着可以物理访问计算机或任何应用程序或恶意软件(例如信息窃取者)的人可以获得这些数据。
此外,可以通过浏览器扩展访问localStorage,从而泄漏存储的数据。为了证明这一点,我们使用以下代码创建了一个简单的 Chrome 网络扩展:
如果我们在安装扩展程序后打开 Surf 网站,我们会看到包含加密密钥库的消息:
使用浏览器扩展从localStorage提取加密的钱包数据
因此,浏览器的本地存储不能被认为足够安全。
存储数据加密的可靠性完全由web应用程序负责。
需要注册的网站,比如知名的社交网络,可能不仅仅依赖于存储在cookie或本地存储中的数据。他们还可能检查web浏览器和用户的IP地址,并要求额外的用户验证,以防可疑活动。这在Surf中是不可能的,因为控制用户钱包所需的数据完全存储在用户的电脑上。对他们的资金唯一的保护就是强大的秘钥保护。
密钥加密
不幸的是,Surf不是开源的。因此,Check Point的研究人员必须分析简化的JavaScript应用程序包才能理解其逻辑。
尽管攻击者主要对密钥解密感兴趣,但获得可用于恢复密钥的种子短语就足够了。应用程序解密种子短语,并在输入PIN码后显示给用户:
Surf在显示种子短语之前要求输入PIN码
因此,为了找到解密发生的位置,CPR首先锚定到获取种子短语的函数。在这个函数中,调用askForPassword函数并接收加密的密钥库。
负责获取种子短语的函数要求输入PIN码
askForPassword函数通过调用validatePassword函数来执行PIN码验证。
askForPassword函数读取并验证PIN码
最重要的操作在PIN码验证过程中执行。通过调用deriveKeyFromPasswordAndSalt函数,Surf生成了用于解密密钥库的派生密钥。然后,在isDerivedKeyCorrect函数中,Surf使用nacl_secret_box_open进行解密:
Surf使用nacl_secret_box_open解密密钥
以下是nacl_secret_box_open的参数:
Encrypted——base64编码的加密字符串;
nonce ——十六进制编码的nonce;
key ——从PIN-code派生的64个符号十六进制编码的密钥;
值" encrypted "和" nonce "来自密钥库(encStr和nonce):
下一步是了解派生密钥的显示方式。在 derivedKeyFromPasswordAndSalt 中,Surf 使用带有以下参数的 Scrypt 密钥推导函数从 PIN 码推导出解密密钥:
Surf 使用 Scrypt 从输入的 PIN 码和 salt 导出密钥库解密密钥
以下是关于scrypt的证据:
Password—— base64编码的PIN-code;
salt——base64编码形式的盐值;
由于密码是由用户输入的,所以唯一缺少的部分是盐值。盐值在客户端设备上计算,有两个作用:
它不存储在密钥库中。这应该意味着如果加密的密钥被泄露并且攻击者不知道如何计算盐,那么解密是不可能的。
保护结果值免受彩虹表攻击。
Salt 计算为 react-native-device-info 包的 DeviceInfo.getUniqueId 函数返回的值之一的 SHA256 哈希:
Surf 通过哈希 DeviceInfo.getUniqueId() 返回的值生成盐值
不过,还有另一种选择。盐值可以计算为 window.process.argv.slice(-1) 值的 SHA256。在 Web 浏览器中,window.process 是未定义的。因此,始终使用 DeviceInfo.getUniqueId。
检查 react-native-device-info 文档后,研究人员发现 Web 浏览器不支持它:
网络浏览器不支持 getUniqueId()
在 Web 浏览器中,此函数始终返回值“unknown”:
因此,盐值总是相同的,可以很容易地计算为 sha256(“unknown”),结果为“b23a6a8439c0dde5515893e7c90c1e3233b8616e634470f20dc4928bcf3609bc”:
盐值总是等于 sha256(“unknown”)
研究人员大概在NodeJS中重新实现了密钥派生和密钥库解密,并对PIN码进行了暴力攻击。
这导致在 4 核 Intel Core i7 CPU 上每秒可处理 95 个密码。虽然这不是很高的速度,但对于 6 位 PIN 码的攻击来说已经足够了。在最坏的情况下,检查 10^6 个可能的变体意味着整个攻击大约需要 175 分钟。
在测试中,研究人员在 Surf 中创建了一个新密钥,并从浏览器的本地存储中转储了密钥库:
在测试中,攻击耗时 38 分钟。最后,研究人员得到了派生密钥并解密了可用于在另一台设备上恢复密钥的助记词:
PIN 码暴力破解结果
如果攻击者使用信息窃取程序执行可扩展的攻击,他们可能会收集大量加密密钥和助记词。如果他们试图一一解密,可能需要相当长的时间。
然而,由于来自不同用户的所有加密数据的盐值是相同的,密钥派生函数Scrypt只能对每个检查的PIN码调用一次。虽然Scrypt函数需要大量计算,但是用于解密的nacl_secret_box_open函数非常快。这允许强制使用多个钱包的PIN码,而不会对性能造成显著影响。
与性能为每秒 95 个 PIN 码时暴力破解一个加密种子短语的 PIN 码相比,当我们尝试同时对 100 个加密种子短语强制 PIN 码时,我们得到了每秒 79 个密码的性能。
缓解措施
区块链交易是不可逆的。与银行不同,在区块链中,你不能阻止被盗的卡或对交易提出异议。如果你钱包的钥匙被盗,你的加密资金很容易成为网络罪犯的攻击目标,没有人能帮你把钱还回来。为防止钥匙被盗,我们建议:
不要点击可疑的链接,特别是来自陌生的链接;
随时更新你的操作系统和杀毒软件;
不要从未经验证的来源下载软件和浏览器扩展。
总结
由于浏览器的本地存储是不受保护的,存储在那里的数据必须进行安全加密。尽管Surf使用了可靠的密码库来进行密钥推导和加密,但Surf的web版本似乎没有对敏感数据提供足够的保护。
CPR的PoC表明,所发现的问题的组合可以组合成几种攻击途径,这些攻击向量可以导致攻击者以明文形式获取私钥和种子短语,然后可以使用这些密钥完全控制受害者的钱包。
检查点研究人员与Ever Surf团队合作,决定将弃用易受攻击的网页版本,用桌面版本代替。
本文翻译自:https://research.checkpoint.com/2022/check-point-research-detects-vulnerability-in-the-everscale-blockchain-wallet-preventing-cryptocurrency-theft/如若转载,请注明原文地址