每个人都在担心自己的用户名和密码会被暴露给黑客,但为什么现在很多程序员仍然在软件中使用嵌入式凭据?嵌入式凭据,也称为硬编码密码,被写入源代码,可以让程序员在软件开发过程中的工作变得轻松一些。硬编码密码是指源代码中使用明文密码或者其它敏感信息,例如:如账号密码,SSH keys, DevOps 密码等等。它们通常存在于硬件,固件,脚本,应用程序,软件中,用于帮助开发人员快速访问产品,这确实会让编程变得方便一些,尤其是在开发阶段部署新系统的时候。
黑客喜欢嵌入式凭据,会定期从应用程序中寻找它们。近年来,随着世界各地的行业开始使用开源软件,由嵌入式凭据引起的安全问题层出不穷。2016年著名的Uber数据泄露事件中导致了5700万客户的私人信息被泄露,这是由于Uber运行时环境中一部分的开源代码中使用的嵌入式凭据直接导致的。一名Uber员工在源代码中使用了嵌入式凭据,该代码被上传到GitHub后,被黑客获取并借以登陆Uber的AWS账户获取了客户信息。Uber为这一错误付出了巨大的代价,在英国被罚款40万美元,在荷兰被罚款66万美元,而在美国被罚款超过1.48亿美元。这笔巨额费用仅仅是由一个已知的常见编程缺陷引起的,它本该在程序员遵守质量安全规范的要求下可以避免的。
当我们说这是一个已知的常见编程漏洞时,OWASP和CWE(安全领域中的权威机构)都对嵌入式凭据进行了详细描述,并提供如何避免这些漏洞的建议。
在OWASP的2017年十大漏洞中,“敏感数据泄露” [1] 排名第三。它明确指出,在过去的几年中,敏感信息的泄漏已成为一种非常常见的攻击类型,其中最常见的漏洞就是嵌入式凭据。
对于CWE,嵌入式凭据CWE-259 [2] 的使用在CWE前25排名中是第19个。两种最常见的场景如下:
- 软件内部:当管理员账号被嵌入代码中,产品发布后该账号将不能被修改或删除,否则会导致产品无法正常使用
- 软件外部:当前端包含后端所需的嵌入式凭据,该凭据可以通过前端轻易提取
让我们来看看这些代码通常是如何被嵌入凭据的。下面的示例代码是一段测试数据库连接的Java代码,在16行DEBUG环境下设置默认账号“admin”密码“dbtest”进行数据库连接,尽管这段代码只有在DEBUG环境下才生效,但默认的账号信息被嵌入到代码中,通过反编译,很容易就能识别出账号信息
下图是DBConnect.java生成的类文件的反编译结果。不难看出,帐户和密码信息以纯文本形式存储在其常数表的#10和#11项中。
这错在哪里?首先,源代码中使用嵌入式凭据是非常危险的,即使源代码没有被分享,但明文密码最终会写入运行的二进制文件中,黑客和恶意软件可以轻易通过反编译工具获取密码信息。在整个系统中,为了使用方便往往使用同一套密码。鉴于此,一旦黑客破解了密码,就可以连接到所有可能造成更大破坏的相关软件和设备。其次,明文密码一旦写入了发布的软件或设备中,将不能被修改,不利于产品维护,并且破坏了经常更改凭据的黄金法则。第三,从代码编程规范的角度来看,嵌入式凭据的使用将导致代码逻辑和数据信息耦合在一起,违背了用于整合团队和集成工具的统一数据信息管理模型的原则。
作为开发人员,你应该考虑更安全的方法来管理密码以及采取策略来保证遵循这些方法。大多数具有安全意识的开发人员除了手动检查之外应该做得更多。一些自动化工具可以在实现阶段编译代码之前检测嵌入式凭据问题。鉴释的静态代码分析工具爱科识(Xcalscan)可以扫描源代码识别嵌入式凭据漏洞以及凭据未加密漏洞。下图中爱科识(Xcalscan)的扫描结果展示了漏洞产生的完整路径。
引起嵌入凭据漏洞最大的原因是遗忘,开发人员通常会将凭据嵌入代码中为临时使用,但随后忘记删除它们,使用类似爱科识(Xcalscan)工具扫描源码检测可以有效避免因为遗忘而导致的嵌入凭据漏洞.
以下是我对密码管理的一些建议:
- 使用统一密码管理模块,处理密码的编码、校验等等。
- 将密码信息保存在单独文件或数据库中,该文件必须有严格的权限控制,并且不能被存放在公共位置。
- 不要以纯文本形式存储密码,可以使用加密方法(双向算法)或哈希算法(单向算法)。
- 使用专为缺陷和漏洞检测而设计的静态代码分析工具。
最重要的是在编写代码时要有意识的改变编码思维和习惯,你和你的团队成员始终使用“设计安全”的方法。像恶意攻击者一样思考,并问问自己要获得该软件的访问权限,你会怎么做。千万不要将房门钥匙留在门上或大门的垫子下面,以防黑客们能轻易找到!
作者:Qing Zhu,鉴释软件工程师,现主要负责鉴释Java静态代码分析产品的前后端以及CERT-J 规则的研发。
参考资料:
[1]https://owasp.org/www-community/vulnerabilities/Use_of_hard-coded_password
[2]https://cwe.mitre.org/data/definitions/259.html