网络安全 频道

Red Pulse俞戴龙:区块链项目方面临的平台攻击和防范

  【IT168 技术】平时我们提到区块链都会认为它是非常安全的一项技术,今天我们将要讲的安全其和传统意义上的安全不太一样。事实上,世界上没有任何一个系统是安全的,包括区块链也是一样。Red Pulse作为区块链的项目方,不仅集成了自己原来的生态体系,在我们自身的平台上也集成了区块链。这里面任何一环,都会存在非常多的不安全性。Red Pulse作为区块链的项目方在过去都承受了哪些安全性的风险?我们先从数字货币行业开始说起。

  过去的几年,很多加密货币交易所都经历了盗币的事件。2018年占据过去几年的59%,每一年黑客盗取的数字货币逐年增大,所占的比重也很大。

  而2019年又有超过整整10亿的数字货币被盗取,其实区块链本身是安全的,但数字货币交易所存在的很多的不安全性会被黑客不断挖掘出来。

  Red Pulse平台简介

  Red Pulse平台鼓励大家在我们的平台上写原创文章。大家写文章后,Red Pulse用区块链的激励机制给大家一些奖励。同时Red Pulse把所有在平台发放的原创文章利用区块链的机制进行版权保护。

  概括来说,Red Pulse利用区块链的公开、透明不可篡改的特性。用区块链赋能传统业务,进行版权保护。

  在区块链上,Red Pulse能够自己写入智能合约,并把智能合约中版权保护的方法称作Proof of Creation的,可以对用户在平台上写的文章进行版权保护。同时还可以把你的版权转给其他人(Proof of Ownership),可以产生一些买卖和交易。此外所有的证据链条Red Pulse也会将其保存在区块链上。

  在我们最初选择的过程中,其实有很多区块链可以选择,譬如比特币、以太坊,还有些其他的区块链都可以来被用来选用集成到Red Pulse的区块链算法中。最终我们选择了非常有名的国有公链——NEO。

  Red Pulse选用NEO是因为它的速度很快且非常稳定。在集成的过程中主要做的几点工作进行了相关剖析。无论是选用NEO还是其他区块链,其大体是一样的。

  区块链本身的结构是一个链式的分布式全量存储,像链条一样一环套一环。每一个区块都有自己的头部,包含的Parent的哈希值等数据,加之本身的body数据,来保证整个链条是非常完整,且数据是不可以篡改的。我们把它剖析开来可以看到。我们平台利用区块链就是把作者发布在Red Pulse平台上的文章加上可信时间戳,连同Hash一起永久存入区块链上。

  我们发布在NEO区块链上的Token是我们业务发展所必要的在区块链上的载体。我们想把更多的工作重心放在如何将区块链更好的做落地应用,可是事与愿违,上线后我们不得不把很多精力分散在Token的安全防护上,下面就来说一说。

  因为Red Pulse是集成在区块链的公链上,所以在平台上会支持用户在平台上取Token和存Token的过程。

  首先看下用户在Red Pulse平台取币过程:用户来到网站,可以把自己的取币地址进行输入并输入要取的数值。Red Pulse会用轮询机制发现有用户要去取款和相关数值到他自己的地址。然后Red Pulse的热钱包用自己的平台上的私钥将其解开。并经过自己的签名和哈希,对整个区块链网络进行广播,然后将用户的币转到对应地址。但这一切都会存在一些不安全性,为了保证安全性,Red Pulse做了大量的工作来保证公司热钱包不受侵犯。

  即便如此仍会面临很多问题。因为整个系统是部署在亚马逊平台上,随着规模越来越大,也用到了亚马逊上非常多的系统和依赖。比如会用到EC2、数据库RDS、S3,与此同时为了分布式自动部署还用到Beanstalk,甚至其他的一些数据仓库以及无服务器的架构等都有用到,随着系统越来越复杂,每一个环节都有可能会被渗透攻击。所以Red Pulse的上线平台,除了看自己安全性的非常好的实践之外,还透露了Cloud Front,在第三方集成一个区块链,包括代码GitLab。如果系统出现错误会发送到loggly系统和SENTRY进行后续的数据分析。如此来看整个系统变得越来越复杂。

  Red Pulse在刚刚上线时相对比较简单,后端使用django做了一个Rest API。自身有一个NEO的热钱包,这个热钱包是整个NEO区块链生态上的一个全节点,该节点和自身背后的django做的后端服务在同一个VPC里,可以进行内网间交互。所以就通过自己的热钱包全节点可以做提币和存币的功能。

  前端相对比较简单,只需要调用后端的API即可,Red Pulse有个APP,还有前端的渲染。还包括我们会有手机端,所有的这些流量都是通过CLOUDFLARE来控制。

  我们在2018年很谨慎的上线,上线后看到的第一个问题是看到了很多羊毛党,因为我们的网站有羊毛可以薅。我们突然就意识到这个世界并不像我们想象的那么乐观,而是一上线就被很多人盯上。

  为了让自己的系统变得更加安全,我们想的是更严重的问题。比如有人去我们的热钱包恶意提币。我们非常严格的再回到系统设计里想一个办法,让所有的提币交易都由我们控制,最终我们想做一个类似Checksum一样的算法检查数据库发生的和区块链上发生的是一致的。

  Checksum第一版本虽然实现起来非常很简单,但是在有了在Checksum之后,我们工程师对于整个系统安全来说信心就更大了,最容易出问题的钱包这一块可以很大程度上进行有效控制。

  与此同时我们还记录了实时log。我们想把实时的log打在一个公司的墙壁上。我们找了很多系统但没有找到特别满意的,反而我们用slack的效果还是令人满意的,因为slack就像聊天一样。我们只需要把所有东西丢到slack里面,slack本身就是我们公司日常在用的沟通软件。所以一切东西都可以在slack里在墙壁上电视机上开一个slack,所有的消息都丢在里,所有系统上发生的事情就可以近乎实时监控。

  我们又上线一段时间之后,突然发现我们的用户数在几天有一次激增的过程。对于我们创业公司来,大家会觉得这种用户激增是件非常好的事情。但工程师并不这么想,当时我们还没做太多宣传,突然在很短时间出现这么多用户我们觉得不太正常。后来我们看了下,这些用户到底来自哪,他们为什么要注册,用什么邮箱?

  随后发现里面有一些规律。大多数用户都是来自东南亚的国家,像越南、菲律宾、柬埔寨等。几天之内这些用户用的全部都是Gmail邮箱,而且他们会用一个Gmail邮箱后面去加一个加号,如果大家用过Gmail邮箱会知道,如果在后面加加号,其实都是同一个邮箱,这么做的目的是为了将来可以实施女巫攻击。

  女巫攻击就是一个攻击者可以控制很多账号,将来会对网站的一些决策做一些影响。那最简单的一个例子,大家可能去做一些评论,很多人去攻击一家餐厅,说这家餐厅很难吃,把他的评分降下来,这就是一种常见的女巫攻击。结合我们网站上的机制,可以很方便的用很多账号对其中一篇文章全部打五颗星,结合我们的算法可能会给一些写的质量很差文章很多奖励,因为他的星值很高,所以他拿到的奖励会特别多。我们认为这是一种不太正常的女巫攻击,虽然他现在什么都没有做。但我们也需要做一些防范。

  我们的算法工程师对算法进行了一些修改。我们会给平台的用户一个分数,根据他的贡献对应的分数再给用户不同的等级,我们当时用了一个线性方程来做。出现这个事情时候,我们就使用了一些更复杂的算法,比如用Sigmoid,或者用逻辑回归来做。他的好处是刚开始的时候,用户在平台上的分数很低,只有当写了很多高质量文章后才会有比较快速的增长。

  也就说在经过平台一定的考验之后才会有比较好的分数,才会有比较好的奖励。这里面所有的参数都属于我们控制,将来可以控制女巫攻击所能攻击的范围。同时也可以把第一个月上线时看到的羊毛党全部找出来。通过他们的特征将曲线调一调,让他们无机可乘。

  又过了几个月,我们就看到了更多的属于区块链的问题,比如假充值。

  有一天上班时,我一个同事说,有一个用户在我们平台上做了一个存款。但这笔存款一直都没有到他的账户上。如果大家用过这个区块链,就知道在区块链上有一个区块链浏览器。说直白一些就是一个对区块链里所有数据进行检索的工具。

  我们可以把其中的一笔交易打在上面,然后在整个区块链上做一些检索。如果他真的充值了我们没发现,只要是在区块链浏览器上发现了,就有可能是我们程序的bug。

  我把一个交易的id打在一个区块链浏览器上,发现确确实实是发生了一笔交易。但在另外一个区块链端浏览器上查询,发现并没有发生这笔一模一样的交易,这是一笔空交易或者其实是一个什么都没有发生的交易。

  左边和右边分别是NEO区块链两个不同的浏览器上,这两个浏览器都是官方所支持的,作用也是一样,都是在区块链的全节点上做检索,但这两个表现却不同,我们检索了同一笔交易,左边的Tracker会显示有一笔账:某笔交易是从某个地址转到另一个地址,但在右边的区块链浏览器,上面查无此证,什么都没有发生,这个时候我会去想到底发生了什么。因为如果我们相信左边确实有一笔充值充到平台,但根据右边又什么都没有发生,这是一个非常奇怪的问题,因为拜占庭容错的区块链不可能分叉,即不可能在不同的节点上会有不同的表现。我只能去问NEO官方公链的开发来解决问题。为什么两个区块链浏览器所表现出来的是不一样的,这笔交易到底有没有发生。

  最后我们得出的结论是:或许这个人找到了一个方法,可以构造出一个交易去骗过区块链浏览器,让浏览器相信这笔交易发生了。也就是说区块链的官方浏览器可以被骗过,认为这笔交易已经发生。如果我在这个区块里就可以打开那个人的钱包,确实可以看到他有余额在上面,但用另外一个区块链浏览器发现并没有钱,这笔转账是没有发生的,最后NEO也很快将这个问题进行了修复。

  为了更加安全,我们开始做数据的可视化,可以非常直观的看到问题。正所谓文不如表,表不如图。当我们在数据库里看数据,很难一眼看明白。但如果将其变成图表的形式就很方便。如果我们把表格的形式转换成图的形式会更加直观。

  我们花了大概一到两个月的时间将所有在平台上发生的一切,以数据可视化的形式展现出来,让我们非常直观的知道我们平台上发生了什么,有多少个数字货币的转换,有多少取款,有多少存款,有多少写文章,有多少人得到了多少分。让整个平台更加可控。

  之后我们碰到了更加恐怖的撞库攻击。别人可能利用其他的一些已经泄露的数据库(数据库里可能有用户名和密码)来登录我们的网站。如果成功了,就可以以别人的身份来登录网站。

  我们来看一个例子。有一天同事说,今天网站为什么打开那么慢。因为临近下班了,我们就把整个服务器进行了重启,把数据库也进行了重启。过了五分钟同事又来了,说刚才快了一会儿,现在又慢了。这个时候我们就跑到亚马逊上看看到底发生了什么事。

  我们可以看到cpu占了100%。就是说我们的数据库服务被占满了100%的cpu。这是过去从来都没有发生过的事情。

  我们仔细进行了回看,发现cpu并不是永远都是100%,而是在几分钟之前一下从非常低的cpu占到100%的cpu(如图)。

  我们再从CLOUDFLARE里去看,我们加了一些JavaScript,加了一个worker,更多的信息可以先通过worker转发到自己的ELB里面,来看到更加详细的数据。

  在kibana里面,我们搜集到的数据发现,有一个API被调用的次数突然就非常大。在短短几个小时里达到了566382次的调用。而这个API叫做token-auth。我们一眼就知道,这个接口就是我们在登录时所调用的接口,这个接口在短短几个小时里被调用56万次,这一定是一种攻击,一定有人蓄意对网站进行攻击。我们就把已经回家的同事全部招回到公司,一起研究这个问题。

  通过对数据库的分析最终确定,这是一次撞库攻击,因为我们在数据库里发现所有的语句都是类似于:他的用户名是什么,密码是什么,然后通过一个SELECT语句来做撞库。而这些用户名在我们数据库里直接找是找不到的。也就是说并不是一些真实的用户在尝试用他们的用户名和密码登陆我们的网站,而是在用一些根本不存在我们数据库里面的用户名尝试登录我们的网站。

  我们首先需要在很短时间先出一个解决方案,这个解决方案非常简单粗暴。大家可以看到就只有两行代码:

  第一句话,我们在python上加了个修饰符,在修饰符里写了一个函数。我们规定同一个ip地址,同一个用户名等在30秒内只能调用一次,

  第二个更加简单,我们写了一个sleep函数。当你调用完之后,我不返回给你结果。当输入一个用户名和密码的组合之后,我们并不把到底是正确还是错误的结果返回,故意让你慢。等20秒后才把结果返回,如果说是真实用户会抱怨说今天登录怎么这么慢。没关系,我们其他的api速度都很快,只是登录的时候慢一点。但对于攻击者来说,他每一次都需要等20秒,这极大拖延了他的速度,给我们争取了很多时间。这两条语句写完后,我们的CPU占用从100%直接降到了20%左右。让我们有很多时间来解决这个问题。

  从另外一个角度,我们可以看到我们记的更多的数据。我们看到用户大概是用了什么用户名,大概是用了什么密码,当然我们不会去保存用户的密码,我们只是把用户输错时临时性的把它输出来。同时我们也从互联网上下载了几个已经被泄露的数据库。我们再把我们得到的数据到内置的数据库里边看。如果可以匹配上,说明攻击者正在用某一个正在泄露的数据库来尝试登录,我们可以直接把这个数据库在我们平台上封掉。可惜的是,我们下载的几个公开的数据库中并没有发现相同的数据。

  我们发现攻击者用的国家是新加坡、马来西亚等。我们先把整个国家的IP全部封掉一段时间来缓解压力。

  所以在哪那几天如果用户是从马来西亚或者是新加坡访问,都被临时性的Block一段时间。因为我们发现99%以上的攻击都来自马来西亚、新加坡、柬埔寨、越南这几个国家,都被我们封掉了,给我们争取更加多的时间。

  随后我们开始寻找应对措施,首先我们登录时需要验证码。之前验证码过于简单,可能一个非常简单的ocr识别就会把它识别出来,所以我们把验证码搞得更加复杂一点,譬如算术计算,或者说滑动验证码。

  第二,把网站上所有的session全部让他失效,然后强制所有我们觉得有风险的用户,把他的密码全部进行加固和修改,改的更加复杂。我们觉得有些人的用户名和密码已经被攻破。我们就也把他们的密码改掉,同时给用户发一个邮件进行告知,如果要改回,可以进入网站进行找回密码改掉。

  第三,强制2FA,黑客用的是静态数据,用的是用户名和密码的组合。我们可以用一些动态的手段来确认你的身份。我们可以启用谷歌2FA的机制。也可以通过用户注册手机的短消息来做2FA,将静态的东西变成动态的东西来让他们登录。

  第四,制定很多的风险规则,制定Risk Control,同时对取款做了自动关闭的准则。此外前端收集了一些指纹,可以对知道的这些攻击者进行更彻底的封杀。同时还做了很多例如AI识别等,包括Cloud Flare进行屏蔽等。

  接下来是达到的效果,我们把这些都输出在slack里面,攻击者全部被我们侦测到并进行了屏蔽。整个系统的访问就被挡在外面。

  在这段时间之内,非常有名的是币安发生的问题,当时黑客通过类似的手段,从币安的系统里提走了7000个比特币。

  在7月份我们又碰到了一种新的攻击——社工攻击(社会工程学攻击),是目前为止最厉害的一种攻击手段。我在知乎上搜到了这样一个帖子。知乎上有人说,社工攻击已经可以黑掉任何一个网站,任何一个企业,而且社会工程学无处不在。

  我们一个客户提了一个问题,说他取款失败了,取款并没有到账上,但平台却说取款已经成功,客户的语气非常强硬。那天我去看了这个问题,我去了区块链浏览器,把交易ID输入进入,看到里面是空的,再到另外浏览器上也去看一下发现这里是有的。当天确实有交易而且应该是成功的,但当我再看下面log时候发现有一些错误,我再去看一下他的钱包,看看余额是多少,发现他的余额真的是零。我想,有可能这笔交易真的没发生,所以我们应该把这笔Token再重新发送一遍给用户。

  为什么余额会是零?我们往下拉,发现下面有最近20个交易,记录显示我们钱包已经给他转钱。转帐之后这个人又把收到的这笔钱转到另一个地址。所以。这个用户在对我们客服进行欺骗,他明明已经收到钱而且收到钱之后又把这笔钱转走。这是一种社会工程学攻击,是在欺骗我们的客服。

  其实社会工程学的案子很多,以前我经常会讲一个例子,我当时我当时冒充一个manager,说我给你发一个链接,我在测试这个东西,你帮我去点开一下。但这个链接中我已经植入了一些脚本,我会通过脚本把你的一些session等全部都搜集下来,而且发邮件是可以匿名的,所以我可以以任何人的名义,甚至以他们公司邮箱的名义发邮件。可想而知,大家如果收到这样的邮件,一定会点开链接。一旦点开这个链接,很多东西就都被我盗走,这也是一种社会工程学。所以说社会工程学无处不在。

  随着我们平台上复杂度的增加,我们平台上经历了各种各样的问题,我们发现以前的数据可视化远远不够。

  后来我们花了更多的维度剖析我们网站上发生的事情,发生了什么?在哪里发生的?从多个维度分析来确保平台至少在数据层面是安全的。花了很多的公司,甚至还组建了Data team来做相关工作。

  随后,我们还找了知道创宇、慢雾等第三方公司来帮我们一起来看我们网站里还有哪些问题,还是发现了很多非常严重和高危的漏洞。所以其实在我们平台上线之后,碰到了各种各样的攻击,攻击是无处不在且一直持续在发生。

0
相关文章