区块链钱包漏洞可窃取加密货币
2022-5-3 11:50:0 Author: www.4hou.com(查看原文) 阅读量:25 收藏

Check Point研究人员在Everscale区块链钱包中发现安全漏洞,可以窃取用户加密货币。

Ever Surf

Ever Surf是一个跨平台的消息应用,一个区块链浏览器,也是Everscale区块链的加密货币钱包。使用React Native开发框架编写,同时上传到了Google Play Market和Apple Store应用市场。同时,还有一个可运行在任意平台的Ever Surf web版本。

Web version of Ever Surf

图1 Ever Surf web版

漏洞分析

Surf钱包中用于对交易进行签名的密钥只保存在用户设备上。所有对区块链的操作都是在客户端来实现的。因此,与其他非托管钱包类似,无需注册过程。

用户首次运行应用时,会被建议创建一个新的钱包。Surf会生成一个seed词组和公私钥对。此外,用户会被要求创建一个6位数字的PIN码:

PIN code setup in Ever Surf

图2 Ever Surf中的PIN码设置

然后该PIN码被用于登入应用和确认交易。Surf有应对暴力破解PIN码的保护机制:

Ever Surf prevents brute-forcing PIN codes

图3 Ever Surf 预防暴力破解PIN码

即使没有这类保护机制,创建的密钥和seed 词组都保存在浏览器的本地存储中。本地存储是使用localstorage特征从JS访问的key-value存储,比如:

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

Surf以下面的格式将密钥和seed 词组保存在本地存储的“surf.ton.wallet” key中:

Encrypted wallet data is stored in the browser’s localStorage

图4 保存在浏览器localStorage中的加密的钱包数据

本地存储在web浏览器中并不是受保护的。比如,在Firefox中本地存储以非加密的SQLite数据库的形式存储:

Mozilla\Firefox\Profiles\{profile_name}\webappstore.sqlite

Chrome 将local storage以非加密的levelDB数据库的形式存储:

Google\Chrome\User Data\Default\Local Storage\leveldb\

也就是可以通过物理或恶意软件访问用户计算机的用户就可以获得这些数据。

此外,本地存储还可以被浏览器扩展访问,然后浏览器扩展可以泄露保存的数据。研究人员创建了一个简单的Chrome web扩展实现了该功能:

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

安装该扩展后,打开Surf网站后,就可以看到包含加密的keystone的消息:

Extracting encrypted wallet data from localStorage using a browser extension

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

因为控制用户钱包的数据是保存在用户计算机上的,因此对用户资金的唯一保护就是强加密。

Keystore加密

Surf应用会在用户输入正确PIN码后加密seed词语并向用户显示:

Surf asks for the PIN code before showing the seed phrase

图6 Surf要求用户输入PIN码

研究人员分析发现askForPassword函数会被调用,并接收加密的keystore。

The function responsible for fetching the seed phrase asks for the PIN code

图7 负责取回seed词语的函数

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

The askForPassword function reads and validates the PIN code

图8 askForPassword函数读取和验证PIN码

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

Surf decrypts the keys using nacl_secret_box_open

图9   Surf使用nacl_secret_box_open解密密钥

在deriveKeyFromPasswordAndSalt函数中,Surf会使用使用Scrypt密钥派生函数从PIN码中派生出解密密钥:

Surf derives the keystore decryption key from the entered PIN code and salt using Scrypt

图10 – Surf 派生keystore解密密钥

攻击场景

Checkpoint研究人员重新实现了nodeJS的密钥派生和keystore解密,并对PIN码执行了暴力破解攻击。在4核Intel i7处理器上每秒钟可以破解95个密码。虽然效率不高,但是足以对6位PIN码发起攻击了。在最坏情况下,检查10^6个可能的表中只需要175分钟。

研究人员在测试中,在Surf中创建了一个新的密钥,并从浏览器的本地存储上复制出了keystore:

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

攻击过程只花费了38分钟。最后成功获得了派生密钥,并解密了seed词组,可以用于恢复另一个设备上的密钥。

PIN code brute force results

图11 PIN码暴力破解结果

漏洞修复

Checkpoint研究人员将该漏洞提交给了 Ever Surf 开发者,开发团队通过发布桌面版的方式修复了该漏洞。目前,该web版本只用于开发用途。账户的seed词组不再Ever Surf web版中使用。

本文翻译自:https://research.checkpoint.com/2022/check-point-research-detects-vulnerability-in-the-everscale-blockchain-wallet-preventing-cryptocurrency-theft/如若转载,请注明原文地址


文章来源: https://www.4hou.com/posts/Wo5W
如有侵权请联系:admin#unsafe.sh