“数据库CPU 100%满,撞库攻击来了!” | 区块链项目平台攻击与防范
本文根据ITPUB技术栈系列线上沙龙活动中红脉余黛龙的分享整理而成。
通常我们提到区块链,都会认为它是一种非常安全的技术。 我们今天要讲的安全和传统意义上的安全不是一回事。
事实上,世界上没有任何系统是安全的,包括区块链。 红脉作为区块链项目方,不仅整合了自身原有的生态,还在自己的平台上整合了区块链。 这里的任何一个环节都会存在很大的不安全感。 红脉作为区块链项目方,过去承担过哪些安全风险? 先从数字货币行业说起。
在过去的几年中,许多加密货币交易所都发生了硬币盗窃事件。 2018年占前几年的59%,被黑客窃取的数字货币逐年增加,占比较大。
2019年,超过10亿的数字货币被盗。 其实区块链本身是安全的,但是数字货币交易中的很多不安全因素会不断被黑客发现。
红脉平台介绍
Red Pulse 平台鼓励大家在我们的平台上撰写原创文章。 每个人写完一篇文章后,红脉动用区块链的激励机制给大家一些奖励。 同时比特币放一万个地址碰撞私钥,红脉动利用区块链机制保护平台上所有原创文章的版权。
简而言之,Red Pulse利用了区块链公开、透明、不可篡改的特性。 用区块链赋能传统企业,保护版权。
在区块链上,红脉可以自行编写智能合约,智能合约中的版权保护方式称为Proof of Creation,可以保护用户在平台上所写文章的版权。 同时,你也可以将你的版权转让给他人(Proof of Ownership),这可以产生一些销售和交易。 此外,所有证明链Red Pulse也会将其保存在区块链上。
在我们最初的选择过程中,其实有很多区块链可以选择,比如比特币、以太坊,还有一些其他的区块链可以集成到红脉的区块链算法中。 最终我们选择了非常有名的国有公链——NEO。
Red Pulse 选择 NEO 是因为它速度快而且非常稳定。 在集成过程中,分析了几个主要任务。 不管你选择NEO还是其他区块链,大体上是一样的。
区块链本身的结构是一个分布式全存储的链,就像一个链。 每个区块都有自己的区块头,包括Parent的hash值等数据,还有自己的区块体数据,保证整个链条非常完整,数据不可篡改。 我们可以看到它被解剖了。 我们的平台利用区块链为作者在红脉平台发表的文章加上可信的时间戳,与Hash一起永久存储在区块链上。
我们在NEO区块链上发布的Token是我们业务发展所必需的区块链上的载体。 我们想更多地关注如何更好地实现区块链应用,但事与愿违。 上线后,我们不得不将大量精力分散在Token的安全保护上。 下面我们就来说说吧。
由于Red Pulse集成在区块链的公链上,平台将支持用户在平台上提现和存入Token的过程。
先看红脉平台提币流程:用户来到网站,输入提现地址和提现金额即可。 Red Pulse 会使用轮询机制来找出一个用户想要提现到他自己的地址的钱和相关值。 Red Pulse 的热钱包随后在平台上使用自己的私钥解锁。 并通过自身的签名和哈希,广播到整个区块链网络,再将用户的币转入相应的地址。 但是这一切都会有一些不安全感。 为确保安全,红脉做了大量工作以确保公司热钱包不被侵犯。
尽管如此,仍然存在很多问题。 因为整个系统部署在亚马逊平台上,随着规模越来越大,也用到了亚马逊上的很多系统和依赖。 例如,将使用 EC2、数据库 RDS 和 S3。 同时会使用Beanstalk做分布式自动部署,甚至会用到一些其他的数据仓库和serverless架构。 随着系统越来越复杂,各个环节都有可能被渗透和攻击。 所以 Red Pulse 的在线平台,除了研究自己的安全最佳实践外,还透露了 Cloud Front,它集成了区块链和第三方,包括代码 GitLab。 如果系统有错误,会发送给loggly系统和SENTRY进行后续的数据分析。 这样,整个系统就变得越来越复杂。
Red Pulse 刚推出时,比较简单。 后端使用 django 创建了一个 Rest API。 它本身有一个 NEO 热钱包。 这个热钱包是整个NEO区块链生态中的一个全节点。 节点和后面django做的后端服务在同一个VPC,可以和内网交互。 因此,您可以使用自己热钱包的全节点来实现提币和提币功能。
前端比较简单,只需要调用后端API,红脉有一个APP,还有前端渲染。 还包括我们会有一个移动终端,所有这些流量都是通过Cloudflare来控制的。
2018年我们上线非常谨慎,上线后第一个看到的问题就是看到了很多羊毛党,因为我们网站有羊毛可以榨。 我们突然发现,这个世界并没有我们想象的那么乐观,但是一上线就被很多人围观了。
为了让我们的系统更安全,我们考虑更严重的问题。 比如有人恶意从我们的热钱包里提币。 我们非常严格,回到系统设计上想办法让所有的提款交易都由我们来控制。 最后,我们想做一个类似Checksum的算法来检查数据库中发生的事情与区块链上发生的事情是否一致。
虽然第一版Checksum实现起来非常简单,但是有了Checksum之后,我们的工程师对整个系统的安全性有了更大的信心,最容易出问题的钱包也能在很大程度上得到有效控制。
同时,我们还记录了实时日志。 我们想把实时日志放在一个公司的墙上。 我们找了很多系统都没有找到特别满意的。 相反,用slack的效果还是比较满意的,因为slack就像聊天一样。 我们只要把所有的东西都扔进slack,它本身就是我们公司每天都在用的通讯软件。 所以一切都可以在墙上的电视上打开,所有的新闻都被扔进去,所有系统上发生的事情都可以近乎实时地监控。
我们上线一段时间后,突然发现我们的用户数在几天内出现了激增。 对于我们创业公司来说,大家会觉得这种用户激增是一件非常好的事情。 但工程师们并不这么认为。 我们当时没有做太多宣传,觉得短时间内出现这么多用户很不正常。 后来,我们查看了这些用户来自哪里,他们为什么注册,他们使用的电子邮件地址是什么?
然后我在里面发现了一些规则。 大多数用户来自东南亚国家,如越南、菲律宾、柬埔寨等。几天之内,这些用户都在使用Gmail邮箱,而且他们会使用Gmail邮箱加一个加号。 如果你用过Gmail邮箱,你就会知道,如果在它后面加一个加号,其实就是同一个邮箱,这样做的目的就是为了让以后可以进行Sybil攻击。
女巫攻击是指攻击者可以控制多个账户,从而影响网站日后的一些决策。 最简单的例子,你可能发表一些评论,很多人攻击一家餐馆,说这家餐馆很糟糕,它的评级被降低了。 这是一种常见的女巫攻击。 结合我们网站的机制,使用多个账号给其中一篇文章打五颗星是非常方便的。 结合我们的算法,一些质量不好的文章可能会被打赏很多,因为他的star值很高。 所以他会得到很多的回报。 我们认为这是一次不寻常的女巫攻击,尽管他现在什么也没做。 但我们也需要采取一些预防措施。
我们的算法工程师对算法进行了一些修改。 我们会给平台的用户打分,根据用户的贡献对应的分数给予不同的等级。 我们使用线性方程来做到这一点。 当发生这种情况时,我们使用了一些更复杂的算法,例如 Sigmoid 或逻辑回归。 他的优势在于刚开始的时候用户在平台上的评分很低,只有写了很多高质量的文章之后才会有比较快的增长。
也就是说,经过平台的一定测试,会有更好的分数和更好的奖励。 这里的所有参数都属于我们的控制范围,以后我们可以控制Sybil攻击可以攻击的范围。 同时,你还可以把你第一个月上线时看到的所有羊毛党都找出来。 通过他们的特性调整曲线,使他们不能被利用。
又过了几个月,我们看到了更多属于区块链的问题,比如假充值。
一天上班,同事说有用户在我们平台充值。 但存款从未到达他的账户。 如果你用过这个区块链,你就知道区块链上有一个区块链浏览器。 说白了,它是一个用于检索区块链中所有数据的工具。
我们可以把其中一笔交易放在上面,然后在整个区块链上做一些搜索。 如果他真的充值了,而我们没有发现,只要在区块链浏览器上找到,就可能是我们程序的bug。
我在区块链浏览器上输入一笔交易的id,发现确实发生了一笔交易。 但是,我在另一个区块链端浏览器上查看,发现并没有发生完全相同的交易。 这是一个空交易或实际上没有发生的交易。
左右分别是NEO区块链上两个不同的浏览器。 这两个浏览器都是官方支持的,功能一样。 他们都是在区块链的全节点上进行搜索,但是这两者的表现是不一样的。 当我们检索同一笔交易时,左边的Tracker会显示一个账户:某笔交易从一个地址转到了另一个地址,但是右边的区块链浏览器中并没有这个凭证。 什么都没发生,这次我会好好想想发生了什么。 因为如果我们认为左边的平台确实有充值,但是右边什么都没发生,这是一个很奇怪的问题,因为拜占庭容错的区块链是不可能分叉的,即不可能在不同的节点上会有不同的表现。 只能请NEO官方公链开发解决问题。 为什么两个区块链浏览器的性能不同,是否发生了这笔交易。
最后,我们得出的结论是,也许这个人找到了一种构造交易的方法,让区块链浏览器相信交易发生了。 也就是说可以骗过区块链官方浏览器认为交易已经发生。 如果我能在这个区块打开那个人的钱包,我确实可以看到他上面有余额,但是我用另一个区块链浏览器发现没有钱,这个转账没有发生,最后NEO也会出现这个问题很快就修好了。
为了更加安全,我们开始对数据进行可视化,这样可以非常直观的看到问题所在。 俗话说,文字不如表格,表格不如图片。 当我们查看数据库中的数据时,很难一眼看懂。 但是如果把它变成图表就很方便了。 如果我们将表格的形式转换成图形的形式,会更直观。
我们大概用了一到两个月的时间,把平台上发生的一切,以数据可视化的形式呈现出来,让我们直观的知道我们平台上发生了什么,数字货币兑换了多少,以及出金多少,入金多少,多少篇文章,多少人得多少分。 让整个平台更加可控。
然后我们遇到了更可怕的撞库攻击。 其他人可能会使用其他一些泄露的数据库(该数据库可能包含用户名和密码)来登录我们的网站。 如果成功,您可以以其他人的身份登录该网站。
让我们看一个例子。 有一天,一位同事问为什么今天网站打开这么慢。 因为下班了,所以我们重启了整个服务器和数据库。 五分钟后,同事又来了,说之前快了一段时间,现在又慢了。 这时候我们就跑去亚马逊看看是怎么回事。
我们可以看到cpu是100%。 也就是说,我们的数据库服务是cpu满100%的。 这是以前从未发生过的事情。
我们仔细回头看,发现cpu并不是一直都是100%,而是几分钟前从一个很低的cpu到100%的cpu(如图)。
我们再从 Cloudflare 来看。 我们添加了一些 JavaScript 和一个 worker。 更多信息可以通过worker转发给自己的ELB,查看更详细的数据。
在kibana中,我们收集的数据发现,某个API的调用次数突然变得非常多。 在短短几个小时内就达到了 566,382 个电话。 这个 API 叫做 token-auth。 我们一看就知道这个接口就是我们登录时调用的接口,这个接口在短短几个小时内被调用了56万次。 这一定是攻击,一定是有人故意攻击了网站。 我们召集了所有已经回国的同事一起研究这个问题。
通过对数据库的分析,最终确定这是一次撞库攻击,因为我们发现数据库中所有的语句都是类似:what is his username and password,然后用一个SELECT语句来做credential馅。 而且这些用户名不能直接在我们的数据库中找到。 这意味着不是一些真实用户试图使用他们的用户名和密码登录我们的网站,而是一些在我们的数据库中不存在的用户名试图登录我们的网站。
我们首先需要在短时间内想出一个解决方案,这很简单粗暴。 可以看到,只有两行代码:
第一句话,我们给python加了一个修饰符,在修饰符里面写了一个函数。 我们规定同一个ip地址,同一个用户名等,30秒内只能调用一次。
第二种更简单,我们写一个sleep函数。 你打电话后,我不会把结果还给你。 输入用户名和密码组合后,我们不返回结果是否正确,故意拖慢您的速度。 返回结果前等待 20 秒。 如果是真实用户,他们会抱怨今天登录怎么这么慢。 没关系,我们其他的api都快,只是登录的时候慢了点。但是对于攻击者来说,他每次都需要等待20秒,这大大拖慢了他的速度,也为我们争取到了很多时间。 写完这两条语句后,我们的CPU占用率直接从100%下降到20%左右。 让我们有很多时间来解决这个问题。
从另一个角度,我们可以看到我们记录的更多数据。 我们可以看到用户可能使用的用户名和密码。 当然,我们不保存用户的密码,只是在用户输入错误的时候临时输出。 我们还从互联网上下载了几个泄露的数据库。 让我们看看我们在内置数据库中得到的数据。 如果能够匹配到,说明攻击者正在使用一个正在被泄露的数据库尝试登录,我们可以在我们的平台上直接屏蔽这个数据库。 不幸的是,在我们下载的几个公共数据库中都没有找到相同的数据。
我们发现攻击者使用的国家有新加坡、马来西亚等,我们把整个国家的IP都封一段时间来缓解一下压力。
所以那几天,如果用户从马来西亚或新加坡访问,会被暂时屏蔽一段时间。 因为我们发现99%以上的攻击来自马来西亚、新加坡、柬埔寨、越南等国家,都被我们屏蔽了,为我们争取了更多的时间。
然后我们就开始寻找对策,首先我们登录的时候需要验证码。之前验证码太简单了,可能很简单的OCR识别就可以识别,所以我们把验证码做的复杂一点,比如算术运算,或者滑动验证码。
让他把网站上的所有session全部失效,然后强制所有我们认为有风险的用户加强和修改密码,让修改变得更加复杂。 我们认为某些人的用户名和密码已被泄露。 我们也会更改他们的密码,同时发邮件给用户,通知他们如果想改回来,可以进入网站找回密码再改。
为了强制执行 2FA,黑客使用静态数据,使用用户名和密码组合。 我们可能会使用一些动态方式来确认您的身份。 我们可以启用 Google 2FA 的机制。 也可以通过用户注册手机的短信来做2FA,把静态的东西变成动态的东西让他们登录。
第四,制定了很多风险规则,制定了风险控制,并制定了自动平仓的出金指南。 另外,前端采集了一些指纹,可以更彻底的阻断已知的攻击者。 同时也做了很多事情,比如AI识别,包括Cloud Flare做blocking。
接下来是实现的效果。 我们在 slack 中输出所有这些,所有攻击者都被我们检测到并阻止。 对整个系统的访问被阻止。
这段时间,非常著名的问题发生在币安,黑客使用类似的手段从币安系统中提取了 7000 个比特币。
7月,我们遇到了一种新的攻击方式——社会工程攻击(social engineering attack),这是迄今为止最强大的攻击方式。 我在 Quora 上找到了这篇文章。 知乎上有人说,社会工程学攻击已经可以黑掉任何网站,任何公司,社会工程学无处不在。
我们有个客户问了一个问题,说他提现失败,提现没有到账,但是平台说提现成功了,客户的语气很强硬。 那天看这个问题,去区块链浏览器,输入交易ID,看到是空的,再去另一个浏览器查看,发现有。 那天确实有交易,应该是成功的,但是看下面的日志,发现了一些错误。 我又去他钱包里看看余额是多少,发现他的余额真的是零。 我觉得有可能这个交易没有发生,所以我们应该重新发送这个Token给用户。
为什么余额为零? 我们向下滚动,发现下面有20笔最近的交易,记录显示我们的钱包已经转账给他了。 转帐后,此人将收到的钱转到另一个地址。 所以。 该用户在欺骗我们的客服。 他已经收到了钱,收到钱后就转账了。 这是一种欺骗我们客户服务的社会工程攻击。
事实上,社会工程学的案例很多。 我曾经讲过一个例子。 我假装是经理,说我给你发个链接。 我正在测试这个东西,你可以帮我点一下。 但是我在这个链接里植入了一些脚本,我会通过脚本收集你的一些会话等等,而且邮件可以是匿名的,所以我可以用任何人的名字,甚至是他们公司邮箱的Email来代表。 可以想象,如果你收到这样的邮件,你一定会点击其中的链接。 一旦我点击这个链接,我的很多东西就被偷走了,这也是一种社会工程学。 所以社会工程学无处不在。
随着我们平台的复杂度越来越高,我们在平台上遇到了各种各样的问题,我们发现之前的数据可视化远远不够。
后来我们拿了更多的维度来分析我们网站上发生了什么,发生了什么? 在哪发生的? 从多个维度进行分析,确保平台至少在数据层面是安全的。 花了很多公司,甚至成立了一个数据团队来做相关的工作。
后来我们也找了智创鱼、慢雾之类的第三方公司帮我们看看我们的网站有什么问题,还是发现了很多很严重的高危漏洞。 所以其实我们的平台上线之后,就遇到了各种各样的攻击。 攻击无处不在,而且还在继续发生。
2020年10月22-24日,由IT168旗下ITPUB企业社区平台主办的第十二届中国系统架构师大会(SACC2020)将进行网络直播云端。 自2009年以来,SACC架构师大会已成功举办了11届,汇集了国内CTO、研发总监、高级系统架构师、开发工程师和IT经理等技术群体,参会人数超过1000人。 过去3天的议程,涉及20+个专场,近120个议题比特币放一万个地址碰撞私钥,全部迁移至线上网络直播。 蓄势待发,奋起逆袭的SACC2020,期待您的报名与参与,共襄盛举!
DTCC中国数据库技术大会 2020-2019SACC2019中国系统架构师大会 PostgreSQL 2019中国技术大会 点击上方文字直接进入小程序浏览,后台回复关键词下载⏬DTCC、SACC、PG19直接领取全文版本PPT下载链接
你是不是在寻找?