考虑以下应该验证密码的函数:
char *systemkey = ...... ;
int validate(char* key) {
char* k = malloc(16);
char* sk = malloc(16);
strcpy(sk,systemkey);
strcpy(k,key);
return (strncmp(k,sk,16) ==0);
}
如果k
和sk
是连续分配的,因此通过提供 2 个相同的每个 16 字节的 block 很容易破坏该函数。
如果我是编译器/malloc/free/OS 的编写者,有什么方法可以识别大多数这些类型的黑客攻击并阻止它们?
编辑
一种可能的解决方案是在每两个不同的分配之间放置某种金丝雀词。还有别的办法吗?
最佳答案
操作系统所希望使用的最好的结果是 malloc 的实现,它可以随机化它返回的内存。它不能防止溢出,但会使利用它们变得更加困难。对于大型分配,使用的技术是返回与页面末尾对齐的分配,并将下一页显式未映射为保护页面。
你可以读一点on this page以及其中的链接,了解 OpenBSD 如何实现 malloc 保护。据我所知,这是在广泛使用的操作系统中从 malloc 中可以获得的最好结果。
关于C 防止堆溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17470267/