代码安全 | 第十六期:使用不安全的随机值漏洞

本期主题为使用不安全的随机值的相关介绍。

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

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

产生原因:计算机是一种按照既定算法运行的机器,因此不可能产生真正的随机性。伪随机数生成器 (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 的实现方法。

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

 

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

 

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

posted @ 2021-05-25 17:06  中科天齐软件原生安全  阅读(733)  评论(0编辑  收藏  举报