提款被风控 互联网资产安全风控实战-第一章:用户的密码一定会被盗
第一章:用户的密码一定会被盗
乍看这个标题,非常耸动。
但是,我却得无奈的说出这件事实。这个情形不但是事实,而且一天到晚在区块链世界里面发生。
区块链行业无异是当今黑客眼中的肥羊。
因为在这个行业,黑客实施攻击的成本与其他行业可能是一样的,但是投资报酬率却可能是最高的。
「用户的密码一定会被盗」,已经是我们做这一行安全架构时,会有的「假设前提」。
状况一:用户密码被撞库
问题是,如果用户的密码一定会被盗,你还能如何防御用户的身家财产安全。
什么是「撞库」?
「撞库」这个词,目前在资安界大家已经非常熟悉了。
这个词的意思是「撞库是黑客通过收集互联网已泄露的用户和密码信息,生成对应的字典表,尝试批量登陆其他网站后,得到一系列可以登录的用户。
很多用户在不同网站使用的是相同的帐号密码,因此黑客可以通过获取用户在A网站的账户从而尝试登录B网址,这就可以理解为撞库攻击。」
每个用户一生一定会用过很多不同互联网服务,然而,因为基于人类的惰性,很多人用的都是同一套密码同样使用在不同的服务中。很少人会针对不同服务,使用不同套密码。更别说自己养成安全意识,使用「」之类的密码管理软件,这通常只有一些高阶用户或者是程序员才会有的习惯。
而负责开发服务的程序员面对「撞库」这个问题的解决方方很单纯,总会脱口而出:「那我们教育用户 管理密码」,或「提醒他们要定时换密码」不就得了。
这其实是一个过于单纯的思维。
用户非常懒,不见得想要换密码。许多用户非技术背景出身,不可能教育他们使用相对较于复杂的软件。你不可能通知到系统里面所有人。你更不可能「即时」通知到所有人。
所以身为防御方,在设计架构时,你得换个思维:不是防止黑客开第一道锁。而是让黑客意识到只破第一道锁是图劳而功的,要取得真正有价值的信息,得过至少三道锁。
防护手段一:二步验证
二步验证是现在互联网服务里面,正规军必备的一道验证。
我们可以这么比喻,密码很像是印章,拿到密码就如同印章一样。但是真正取钱,你还是得让用户签名。
这个签名,就是所谓的二步验证。
二步验证有几种方式,常见的有:
手机号码简讯验证 演算法的二步验证
这个方式,是确保「用户背后为本人」的一个常规手段。
不过,这个方法只适用于一般不敏感的互联网服务。
如果你经营的是区块链交易所的话,建议还是不能单纯只用「手机号码短信验证」验证。因为这种方法有一些其他的风险性在:
当然你会问,那换 演算法就会比较安全吗?
其实也未必。我曾经听过交易所界一些很普遍被打进去的案例:
交易所的数据库被从网站上开后门,黑客改不了数据,但能读数据。而这些交易所关于 演算法的二步验证的用户种子,是明码写在数据库里面的, 演算法是公开的,所以黑客一样可以算出真正的通行密码。有加密等于没有加密。
防护手段二:IP 阻挡与第三方验证
这就让我们引到了下一个手段,三步确认用户行为。
使用者的密码虽然是有可能撞库被泄漏。
但是还是有办法去放缓黑客的攻击的。
1. IP 验证与尝试次数
黑客用的多半是跳板 IP。所以 IP 要不是从奇怪的小国过来,就是会与用户平常惯用的 IP 非常不同。
作为系统防御者,你可以设置不同 IP 尝试错误次数超过3-5次,就自动发短信警告用户。黑客就算尝试登入成功,因为来源 IP 网段不同,还是要通知用户有不同 IP 灯入。
再来,你还可以加入一道降速手段。密码正确之后,还要加入一道图形验证码,防止用户被程序自动攻破。
而如果用户真的被成功登入,进行关键敏感操作(如提现或提币),必须在系统设计上间隔 2-5 分钟以上才能操作。
并且提币这个动作要有第三道确认(如邮件确认)。
这是为了争取让有些用户,有时间差可以反应阻挡攻击。
2. 第二道密码以及通知用户确认
业见比较有名的例子是:支付宝在设计上,有分登入密码,与取款密码。
这也是防止用户因为一道密码与设备被连环攻破,会带来的连环损失。
在币所的实务上,在取款最终步时,在用户最后的取款流程,我们也会加上 email 确认,确保用户是经过至少四道以上的确认是本人,才能进行金额上的操作。
3. IP 切换, 立即作废,自动强制登出使用者
除了盗取用户的密码外,有的服务,是用来钓鱼使用者的 的。
这有一些手段你可以主动用来防御:
确保这些 即使被偷了,也不一定有用。
状况二:用户 API Token 被窃取
有一些服务,系统是提供 API 操作的。比如说有些币所支持量化交易,用户可以用 Token 就可以操作交易以及提币。
与 外泄的情况一样,你也要假设用户的 Token 一定会外泄(因为该用户可能使用同一把 Token 放在不同的交易软件上)。
这有几件事你可以做:
1.一个 Token 不能同时有多个权限。
比如说得将权限分开:交易一把 Token,提币一把 Token,查询馀额一把 Token。
这样可以避免用户使用「看盘软件」放 Token 时,就把自己帐号交出去。
早期像 的 API token 就是没有分权限的。iOS 上的查询馀额软件会要求你给 Token。
你如何知道这些馀额软件会不会作恶?你不能知道。也不能禁止用户交 Token 给它们。
但你能做的,就是帮用户先把一层关。
2.风控行为
量化交易操作,多数是小额进出。少有大额交易发生。有一些交易是这样的,黑客黑进帐号后,不是将币提走,而是换个交易对,砸盘套利,再到其他交易对大幅拉盘,让其他帐号获利然后转帐提款。
API 的操作往往都是有固定行为的。如果该操作不是「正常行为」,系统的风控应该要自动拦下。
当然,为了不干扰正常用户。可以主动让用户分层。比如说 LV1 的用户的交易,每天交易额是多少。LV5 的用户的交易,每天交易额是多少。
而 LV 的设计,可以是保证金,可以是使用天数,可以是经过考试。让 LV 越高的用户,通常也有越强的自我保护意识。
3.API 风控
API 端点也是容易被 DDoS 与身份盗窃的重灾区。
所以 API 在设计上应该要设计 rate limit,与请用户设计 IP 白名单。而不是任意的 IP 就能存取。这样才能保证是用户授权的客户端操作。
防御性思考:用户资料的价值性在哪里?
每个互联网服务储存的用户价值性都不同。
有的互联网用户资料有价值的部分只有「密码」,有的是「个资」。
交易所之所以是黑客眼中的肥羊,是因为交易所有里面用户的「个资」与「资产」。
黑客会向交易所攻击的部分:
所以当在施行防护措施时,开发者得去思考,一个用户在站上的价值资料在哪里。
如何让真的「本人用户」能存取到,而只有「密码」却什么都存取不到。或者是虽然拿到「Token」了,能操作的权限却非常有限。
我认为这是开发者最先要去思考的第一个课题。
如果「使用者的身份识别」一定被偷走,那么你要如何让损失降到最低?
或者是退而求其次,若是用户帐户被盗。站方与被盗用户,都还有时间差能够有机会阻挡攻击。
主动切断攻击
上面我们谈的都是被动式攻击。
但事实上,我们做的可以不只有被动,而是可以主动设计防御措施。
因为目前黑客多半不是手工作业。而都是自动作业。而且是非常精密的全自动作业。
通常黑客的攻击手法是分几阶段的:
利用自动攻击工具,锁定漏洞多的互联网服务,并且自动夺取服务器控制权锁定目标后,由黑客亲自出马,绕过系统特定设计,实际夺取特定帐户的存取权限
这方面粗步的阻挡有几种方式:
采购 Web 。WAF 防火墙与一般防火墙的不同在于:这些用来攻击服务的自动攻击工具,都是有 的,会专注在于 XSS、SQL 、 。WAF 能够识别这些攻击特征与 IP 频率,主动阻拦尝试。有一些 WAF 做的比较细致的,还可以整合网站应用。当发现有用户被盗帐号,频繁登入,可以直接锁住帐号。或者这些 WAF,甚至可以发现服务使用的第三方库有 patch,直接通知开发者升级补丁。网站 IP 白名单。发起攻击的国家跳板 IP 固定是某些国家,比如说是俄罗斯。如果你很确定你没有想要服务来自俄罗斯的用户,直接从防火墙上面干掉这些 IP 是最一劳永逸的事。在服务器前添加一层负载平衡器。提供服务的机器永远不要直接面临外网,而是透过负载平衡器切换流量,避免直接被攻击的可能性。租用 CDN。现在的 CDN 通常也有防止恶意攻击的侦测,可以主动阻断一些可疑的流量。让用户自己设定白名单。不在白名单的存取一律过滤掉。在设计上教育用户
就如同现在在提款机上的警语,警方往往会在提款机上面贴上标签,若要用户大额转帐,请小心是骗子。
你也可以在提款介面,API Token 申请介面,Email 邮件,等等这些「接触点」。
进行用户的再教育。提醒用户可能会出现的情形,避免用户被一系列的诱导,交出自己手上的钥匙。
总结
这里总结一下你现在可以主动做的事:
采购 WAF,阻绝第一层试探性的攻击列出一份站上用户的「有效资源清单」,如何让非本人盗号者,第一时间拿不到这些信息。用户动用敏感信息,你会用至少哪三个手段,确认真的是本人。
如何鉴定使用者不是本人?如何发现之后能够有效切断访问?这一些敏感操作的「常见行为」是如何?「不可能发生的行为」是如何?如何自动切断不可能发生的行为?让用户也有白名单意识