【发布时间】:2011-07-19 08:35:35
【问题描述】:
我一直在跟上最新趋势,即测试驱动开发 (TDD)。我所做的大部分开发都是使用 C 或 C++ 进行的。让我感到震惊的是,常见的 TDD 实践和常见的安全编码实践之间存在非常明显的冲突。 TDD 的核心是告诉你,你不应该为没有失败测试的东西编写新代码。对我来说,这意味着我不应该编写安全代码,除非我有单元测试来查看我的代码是否安全。
这带来了两个问题:
如何有效地编写单元测试来测试缓冲区溢出、堆栈溢出、堆溢出、数组索引错误、格式字符串错误、ANSI、Unicode 和 MBCS 字符串大小不匹配、安全字符串处理(来自 Howard 和LeBlanc 的“编写安全代码”)?
在标准 TDD 实践中应该在什么时候包含这些测试,因为大部分安全性都不起作用。
令人惊讶的是,我发现讨论 TDD 和安全性的研究很少。我遇到的大部分是 TDD 论文,它们在非常高的层次上提到 TDD 将“使您的代码更安全”。
我正在寻找上述问题的任何直接答案,任何与此相关的研究(我已经看过但没有找到太多),或者 TDD 大师居住的任何地方,以便我可以去敲他们的门(虚拟),看看他们是否有任何好的答案。
谢谢!
编辑:
Fuzzing 的话题出现了,我认为这是解决这个问题的一个很好的方法(一般来说)。这就提出了一个问题:模糊测试是否适合 TDD?模糊测试在 TDD 流程中的哪些方面适用?
我也想到了参数化单元测试(可能是自动化的)。这可能是一种在测试过程早期获得类似模糊结果的方法。我也不确定它在 TDD 中的确切位置。
编辑 2:
到目前为止,感谢大家的回答。在这一点上,我对如何利用参数化测试作为函数的伪模糊器非常感兴趣。但是,我们如何确定要编写哪些测试来测试安全性?我们如何确保我们充分覆盖了攻击空间?
软件安全中的一个众所周知的问题是,如果您防范 5 种攻击场景,攻击者只会寻找并使用第 6 次攻击。这是一个非常困难的猫捉老鼠游戏。 TDD 对我们有什么好处吗?
【问题讨论】:
-
如果您有足够的决心应用 TDD,那么您也可能有足够的决心应用相对轻量级的形式化方法,其中“测试”可以有效地测试是否存在 1 中列出的一些不需要的行为。您可以用不同的“测试”概念来保持 TDD 哲学。例如。 frama-c.com(披露:我在做这个)
-
我当时没有这个例子,但现在在这里:blog.frama-c.com/index.php?post/2011/04/05/QuickLZ-1 这是一个后验验证的例子。如果您在编码之前,在单元级别以及库级别设计验证策略,我想您将接近 TDD。
标签: security unit-testing testing tdd fuzzing