Check Point Research 检测到 Everscale 区块链钱包中的漏洞,防止加密货币被盗

区块链安全 3年前 (2022) admin
686 0 0

研究作者:阿列克谢·布赫捷耶夫


强调

Check Point Research (CPR) 在 EverSurf 钱包的 Web 版本中发现了一个漏洞,该钱包是Everscale 区块链生态系统的一部分

通过利用该漏洞,攻击者可以完全控制受害者的钱包

在负责任地披露后,CPR 与 Everscale 团队合作,后者承认了该漏洞并发布了新的桌面版本以替换易受攻击的网页版本


背景

区块链技术和去中心化应用程序(dAPP)为用户提供了许多优势。例如,用户可以在不创建帐户的情况下使用该服务,并且可以将其实现为用 JavaScript 编写的单页应用程序。这种类型的应用程序不需要与网络服务器等集中式基础设施进行通信,它可以直接与区块链交互,也可以使用 Metamask 等浏览器扩展。


在这种情况下,使用仅存储在浏览器扩展或网络钱包内的本地计算机上的密钥来识别用户。如果去中心化应用程序或钱包在本地存储敏感数据,则必须确保这些数据得到可靠保护。在大多数情况下,dAPP 在浏览器内部运行,因此可能容易受到 XSS 等攻击。


这项研究描述了Ever Surf的 Web 版本中发现的漏洞,这是Everscale 区块链(以前称为Free TON)的钱包。通过利用该漏洞,可以解密存储在浏览器本地存储中的私钥和助记词。换句话说,攻击者可以完全控制受害者的钱包。


负责任的披露和与 Everscale 的合作

CPR 向 Ever Surf 开发人员披露了该漏洞,然后他们发布了一个桌面版本来缓解此漏洞。Web 版本现已宣布弃用,仅应用于开发目的。不应该在网络版 Ever Surf 中使用来自以加密货币存储实际价值的账户的种子短语。


漏洞描述

Ever Surf 是一个跨平台的信使、区块链浏览器和 Everscale 区块链的加密钱包。它是用 React Native 编写的,可在 Google Play Market 和 Apple Store 中找到。Ever Surf还有一个可在任何平台上运行的网络版本。

Check Point Research 检测到 Everscale 区块链钱包中的漏洞,防止加密货币被盗

图 1 – Ever Surf 的网络版


Surf 不需要后端来使用区块链,因为它实现了非托管钱包。这意味着签署交易所需的密钥仅存储在用户的设备上。区块链的操作完全在客户端执行。因此,与其他非托管钱包一样,它没有使用登录名和密码进行注册。


当用户第一次运行应用程序时,它会建议创建一个新钱包。Surf 生成一个助记词和一对公钥和私钥。此外,系统会提示用户创建一个 6 位 PIN 码:

Check Point Research 检测到 Everscale 区块链钱包中的漏洞,防止加密货币被盗

图 2 – Ever Surf 中的 PIN 码设置


然后使用此 PIN 登录应用程序并确认交易。Surf 具有防止暴力破解 PIN 码的功能。当用户连续 5 次输入错误的 PIN 码时,应用程序将被暂时阻止,并禁止用户输入额外的 PIN 码:

Check Point Research 检测到 Everscale 区块链钱包中的漏洞,防止加密货币被盗

图 3 – Ever Surf 防止暴力破解 PIN 码


即使没有这种保护,在大多数情况下,手动暴力破解 PIN 码的性能也不够高效。因此,要实施真正的攻击,攻击者需要从应用程序中提取密钥库。


创建的密钥和助记词存储在 Web 浏览器的本地存储中。本地存储是使用“ localStorage ”属性从 JavaScript 访问的键值存储。例如:

// Store value on the browser beyond the duration of the sessionlocalStorage.setItem('key', 'value');
// Retrieve value (persists even after closing and re-opening the browser)alert(localStorage.getItem('key'));

Surf 将密钥和助记词存储在本地存储的“surf.ton.wallet”密钥中,格式如下:

Check Point Research 检测到 Everscale 区块链钱包中的漏洞,防止加密货币被盗

图 4 – 加密的钱包数据存储在浏览器的 localStorage


本地存储在 Web 浏览器中不受保护。例如,在 Firefox 中,它存储在文件中的非加密 SQLite 数据库中:


MozillaFirefoxProfiles{profile_name}webappstore.sqlite

Chrome 将本地存储以非加密形式存储在文件夹中的 LevelDB 数据库中:


GoogleChromeUser DataDefaultLocal Storageleveldb

这意味着可以物理访问计算机或任何应用程序或恶意软件(例如信息窃取者)的人可以获得这些数据。


此外,localStorage 可以通过浏览器扩展程序访问,然后可以泄漏存储的数据。为了证明这一点,我们使用以下代码创建了一个简单的 Chrome 网络扩展:

alert(localStorage.getItem("surf.ton.wallet"));

如果我们在安装扩展程序后打开 Surf 网站,我们会看到包含加密密钥库的消息:

Check Point Research 检测到 Everscale 区块链钱包中的漏洞,防止加密货币被盗

图 5 – 使用浏览器扩展从 localStorage 中提取加密的钱包数据


因此,不能认为浏览器的本地存储足够安全。


存储数据加密的可靠性完全由 Web 应用程序负责。


需要注册的网站,例如知名的社交网络,可能不仅仅依赖于存储在 cookie 或本地存储中的数据。他们还可能会检查网络浏览器和用户的 IP 地址,并在出现可疑活动时要求进行额外的用户验证。这对 Surf 来说是不可能的,因为控制用户钱包所需的数据完全存储在他们的计算机上。对其资金的唯一保护是强加密。


密钥库加密

不幸的是,Surf 不是开源的。因此,Check Point 研究人员必须分析缩小的 JavaScript 应用程序包以了解其逻辑。


尽管攻击者主要对密钥解密感兴趣,但获得可用于恢复密钥的种子短语就足够了。应用程序解密种子短语并在输入 PIN 码后将其显示给用户:

Check Point Research 检测到 Everscale 区块链钱包中的漏洞,防止加密货币被盗


图 6 – Surf 在显示助记词之前要求输入 PIN 码


因此,为了找到解密发生的位置,CPR 首先锚定到获取种子短语的函数。在此函数中,调用askForPassword函数并接收加密的密钥库。

Check Point Research 检测到 Everscale 区块链钱包中的漏洞,防止加密货币被盗

图 7 – 负责获取种子短语的函数要求输入 PIN 码

askForPassword函数通过调用validatePassword函数来执行 PIN 码验证。

Check Point Research 检测到 Everscale 区块链钱包中的漏洞,防止加密货币被盗

图 8 – askForPassword 函数读取并验证 PIN 码


在整个 PIN 码验证过程中执行最重要的操作。通过调用deriveKeyFromPasswordAndSalt函数,Surf 生成派生密钥,用于解密密钥库。然后,在isDerivedKeyCorrect函数中,Surf 使用nacl_secret_box_open执行解密:

Check Point Research 检测到 Everscale 区块链钱包中的漏洞,防止加密货币被盗

图 9 – Surf 使用 nacl_secret_box_open 解密密钥。


这些是nacl_secret_box_open的参数:


encrypted – base64 编码形式的加密字符串

nonce – 十六进制编码的 nonce

key – 由 PIN 码派生的 64 个符号的十六进制编码密钥

“encrypted” 和 “nonce” 值取自密钥库(encStr和nonce):

{"encSeed": { "encStr":"6rjkbh88WXkrJWl4os3cjRzvZkQGlnV39U3YvLYUrM7yzf6h79XxXX/VziNde2bkPeSnJZ11Yi4T8CFgPJMyI1W+EN0Yzw+FDdtTq5gaKHjk5nF60CSHZ4qKXObIQ7zBbped","nonce":"2Tdr9FFP0RcpjecwcS8XtcC5M2/FRY+I"}}

下一步是了解派生密钥的显示方式。在derivedKeyFromPasswordAndSalt中,Surf 使用带有以下参数的Scrypt 密钥派生函数从 PIN 码派生解密密钥:

Check Point Research 检测到 Everscale 区块链钱包中的漏洞,防止加密货币被盗

图 10 – Surf 使用 Scrypt 从输入的 PIN 码和 salt 导出密钥库解密密钥


这些是scrypt的论点:

  • 密码 – Base64 编码的 PIN 码

  • salt – base64 编码形式的盐值

由于密码是由用户输入的,唯一缺少的就是盐值。salt值是在客户端设备上计算出来的,有两个作用:

  • 它不存储在密钥库中。这应该意味着如果加密的密钥被泄露并且攻击者不知道如何计算盐,那么解密是不可能的。

  • 保护结果值免受彩虹表攻击。

Salt 计算为react -native-device-info包的DeviceInfo.getUniqueId函数返回的值之一的 SHA256 哈希:

Check Point Research 检测到 Everscale 区块链钱包中的漏洞,防止加密货币被盗


图 11 – Surf 通过散列 DeviceInfo.getUniqueId() 返回的值生成盐


尽管如此,还有另一种选择。盐值可以计算为window.process.argv.slice(-1)值的 SHA256。在 Web 浏览器中,window.process是未定义的。因此,始终使用DeviceInfo.getUniqueId 。


检查react-native-device-info文档后,研究人员发现 Web 浏览器不支持它:

Check Point Research 检测到 Everscale 区块链钱包中的漏洞,防止加密货币被盗

图 12 – 网络浏览器不支持 getUniqueId()


在 Web 浏览器中,此函数始终返回值“未知”:

Check Point Research 检测到 Everscale 区块链钱包中的漏洞,防止加密货币被盗

因此,盐总是相同的,并且可以很容易地计算为sha256(“unknown”)并且等于“ b23a6a8439c0dde5515893e7c90c1e3233b8616e634470f20dc4928bcf3609bc”:

Check Point Research 检测到 Everscale 区块链钱包中的漏洞,防止加密货币被盗

图 13 – salt 总是等于 sha256(“unknown”)


攻击

CPR 粗略地重新实现了 NodeJS 中的密钥推导和密钥库解密,并对 PIN 码进行了蛮力攻击。


这导致在 4 核 Intel Core i7 CPU 上每秒可处理 95 个密码。虽然这不是很高的速度,但对于 6 位 PIN 码的攻击来说已经足够了。在最坏的情况下,检查 10^6 个可能的变体意味着整个攻击大约需要 175 分钟。


对于我们的实验,我们在 Surf 中创建了一个新密钥,并从浏览器的本地存储中转储了密钥库:

{"encSeed": {"encStr":"6rjkbh88WXkrJWl4os3cjRzvZkQGlnV39U3YvLYUrM7yzf6h79XxXX/VziNde2bkPeSnJZ11Yi4T8CFgPJMyI1W+EN0Yzw+FDdtTq5gaKHjk5nF60CSHZ4qKXObIQ7zBbped","nonce":"2Tdr9FFP0RcpjecwcS8XtcC5M2/FRY+I"    }}

在我们的案例中,攻击耗时 38 分钟。最后,我们得到了派生密钥并解密了可用于在另一台设备上恢复密钥的助记词:

Check Point Research 检测到 Everscale 区块链钱包中的漏洞,防止加密货币被盗

图 14 – PIN 码暴力破解结果


如果网络犯罪分子使用信息窃取者执行可扩展的攻击,他们可能会收集大量加密密钥和助记词。如果他们试图一一解密,可能需要相当长的时间。


但是,由于来自不同用户的所有加密数据的盐是相同的,因此每个检查的 PIN 码只能调用一次密钥派生函数Scrypt 。虽然Scrypt函数计算量很大,但用于解密的nacl_secret_box_open函数非常快。这允许对多个钱包的 PIN 码进行暴力破解,而不会对性能产生重大影响。


与性能为每秒 95 个 PIN 码时暴力破解一个加密种子短语的 PIN 码相比,当我们尝试同时对 100 个加密种子短语强制 PIN 码时,我们得到了每秒 79 个密码的性能。


保持安全的提示

我们想提醒您,区块链交易是不可逆的。在区块链中,与银行不同,您不能阻止被盗卡或对交易提出异议。如果您钱包的钥匙被盗,您的加密货币很容易成为网络犯罪分子的猎物,没有人可以帮助您退还您的钱。为防止钥匙被盗,我们建议:

  • 不要关注可疑链接,尤其是从陌生人那里收到的链接。

  • 保持您的操作系统和防病毒软件更新。

  • 不要从未经验证的来源下载软件和浏览器扩展。


结论

由于浏览器的本地存储不受保护,存储在那里的数据必须安全加密。尽管 Surf 使用可靠的加密库进行密钥派生和加密,但 Surf 的 Web 版本中的敏感数据似乎没有得到足够的保护。


CPR 的 PoC 表明,所发现的问题的组合提出了几种攻击向量,这些攻击向量可能导致攻击者以明文形式获取私钥和种子短语,然后可以用来完全控制受害者的钱包。


Check Point 研究人员与 Ever Surf 团队合作,该团队决定弃用易受攻击的 Web 版本并用桌面版本替换。Ever Surf 发表了一篇关于新版本的文章,其中他们说:


“ Check Point Research 对 Surf 网页版的安全状况进行了自己的独立研究,并发现了它的弱点。我们关注了这份报告,检查了所有内容并确保存在漏洞。我们的 Web 版本无法提供基于密码的 KDF 的安全使用,因为无法为该平台提供唯一的 salt,例如设备 ID。简单来说,这意味着有一种理论上的方法可以访问你的钱包和其中的资产。


因此,我们需要采取快速措施来消除它,以免我们的用户面临风险。很明显,我们不能再推迟 Surf 桌面应用程序的发布。我们的基本想法是将现有的 Web 应用程序包装到一个 Electron 打包器中,并在其中传递一个唯一的 machineID,以便将其哈希用作密钥派生的盐。


因此,我们可以将熟悉的界面和您习惯的所有内容保存在网络版本中。我们不想破坏您的用户体验,因此您仍然可以使用简短的 PIN 解锁应用程序,而不是记住强而重的密码。从长远来看,与网页版相比,桌面版提供了更多选择。”


本文翻译自:https://research.checkpoint.com/2022/check-point-research-detects-vulnerability-in-the-everscale-blockchain-wallet-preventing-cryptocurrency-theft/


原文始发于微信公众号(Ots安全):Check Point Research 检测到 Everscale 区块链钱包中的漏洞,防止加密货币被盗

版权声明:admin 发表于 2022年5月1日 下午12:41。
转载请注明:Check Point Research 检测到 Everscale 区块链钱包中的漏洞,防止加密货币被盗 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...