如何理解加密机制失效类漏洞
据 OWASP 的统计数据,加密机制失效类(Cryptographic Failures)漏洞数量已经上升到第二位。加密机制失效类漏洞之前被称为敏感数据泄类漏洞,但是敏感数据泄只是结果而不是根本原因。应该这么说,由于加密机制失效或者缺少加密机制而导致敏感数据泄露。
加密机制失效是一个统称,有很多情况都可以称为加密机制失效,以下罗列了比较常见的一些:
应该被加密的数据没有进行加密;
在代码中硬编码了密钥或密码;
使用了已经可以被破解或已经被证明有漏洞的加密算法;
使用了比较弱的密钥,可以很容易被猜到;
服务器配置不当或者应用程序 bug 导致的数据泄露。
常见的加密机制失效类漏洞
数据使用前首先要确定是不是敏感数据(包括静态数据、需要存储的数据、要进行网络传输的数据等)
例如密码、银行卡号码、身份证号码和商业秘密等显而易见的敏感数据
各种数据保护法或隐私保护法规定的敏感数据,例如欧盟的通用数据保护条例(GDPR),PCI数据安全标准(PCI DSS)等
需要从以下这些方面检查是否存在加密机制失效漏洞:
数据传输过程中是否是以明文的方式传输的?
程序中是否使用了已经被废弃的加密算法或者不安全的加密算法?是否使用了加密算法的不安全的模式?例如 ECB 模式。
秘钥强度是否足够?同一个秘钥是否用在了多处加密的地方?秘钥管理方法是否安全? 秘钥是否很久没有更换过? 密钥是否硬编码到了代码中?
是否强制要求加密?例如有的接口通过一个参数来控制加不加密
是否验证了证书的合法性?
密码是否明文存储的?
是否使用了被弃用的哈希算法?例如 MD5 或 SHA1。是否是需要使用加密哈希算法时使用了非加密哈希算法?
是否使用了已弃用的加密填充方法?例如 PKCS1。
是否使用了已经被废弃的安全协议?例如web安全传输协议使用了 SSL。
具体示例讲解和对应预防方法
1、提供的接口,密码、身份证号码、银行卡号等敏感数据以明文的方式作为参数提交
对敏感数据进行加密后提交。
2、加密敏感数据使用了 DES 加密算法
DES 算法已经可以被破解,请使用安全的加密算法,例如 AES,注意不要使用 EBC模式,建议使用更安全的 CBC 模式。
3、密钥使用类似 12345678 或者 abcdefgh 等很容易被猜测到的值,或者多处加密使用了相同的密钥,或者密钥直接硬编码在了程序代码或项目的配置文件中
密钥推荐使用强随机数算法生成,不同的加密场景使用独立密钥,密钥推荐保存在 kms 系统中(即密钥管理系统,最好是硬件级别的 kms 系统),即使开发人员在开发过程中也不能接触到密钥明文。
4、接口通过一个参数来控制加不加密
开发中一定要杜绝此类做法,这种做法就是自欺欺人,该加密的情况一定要强制加密。
5、调用 https 协议接口时跳过证书校验
一定要校验证书合法性。
6、密码以明文的方式存储在数据库中,或者用户名密码保存在 cookie 中
密码一定要使用不可逆的散列算法处理后存储在数据库中,严禁直接将用户名密码等敏感数据保存到 cookie 中。
还有很多就不一一列列举了,除了以上示例外,再补充几点:不要使用例如 MD5 或 SHA1 哈希算法;不要使用 PKCS1 填充方法;安全传输协议不要使用 SSL ,尽量使用 TLS 1.2及更高版本。
提几点敏感数据泄露类注意点
上面主要讲的是加密机制失效导致的数据泄露问题及预防方法,下面再提其他几点数据泄露相关的点:
Web前端开发中,敏感数据不要存储在本地,所有存储到 cookie 或者 localStorage 里的数据都要进行加密。
生产环境代码中需要去除任何调试代码或接口,去除为调试做的各种日志输出。
安全地处理失败的身份校验,如使用“用户名或密码错误”来提示失败而不是使用“密码错误”,防止泄露过多信息。
接口 Response Headers 里面禁止包含 Web Server 的信息,接口 Response 禁止返回调试信息、程序异常堆栈信息和注释信息。
敏感信息展示时,如果是展示在web页面上,后端接口返回数据时需要对敏感字段进行脱敏处理。