悟空云课堂丨代码安全第十六期:使用不安全的随机值漏洞

共 1329字,需浏览 3分钟

 ·

2021-05-07 10:16

中科天齐倾情打造《悟空云课堂》旨在科普软件安全相关知识,助力企业有效防范软件安全漏洞,提升网络安全防护能力。本期主题为使用不安全的随机值漏洞的相关介绍。


一、什么是使用不安全的随机值?

软件依赖于不可预测的数值使用了不充分的随机数导致的安全性降低。

产生原因:计算机是一种按照既定算法运行的机器,因此不可能产生真正的随机性。伪随机数生成器 (PRNG) 近似于随机算法,始于一个能计算后续数值的种子。

PRNG包括两种类型:统计学的PRNG和密码学的PRNG。

统计学的PRNG可提供有用的统计资料,但其输出结果很容易预测,因此数据流容易复制。若安全性取决于生成数值的不可预测性,则此类型不适用。密码学的PRNG通过可产生较难预测的输出结果来应对这一问题。为了使加密数值更为安全,必须使攻击者根本无法、或极不可能将它与真实的随机数加以区分。通常情况下,如果并未声明PRNG算法带有加密保护,那么它有可能就是一个统计学的PRNG,不应在对安全性要求较高的环境中使用。

Java API中提供了java.util.Random类实现PRNG(),该PRNG是可移植和可重复的,如果两个java.util.Random类的实例使用相同的种子,会在所有Java实现中生成相同的数值序列。


二、使用不安全的随机值漏洞构成条件有哪些?

满足以下条件,就构成了一个该类型的安全漏洞:

1、使用存在风险的产生随机数方法;

2、使用不可信数据作为种子。


三、使用不安全的随机值漏洞会造成哪些后果?

关键词:旁路保护机制;获得特权或假定身份;其他

可能会导致严重的漏洞如易于猜测的密码、可预测的加密密钥、会话劫持攻击和 DNS 欺骗。


四、使用不安全的随机值漏洞的防范和修补方法有哪些?

1、使用目前被业界专家认为较强的经过良好审核的加密PRNG算法,初始化随机数生成器时使用具有足够长度且不固定的种子。

2、在安全性要求较高的应用中,应使用更安全的随机数生成器,如java.security.SecureRandom类。

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


五、使用不安全的随机值漏洞样例:

DujBeN1CIW.jpg

Wukong软件源代码静态分析工具检测上述程序代码,则可以发现代码中存在着“使用不安全的随机值” 导致的代码缺陷,如下图:

RL5usTAGxH.jpg

使用不安全的随机值在CWE中被编号为CWE-330: Use of Insufficiently Random Values


参读链接:https://www.woocoom.com/b021.html?id=6a5da8091ea141c9bfbf3f5b64b60135

浏览 13
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报