使用'魔术数字'保卫课程

时间:2014-03-05 19:58:04

标签: c++ security oop

几个月前,我读了一本关于安全实践的书,并提出了以下方法来保护我们的课程免受覆盖,例如:溢出等:

  • 首先定义一个幻数和一个固定大小的数组(也可以是一个简单的整数)
  • 使用包含幻数的数组,将一个放在顶部,一个放在我们类的底部
  • 一个函数比较这些数字,如果它们相等,并且等于静态变量,该类正常,则返回true,否则它是腐败,并返回false。
  • 将此函数放在每个其他类方法的开头,这样检查函数调用类的有效性
  • 将此数组放在类的开头和结尾非常重要

至少这是我记得的。我正在编写文件encryptor 以用于学习目的,我正在尝试使此代码异常安全。

那么,在哪些情况下它是有用的,什么时候我应该使用这种方法,或者这是完全无用的东西值得信赖?它取决于编译器还是操作系统?

PS:我忘记了这篇文章中提到的那本书的名字,所以我不能再检查一下,如果你们中的任何一个人知道它是哪一个,请告诉我。

2 个答案:

答案 0 :(得分:1)

您所描述的内容听起来像Canary,但在您的程序中,而不是编译器。默认情况下,在使用gcc或g ++时(除了一些其他缓冲区溢出对策),这通常是打开的。

如果你正在对你的班级进行可变操作,并且你想确保你没有副作用,我不知道是否有一个神奇的数字是非常有用的。为什么在有更多可能成功的方法时依靠自制有效性检查呢?

Checksums:我认为散列未加密的文本并将其添加到加密文件的末尾更有用。解密时,删除哈希值并将哈希值(解密文本)与应该的哈希值进行比较。

我认为大多数(如果不是全部)广泛使用的加密器/解密器存储某种校验和以验证数据是否未发生变化。

答案 1 :(得分:1)

这种类型的金丝雀将部分保护您免受特定类型的溢出攻击。每次运行程序时,都可以通过随机化canary值来使其更加健壮。

如果您担心缓冲区溢出攻击(如果您曾经解析用户输入,那么您应该这样做),那么请继续执行此操作。每次检查你的金丝雀的速度可能不会花费太多 。总会有其他方法来攻击您的程序,甚至可能会出现麻烦的缓冲区溢出攻击,但这是一种便宜的措施,因此可能值得添加到您的课程中。