Check Point 研究人员在 Everscale 区块链钱包中发现安全漏洞,可以窃取用户加密货币。
Ever Surf
Ever Surf 是一个跨平台的消息应用,一个区块链浏览器,也是 Everscale 区块链的加密货币钱包。使用 React Native 开发框架编写,同时上传到了 Google Play Market 和 Apple Store 应用市场。同时,还有一个可运行在任意平台的 Ever Surf web 版本。
图 1 Ever Surf web 版
漏洞分析
Surf 钱包中用于对交易进行签名的密钥只保存在用户设备上。所有对区块链的操作都是在客户端来实现的。因此,与其他非托管钱包类似,无需注册过程。
用户首次运行应用时,会被建议创建一个新的钱包。Surf 会生成一个 seed 词组和公私钥对。此外,用户会被要求创建一个 6 位数字的 PIN 码:
图 2 Ever Surf 中的 PIN 码设置
然后该 PIN 码被用于登入应用和确认交易。Surf 有应对暴力破解 PIN 码的保护机制:
图 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 中:
图 4 保存在浏览器 localStorage 中的加密的钱包数据
本地存储在 web 浏览器中并不是受保护的。比如,在 Firefox 中本地存储以非加密的 SQLite 数据库的形式存储:
MozillaFirefoxProfiles{profile_name}webappstore.sqlite
Chrome 将 local storage 以非加密的 levelDB 数据库的形式存储:
GoogleChromeUser DataDefaultLocal Storageleveldb
也就是可以通过物理或恶意软件访问用户计算机的用户就可以获得这些数据。
此外,本地存储还可以被浏览器扩展访问,然后浏览器扩展可以泄露保存的数据。研究人员创建了一个简单的 Chrome web 扩展实现了该功能:
alert ( localStorage.getItem ( "surf.ton.wallet" ) ) ;
安装该扩展后,打开 Surf 网站后,就可以看到包含加密的 keystone 的消息:
图 5 使用浏览器扩展从 localStorage 中提取加密的钱包数据
因为控制用户钱包的数据是保存在用户计算机上的,因此对用户资金的唯一保护就是强加密。
Keystore 加密
Surf 应用会在用户输入正确 PIN 码后加密 seed 词语并向用户显示:
图 6 Surf 要求用户输入 PIN 码
研究人员分析发现 askForPassword 函数会被调用,并接收加密的 keystore。
图 7 负责取回 seed 词语的函数
askForPassword 函数会调用 validatePassword 函数来执行 PIN 码验证。
图 8 askForPassword 函数读取和验证 PIN 码
最重要的动作是 PIN 码验证。通过调用 deriveKeyFromPasswordAndSalt 函数,Surf 会生成派生密钥,用于解密 keystore。然后在 isDerivedKeyCorrect 函数中使用 nacl_secret_box_open 执行解密过程:
图 9 Surf 使用 nacl_secret_box_open 解密密钥
在 deriveKeyFromPasswordAndSalt 函数中,Surf 会使用使用 Scrypt 密钥派生函数从 PIN 码中派生出解密密钥:
图 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 词组,可以用于恢复另一个设备上的密钥。
图 11 PIN 码暴力破解结果
漏洞修复
Checkpoint 研究人员将该漏洞提交给了 Ever Surf 开发者,开发团队通过发布桌面版的方式修复了该漏洞。目前,该 web 版本只用于开发用途。账户的 seed 词组不再 Ever Surf web 版中使用。
赞(5)