• Welcome to the world's largest Chinese hacker forum

    Welcome to the world's largest Chinese hacker forum, our forum registration is open! You can now register for technical communication with us, this is a free and open to the world of the BBS, we founded the purpose for the study of network security, please don't release business of black/grey, or on the BBS posts, to seek help hacker if violations, we will permanently frozen your IP and account, thank you for your cooperation. Hacker attack and defense cracking or network Security

    business please click here: Creation Security  From CNHACKTEAM

区块链钱包漏洞可盗取加密货币


Recommended Posts

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

Ever Surf

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

Web  version  of  Ever  Surf

1曾经冲浪网页版

漏洞分析

Surf wallet中用于签署交易的密钥仅保存在用户的设备上。所有区块链操作都在客户端实现。因此,与其他非托管钱包类似,不需要注册过程。

当用户第一次运行该应用程序时,他们将被建议创建一个新的钱包。Surf生成一个种子短语和一个公钥-私钥对。此外,将要求用户创建一个6位PIN码:

PIN  code  setup  in  Ever  Surf

图2 ever surf中的PIN码设置

然后,该PIN码用于登录应用程序并确认交易。Surf有一个保护机制来处理PIN码的暴力破解:

Ever  Surf  prevents  brute-forcing  PIN  codes

图3曾经冲浪防止密码暴力破解

即使没有这种保护机制,创建的密钥和种子短语也存储在浏览器的本地存储中。localstorage是使用本地存储特性从JS访问的键值存储,例如:

//Storevalueonthebrowserbeyondthedurationofthesession

localStorage.setItem('key ',' value ');

//retrieve value(persistsevenafterclosingandre-openingthebrowser)

alert(local storage . getitem(' key '));Surf将密钥和种子短语以以下格式保存在本地存储的“surf.ton.wallet”密钥中:

Encrypted  wallet  data  is  stored  in  the  browser’s  localStorage

图4存储在浏览器本地存储中的加密钱包数据

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

Mozilla \ Firefox \ profiles \ { profile _ name } \ web app store . SQLite chrome将本地存储存储为未加密的levelDB数据库:

谷歌\ Chrome \用户数据\默认

\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版中使用。

Link to comment
Share on other sites