gpt4 book ai didi

c - 编写安全 C 和安全 C 习语

转载 作者:太空狗 更新时间:2023-10-29 16:20:08 26 4
gpt4 key购买 nike

"The average man does not want to be free. He simply wants to be safe." - H. L. Menken

我正在尝试编写非常安全的 C。下面我列出了我使用的一些技术,并询问它们是否像我认为的那样安全。请毫不犹豫地将我的代码/先入之见撕成碎片。任何能找到最微不足道的漏洞或教会我新想法的答案都将高度重视

从流中读取:

根据 GNU C Programming Tutorial getline:

The getline function will automatically enlarge the block of memory as needed, via the realloc function, so there is never a shortage of space -- one reason why getline is so safe. [..] Notice that getline can safely handle your line of input, no matter how long it is.

我假设 getline 应该在所有输入下,防止在从流读取时发生 buffer overflow

  • 我的假设正确吗?是否存在可能导致漏洞利用的输入和/或分配方案?例如,如果流中的第一个字符是某个 bizarre control character ,可能是 0x08 BACKSPACE (ctl-H)。
  • 是否已完成任何工作来从数学上证明 getline 是安全的?

Malloc 在失败时返回 Null:

如果 malloc 遇到错误,malloc 返回 NULL 指针。这存在安全风险,因为仍然可以将指针算法应用于 NULL (0x0) 指针,因此维基百科 recommends

/* Allocate space for an array with ten elements of type int. */
int *ptr = (int*)malloc(10 * sizeof (int));
if (ptr == NULL) {
/* Memory could not be allocated, the program should handle
the error here as appropriate. */
}

安全 sscanf:

在使用 sscanf 时,我养成了将要提取的字符串的大小分配给输入字符串的大小的习惯,希望能避免超限的可能性。例如:

const char *inputStr = "a01234b4567c";
const char *formatStr = "a%[0-9]b%[0-9]c":
char *str1[strlen(inputStr)];
char *str2[strlen(inputStr)];

sscanf(inputStr, formatStr, str1, str2);

因为 str1 和 str2 是 inputStr 的大小,并且不能从 inputStr 读取超过 strlen(inputStr) 的字符,这似乎是不可能的,给定 inputStr 的所有可能值 导致缓冲区溢出?

  • 我说得对吗?有没有我没有想到的奇怪的极端情况?
  • 有没有更好的写法?图书馆已经解决了吗?

一般问题:

虽然我已经发布了大量问题,但我并不期望任何人都能回答所有问题。这些问题更像是我正在寻找的各种答案的指南。我真的很想学习安全的 C 思维方式。

  • 还有哪些安全的 C 习语?
  • 我需要经常检查哪些特殊情况?
  • 如何编写单元测试来执行这些规则?
  • 我如何以可测试性或可证明正确的方式实现约束?<​​/li>
  • 有什么推荐的 C 静态/动态分析技术或工具吗?
  • 您遵循哪些安全的 C 实践,您如何向自己和他人证明它们的合理性?

资源:

很多资源都是从答案中借用的。

最佳答案

我认为您的 sscanf 示例是错误的。以这种方式使用时它仍然会溢出。

试试这个,它指定要读取的最大字节数:

void main(int argc, char **argv)
{
char buf[256];
sscanf(argv[0], "%255s", &buf);
}

Take a look at this IBM dev article about protecting against buffer overflows.

在测试方面,我会编写一个程序来生成随机长度的随机字符串并将它们提供给您的程序,并确保它们得到适当的处理。

关于c - 编写安全 C 和安全 C 习语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2008173/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com