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

冲浪吗

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

1曾经冲浪网页版

漏洞分析

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

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

图2 ever surf中的PIN码设置

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

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

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

//在会话localStorage.setItem ( 'key ',' value ')的持续时间之后在浏览器上存储值;//检索值(即使在关闭并重新打开浏览器后仍然存在)alert(local storage . getitem(' key ');

Surf将密钥和种子短语以以下格式保存在本地存储的“surf.ton.wallet”密钥中:

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

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

Mozilla Firefox profiles { profile _ name } web app store . SQLite

将Chrome本地存储存储为未加密的levelDB数据库:

GoogleChromeUser数据默认本地存储级别数据库

也就是可以通过物理或者恶意软件访问用户电脑的用户就可以获取这些数据。

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

alert(local storage . getitem(" surf . ton . wallet "));

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

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

因为控制用户钱包的数据都存储在用户的电脑上,所以对用户资金的唯一保护就是强加密。

密钥库加密

用户输入正确的PIN码后,Surf应用程序将加密种子字并显示给用户:

图6 Surf要求用户输入PIN码

研究人员发现,askForPassword函数将被调用并接收加密的密钥库。

图7负责检索种子词的函数

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

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

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

图9 Surf使用nacl_secret_box_open解密密钥

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

图10–Surf派生的密钥库解密密钥

攻击场景

检查点研究人员重新实现了nodeJS的密钥推导和密钥库解密,并对PIN代码进行了暴力破解。在4核英特尔i7处理器上,每秒钟可以破解95个密码。虽然效率不高,但足以攻击6位PIN码。在最坏的情况下,检查10 ^ 6个可能的表只需要175分钟。

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

{ " encSeed ":{ " encStr ":" 6 rjkbh 88 wxkrjwl 4 OS 3c jrzvzkqglnv 39 u 3 yvlyurm 7 yzf 6h 79 xxxx/vz Inde 2 bkpesnjz 11y 4t 8 cfgpjmyi 1 w+ucyzw+fddttq 5 gakhjk 5 nf 60 cshz 4 qkxobiq 7 zbbped "," nonce ":" 2 TDR 9 fp0 rcpjewcs 8 xtcc 5m 2/FRY+I " } }

攻击只用了38分钟。最后,成功地获得了派生密钥,并解密了种子短语,该种子短语可用于在另一个设备上恢复密钥。