优惠论坛

标题: Btok大咖直播《Certik:加密钱包的漏洞利用与分析 》 [打印本页]

作者: 金色财经小编    时间: 2022-9-10 23:17

jfDQ4dlPB0Tz7yIERuoOoEqTxKeZugZoYZbD9yyA.png

什么是加密钱包?

加密钱包是一种存储私钥和/或公钥的设备、程序或服务。加密货币是虚拟的,它们无法像纸币一样存在钱包里,看不见也摸不着。加密钱包其实本身并不存放的你的电子货币,当我们进行交易时,加密钱包会使用用户的私钥来为交易签名,并在区块链上进行广播。

加密钱包有不同的种类,比如软件钱包和硬件钱包。软件钱包包括了网页钱包,移动端钱包,桌面钱包以及浏览器插件。知名的硬件有Ledger和Trezor. 本次演讲将重点为软件钱包中的网页钱包和桌面钱包。

加密钱包有两大核心功能:第一个是账户管理,即创建或导入账户;第二个是交易功能,即收发货币。某些协议的加密钱包拥有一些附加功能,比如COSMOS区块链钱包提供的委托功能,允许用户将货币委托给验证者并领取奖励。

在对市面上加密钱包的安全研究的过程中,我们也发现了一些“花哨”的功能。例如,用户可在桌面钱包中浏览新闻、添加第三方插件。用网页钱包发起在推特上赠送货币的活动。甚至还有一种桌面钱包,允许用户通过应用程序接口将任意类型的文件上传到其后台服务器。另有一款桌面钱包利用Webview来实现了一个 “浏览器”。在接下来的演讲中我们会展示上面提到的部分功能

我们一共研究了45不同的钱包,将它们分成了2类。其中一类是托管钱包,托管钱包是让服务器来管理用户的私钥。使用此类钱包时,用户需要使用用户名和密码登录应用,服务器返回Session token或JWT token。这些账户信息将存储在Cookie或本地/会话存储中。

另一种是去中心化钱包,即用户自己管理私钥、助记词以及密码。用户创建帐户或导入帐户后,这些信息将保存在本地/会话存储或JavaScript变量中。

下面我们来讲一下网页钱包. 这是一个典型的网页钱包界面,它就是我们CertiK的Deepwallet钱包。用户可以在这个界面中查看账户余额,收发货币,以及权益质押。

fFGU889gfnrxby05wha7ta5XLBWUMcHex7vS9afh.png

谈论到网页应用安全问题时,人们最先想到的就是“OWASP Top 10”的十大安全漏洞。以下是我们调查的27款网页钱包中OWASP十大安全漏洞的一些统计数据。我们在3款钱包中发现了跨站脚本(XSS),此演讲将选取2例进行案例分析。

cpdDMoWb5y39KliAJODAgwVveBqudsE7WIJrIfu0.png

案例一:去中心化网页钱包的DOM XSS漏洞

此钱包支持单一协议,拥有网页钱包的所有基础功能例如创建账户,交易和权益质押,没有任何其他花哨特征。

此应用程序会保存上次的访问位置:用户用密码解锁钱包后,下次会重新导回到该页面。这是实现这个功能的代码:

EFRZK5C3qAD2nUZt4raQ5knjXjV9d6h3A6pfZ0UV.png

如果你有测试网页应用程序的经验,就知道上面的代码很有可能包含DOM XSS漏洞. 事实正是如此,假如用户输入 https://wallet.redacted.com/?returnTo=javascript:alert(1), 那网站会弹出alert(1)的窗口

前面提到这是一个去中心化的网页钱包。用户创建帐户或导入帐户后,Keystore和密码都存储在浏览器的Local Storage里。

cvZu7D7r70JTpKnWhVxVpjtbf36HjcUuERI7Slip.png

攻击者可以利用此DOM-XSS漏洞窃取Local Storage中的Keystore和密码,在下面的这个漏洞利用URL中,它读取了密钥库和密码的内容,并将其发送到我的网络服务器。在服务器日志中,可以看到秘钥库内容及密码。当攻击者掌握了这些信息,就相当于控制了用户的账户,可以登录到他们的钱包并将钱转出。

PoC链接

该网页钱包厂商的修复方法为,每当用户解锁钱包,网页总会重定向到个人主页,从而不给攻击者任何插入恶意代码的机会。

下面来讲桌面钱包

桌面钱包是一种可在苹果、windows和Linux上运行的桌面应用程序。桌面钱包是通过什么技术框架构建的呢?我们研究了18款桌面钱包,其中QT(C++)、Dot Net(C#),还有java各有一个,Electron框架15个。

桌面钱包的案例研究将探讨Dot Net桌面钱包的服务器远程代码执行漏洞,以及Electron钱包的客户端远程代码执行漏洞

案例一:Dot Net桌面钱包的服务器远程代码执行漏洞

接下去看看我们在桌面钱包中发现的一个远程代码执行漏洞。首先介绍一下背景:这个钱包是一个去中心化的单一协议钱包,由c#语言编写,使用了Dot Net框架。它包含许多常见的钱包功能,如帐户管理、交易转账和部署/参与智能合约等。比较有趣的是,它还允许用户上传文件到服务器。这功能在钱包中并不常见,所以我们决定进一步研究这个功能。如前所述,Dot Net用于搭建此桌面程序,如果没有部署代码混淆功能,就很容易通过反编译来获取源代码。此案例钱包也是这种情况,因此我们能够通过恢复源代码来进行进一步的分析。

在对可执行文件进行反向编译之后,我们找到了实现文件上传的源代码,如下面的代码片段所示。我们看到“upload.php”是服务器上的处理文件上传的。我们现在知道服务器后台使用了php。因此,如果我们可以上传一个php webshell到服务器并在浏览器中打开它,我们可能就能够在服务器上远程执行代码。

2SVzNRe7wAVsy8jfnEAsNiYFIutDhWrNqqqGxBLo.png

在成功地用钱包上传了一个php webshell文件之后,我们尝试着在浏览器访问上传的文件。我们成功的访问了上传的webshell, 并能在webshell中执行命令。同时我们发现网络服务器是在“administrator”用户下运行的,因此我们能够以“administrator”权限执行命令。在这种情况下我们能够完全地控制这台服务器,并且能够操纵其他用户上传的文件。但是,由于这是一个去中心化的钱包,服务器不会存储任何用户私钥,所以就不能利用此漏洞直接危害用户帐户

修复是非常简单的,开发人员在他们的应用程序中直接删除文件上传功能,这样他们就不必再处理它了。这实际上是一个好办法,因为加密钱包应该尽可能地保持简洁,以此来避免安全问题。

接下来,我们再来谈谈Electron钱包的安全问题。

Electron是一个开源软件框架,它让开发人员能够使用HTML、CSS和Javascript等网络技术构建跨平台的桌面应用程序。使用Electron的好处是开发人员可以重复利用网页应用程序代码来构建桌面应用程序,不需要学习新的编程语言。

网页应用程序的大部分漏洞基本上都可以在Electron应用程序中找到。对于Electron特定的安全问题,Electron官方安全指南(https://www.electronjs.org/docs/tutorial/security)提供了常见问题的详细解答. 在2017年美国的黑帽大会上,一个名为“A STUDY OF ELECTRON SECURITY(https://doyensec.com/resources/us-17-Carettoni-Electronegativity-A-Study-Of-Electron-Security.pdf)”的演讲谈到了如何利用先进技术绕过Electron安全防护来执行代码。

这里我们来看nodeintegration这个配置,此配置决定了Electron程序是否可以访问Node.js的模块。Electron框架可被用来构建比网页应用程序更强大的应用程序,原因就在于Electron应用程序可以导入很多Node.js模块。不过这也带来了更大的安全风险。

Nodeintegration:false

这是MyCrypto桌面钱包的最新版本。在此配置中,Nodeintegration被设置为false,Node.js被禁用了。如果在dev控制台输入”require”,它会显示”require is not define”。

aOkqWWZf8HCnv5xqW8wrVaSYbzy262IzafH9pFEk.png

Nodeintegration: true

这是MyCrypto桌面钱包的早期版本。在此配置中,nodeintegration被设置为true,所以Node.js被启用了。如果在dev控制台中输入”require”,它将显示关于”require”的相关信息。






欢迎光临 优惠论坛 (https://tcelue.tv/) Powered by Discuz! X3.1