在处理大型软件项目时,我经常使用模糊测试作为测试用例的一部分,以帮助排除可能仅在输入达到一定大小或形状时出现的错误。我最常做的就是使用与我碰巧使用的编程语言捆绑在一起的标准随机数设施。
最近我开始想知道,忽略一般模糊测试的优点或缺点,在进行模糊测试时是否使用非加密安全伪随机数生成器是个好主意。弱随机数生成器通常表现出将它们与真随机序列区分开的模式,即使这些模式不是很明显。似乎使用弱PRNG的模糊测试可能总是无法触发某些潜在的错误,这些错误仅在某些情况下出现,因为伪随机数可能以永远不会触发这些情况的方式相互关联。
使用弱PRNG进行模糊测试本质上是不明智的吗?如果这样做在理论上是不合理的,那么它在实践中是否仍然合理?
答案 0 :(得分:6)
你混淆了两个截然不同的“弱点”:
答案 1 :(得分:4)
我认为这不重要,但我无法证明。
模糊测试只会尝试一些输入,在大多数情况下只有极小比例的可能性。无论您使用的RNG有多好,它都可能会或者可能找不到其中一个破坏您的代码的输入,具体取决于所有可能输入的比例会破坏您的代码。除非PRNG中的模式非常简单,否则我认为它不太可能以任何方式与您正在寻找的“坏”输入中的模式相对应,因此它不会比真正随机的更多也不会更低。
事实上,如果您知道如何挑选RNG以最大限度地发现输入错误的概率,您可以使用这些知识来帮助更直接地找到错误...
我认为你不应该使用真的坏的PRNG。例如,rand
允许表现出非常简单的模式,例如LSB交替。如果您的代码在内部使用PRNG,您可能希望避免在测试中以类似的方式使用相同的PRNG,只是为了确保您不会意外地仅测试输入数据与内部生成的数字流匹配的情况!当然,风险很小,因为你希望他们会使用不同的种子,但仍然如此。
在给定语言中找到加密或至少是安全的哈希库通常并不难。 SHA-1无处不在,易于使用来生成流,或者说RC4无法自行实现。两者都提供了相当不错的PRNG,如果不如Blum Blum Shub那么安全。我认为主要关注的是速度 - 例如,如果Mersenne Twister能够以10倍的速度生成模糊测试用例,并且测试中的代码相当快,那么它可能更有可能在给定的情况下找到错误的输入无论给出624个输出的事实,你都可以推断出RNG的完整状态......
答案 2 :(得分:2)
您不需要不可预测的源(这正是加密安全的生成器),您只需要具有良好统计属性的源。
因此使用通用生成器就足够了 - 它速度快且通常可重现(这意味着问题也可以重现)。