Skip to content

Latest commit

 

History

History
135 lines (75 loc) · 8.44 KB

04.md

File metadata and controls

135 lines (75 loc) · 8.44 KB

第四章:服务的架构一定有漏洞(下)

上一章讲的多半是关于直接暴露在外部用户的架构。

这一章我们要讲的是内部的架构。我会直接以一个区块链交易所作为例子。说明如何设计「相对安全」的架构。

系统关键脆弱瓶颈,改造成 API 导向

以一个区块链交易所,最脆弱的瓶颈在于以下几点:

  • 用户提币
  • 交易上链
  • 钱包存取
  • 用户存币

在前面一章的状况,我已经说过骇客常见的手法就是窜改数据库,直接假造馀额,进行提款。

关于这一点,其实可以用校验馀额与用户分层行为风控避掉。

比较危险的真不在这一环。而在于更后面的几层环节。

冷热钱包设计

现在坊间币所都夸耀自己有冷热钱包设计。其实这已经是目前标配了。

什么叫做冷热钱包设计呢?

区块链币所的原理是:

  1. 存币是扫描区块链帐本记录,扫描到用户专属钱包地址有存款动作以后,相对应的在数据库上记上一笔。
  2. 提币是发起提币后,通知币所的热钱包,要提币走人,发起提币。

用户专属的钱包与币所的热钱包,不是同一个钱包。

你可以想像成用户专属的钱包就如同存款机一样,你是把一千元存到机器里面。然而,你可以转身到街头的分行,找柜台,再把这一千元提领出来。

风险在哪里呢?

用户可以在存款机存了假钞 1000 万,然后去银行柜台说他要提 1000 万。

在早期很多币所,只有一台 web,连钱包都放在同一台 web 机器上。黑客甚至不需要改代码,只要在 web 机器上调用提款指令,整间币所的钱就被提走了。

你想,这么蠢的事情怎么可能发生呢?嗯,业界还挺多人是这样的设计的…..你在网上看到的那些新闻,嗯….

这些币所的设计很呆,基本上就是一支机器人,定期归集去用户的小钱包,将钱搜集回来,都堆到银行柜台里。然后抢匪只要去银行柜台假装自己要提款,或直接抢钱,就可以把银行抢空了。

这种真实世界不可能发生的情况,却在业界里面很常见。

当然,这样就被搞到破产,实在太好笑了。所以后来大家改了架构设计,变成机器人去搜集用户的钱,然后通通存到冷钱包里面(可以想像成金库),然后从金库里面只拿 1/10 的钱放在柜台里面。

这样就算柜台被打劫一空,顶多也只是损失 1/10 金额而已。

这就是冷热钱包架构设计的简单版本。

关于钱包的进阶设计,我们会在后面其他的章节深入探讨。

Ask, Don’t tell

刚刚我们说到了提款这件事。很大的危险在于 Web 服务与钱包放在一起。

所以这里我们必须引入第一个概念。Web 服务不可以直接直通钱包。目前区块链钱包都是走 RPC。也就是提款的方式,是 web 机器直接对钱包发一个指令通知要提币。

这个方式很有风险。比较好的方式应该是:

  • STEP 1: web 只能跟「提币 Service」请求需要提币,而不是直接「告诉钱包」要提币。只有「提币 Service」可以跟钱包对话,必须「提币 Service」批准提币,才可以将请求上链。
  • STEP 2:提币 Service 要自带风控功能,也就是异常金额提币,必须直接在这层直接被阻断或 delay。
  • STEP 3:提币不可以是请求一次就发送一次。应该至少累积一定次数 50 次,或者是至少 10 分钟- 20 分钟,批量放行。以免黑客或洗钱洗币份子的行为无法被阻挡。
  • STEP 4:黑币钱包地址自动进黑洞。所谓黑币是只有一些资金,是黑客盗币所所得。币所都有联防系统,只要地址被加入黑名单,存款与提款行为,都会自动失效。
  • STEP 5:非热门时段,主动降低提币速度与提高风控层级。我们是亚洲币所,服务时间很集中都会再 +0800 的特定时段。如果有大额提币发生在冷门时段,这些提币应该要被 delay 到上班时间由人工介入处理。避免重大损失。

所以这里的概念,主要是不能「用户告诉你什么,就执行什么」,而是得向「风控系统」「申请通过」,而且利用「批量审核」做出时间差,若有什么差池,有机会挽救。

大额存币控管

前面我们讲到的是提币风险。其实存币也有风险。

几个业界曾经有出现的状况是:

  1. 洗币。用户大额存币并同时大额提币。害交易所背锅。(以前 EOS 就考虑要对经手黑钱的钱包进行冻结制裁,被许多交易所反对。因为如此,锁到的不是黑客,而是交易所的钱会牵连被冻。只经手 1000 EOS,结果 100 万 EOS 钱包被冻,也太倒楣了吧)
  2. 智能合约攻击。有一些 Token 的智能合约没有写好。合约 owner 或甚至路过 user 可以任意增发。充进交易所砸盘换取其他币提现。
  3. 51% 算力攻击。前一阵子行情不好,有心人针对某些币发起 51% 算力攻击,制造大笔假交易,充入币所,再提款。
  4. 币本身的 security 问题,许多币都是 opensource 软件,而且只有少量业馀程序员维护(甚至活跃的维护者数量都比起一般正规币所的程序员少上许多)。bug 一堆,而这些 bug 可能会造成假充值。黑客发现这些 0day 以后,往往没有兴趣攻击一般 user,而是直接攻击交易所。如果交易所的钱包工程师,没有时时更新钱包,很容易被盯上。

好在这一类的情形都有一些特征,就是

  • 针对交易所
  • 单次大额
  • 冷门时段

所以交易所的防御只是辛苦,但不那么复杂。

可以从两个方向去防御:

1) 审核大额存币

大量存币直接 drop / delay,或者是直接打入可疑款项。

以我们站上的情况,除非是经常交易的大户。否则很少人有大量存币的情况。也就是在风控上就要针对用户分层。

如果是不常交易的用户,突然间存进大量币,然后马上就要交易或提款。这绝对非常可疑。关于提款与交易行为要先全部暂停。

2) 加入由资安谘询公司的币所联防联盟

我们公司的资安顾问是慢雾安全。专注于区块链生态。

加入这一类资安公司组织的联防联盟有很多好处。首先是其他币所要是被入侵了。类似的入侵手法,会在脱敏后,告诉参与联盟的会员,所以第一时间这些洞会被补起来。

第二,洗币地址是共享的。联盟内交易所能够整合,第一时间自动防御。

第三,建设一个互联网项目,大家都有一些共用插件(如 TradingView),或者是底层 library ,或者是币本身的 0day。

资安公司会主动跟踪,告知,甚至发布自己的临时 patch。省去自己追踪的精力。

Application as Service

在这一章节里面,我提到的属于区块链行业的示范。其实同样的思路适合互联网上大多数行业。

这里的思路是你的思路整个架构都应该解耦合,不允许一个系统可以 command all。

也就是某些业务模块在逐渐成熟之后,应该单独抽出一个 service,用 API 形式呼叫,并且加上权限校验。

不管是使用者的 App 与系统沟通,或者是内部系统与系统之间的沟通,都应该使用 API + ACL + persmission management。

当然,经营这件事最挑战的事在于。区块链行业是一阵风,在一年内吹起,明明所有竞争者都是初创团队,需要用初创团队的极速打法。但是架构设计上却得用 5-6 年成熟互联网公司的成熟安全架构。否则只要一不留神,币所都不是没生意倒的,而是被黑客黑倒的。

所以虽然业界有万间交易所,但是最后真正能存活下来的交易所并不多。主要这个赛道真是综合能力的考核。如何兼顾币所的业务以及开发速度以及风控上的防御。更别说在人才招聘的速度与品质。这才是区块链从业者的考验。

总结

这里总结一下你现在可以主动做的事:

  1. 立刻加入签约一间资安公司。资安公司不是你出事时才要找。还没出事就得先找好。请他们立刻帮你做体检以及架构调整。
  2. 团队自我检查找出脆弱瓶颈点,改版成独立 service,并加上风控设计
  3. 对自己的项目解耦合。不能预设内部节点的操作都是可信的。而是如果都不可信,怎么样设计出合理的白名单。