不安全的随机数 – 作者:凯信特安全团队

代码审计(Code audit)是一种以发现程序错误,安全漏洞和违反程序规范为目标的源代码分析。软件代码审计是对编程项目中源代码的全面分析,旨在发现错误,安全漏洞或违反编程约定。 它是防御性编程范例的一个组成部分,它试图在软件发布之前减少错误。

1.漏洞描述

随机数在计算机应用中使用的比较广泛,最为熟知的便是在密码学中的应用。随机数分为真随机数和伪随机数,我们程序使用的基本都是伪随机数。伪随机又分为强伪随机数和弱伪随机数。伪随机数,通过一定算法和种子得出。软件实现的是伪随机数。强伪随机数,难以预测的随机数。弱伪随机数,易于预测的随机数。

Java程序中,使用java.util.Random获得随机数,这种随机数源于伪随机数生成器,产生的随机数容易被预测,对于安全性要求较高的环境中,使用这种随机数可能会降低系统安全性,使攻击者有机可乘。

随机数应用场景:验证码生成、抽奖活动、UUID生成、SessionID生成、Token生成、CSRF Token、找回密码Token、游戏(随机元素的生成)、洗牌、俄罗斯方块出现特定形状的序列、游戏爆装备、密码应用场景、生成密钥:对称密码,消息认证、生成密钥对:公钥密码,数字签名、生成IV: 用于分组密码的CBC,CFB和OFB模式、生成nonce: 用于防御重放攻击; 分组密码的CTR模式、生成盐:用于基于口令的密码PBE等。本文主要针对验证码生成部分的随机数进行审计。

2.漏洞成因

生成图片验证码时使用java.util.Random函数。

3.漏洞验证

使用fortify对源程序进行扫描,扫描结束后可在fortify界面最左侧的问题面板中找到“Insecure Randomness”字符,即不安全的随机数:

图片.png对问题列表中列出的文件进行源代码分析查看,发现在生成图片验证码时,使用的是Random函数产生随机数:

图片.png图片.png4.修复建议

Fortify给出的修复建议是使用较强的随机数产生函数java.security.SecureRandom。

Java 语言在java.security.SecureRandom中提供了一个加密PRNG。就像java.security中其它以算法为基础的类那样,SecureRandom提供了与某个特定算法集合相关的包,该包可以独立实现。当使用SecureRandom.getInstance() 请求一个SecureRandom实例时,您可以申请实现某个特定的算法。如果算法可行,那么您可以将它作为SecureRandom的对象使用。如果算法不可行,或者您没有为算法明确特定的实现方法,那么会由系统为您选择SecureRandom的实现方法。 

Sun在名为SHA1PRNG的Java版本中提供了一种单独实现SecureRandom的方式,Sun 将其描述为计算:

“SHA-1 可以计算一个真实的随机种子参数的散列值,同时,该种子参数带有一个 64 比特的计算器,会在每一次操作后加 1。在 160 比特的 SHA-1 输出中,只能使用 64 比特的输出。” 

然而,文档中有关 Sun 的 SHA1PRNG 算法实现细节的相关记录很少,人们无法了解算法实现中使用的熵的来源,因此也并不清楚输出中到底存在多少真实的随机数值。尽管有关 Sun 的实现方法网络上有各种各样的猜测,但是有一点无庸置疑,即算法具有很强的加密性,可以在对安全性极为敏感的各种内容中安全地使用。

本文中该漏洞修复示例:

修改Random函数为SecureRandom函数:

图片.png保存后使用Fortify重新对源码进行扫描:

图片.png发现原来存在不安全随机数的imageCode文件不在问题列表中,并且该漏洞的数量由22减少为11,说明随机数已加强,不存在该漏洞。

来源:freebuf.com 2019-07-29 15:31:01 by: 凯信特安全团队

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论