HP-UX 环境中的不安全 C 函数

Unsafe C functions in HP-UX Environment

我们正在使用 C 编程语言开发一个调度程序应用程序。我们正在使用 HP-UX 环境来编译和部署代码。在申请的年度外部审计期间,我们收到了一份报告,其中包含以下数量的意见。

  • 危险函数:strcpy、strlen、strcat等

  • 缓冲区溢出:memcpy

  • 缓冲区溢出格式字符串:sprintf、snprintf 等

  • 格式字符串:printf、sprintf等

  • 他们还给出了一般建议 a€" 包含一些安全功能,即:

  • strncpy_s

  • strnlen_s

  • strncat_s

  • memcpy_s 等..

  • 现在,问题是没有可用于 HP-UX 环境的此类库。以上给定的功能仅在 Windows 环境中受支持。

  • Linux环境中的危险功能是否有任何替代方案?
  • 我们如何减轻缓冲区溢出格式字符串和格式字符串类别?

  • 请参阅您是否使用 TR 24731 的"安全"功能?讨论 _s 函数的缺点。

    当(且仅当)你知道源字符串和目标字符串有多大时,像 strcpy() 这样的函数是安全的。如果你不知道,那你就是在玩火。

    带有 memcpy() 的缓冲区溢出是程序中的彻底错误;如果您不知道大小,或者缓冲区不重叠(memmove() 更安全;它处理重叠),则无法可靠地使用它。有一种说法是"你不需要 strcpy()strcat() 等,因为如果你有足够的数据来安全地使用它们,你可以使用 memmove()memcpy() 代替"。总的来说,strlen() 是相当安全的,只要你给它传递一个字符串。如果你不知道你是否在处理字符串,那么你就会遇到很多问题;您必须知道您正在处理字符串以调用字符串操作函数。

    请注意,strncpy()strncat() 函数是不安全的。 strncpy() 的问题在于,如果源太长,它不会终止字符串。 strncat() 的问题是传递 sizeof(dst) 作为目标的大小是错误的,即使字符串是空的;它具有任何现存的 C 函数中最奇怪、最容易出错的接口之一,a€" gets() 不再被视为现存的。如果你知道所有东西的大小,你就不需要它们。如果您不知道尺寸,使用它们不会让您安全。

    使用 sprintf() 是不必要的危险;只要您获得正确的大小并通过测试返回值来注意数据截断,使用 snprintf() 应该是安全的。检查 asprintf()vasprintf() 是否可用,如果可用,请考虑使用它们。

    格式字符串漏洞出现在你有的地方:

    1
    printf(fmtstr, value1, value2);

    其中 fmtstr 参数可以由用户控制或影响。如果您可以确定格式字符串的来源并知道它是安全的,那么就没有问题,它可以帮助您的代码国际化。如果您不能确定格式字符串是安全的,那么您就有风险。这些风险的严重程度取决于使用它的环境。如果用户 root 将运行代码,这对于调度程序来说似乎很可能,那么您必须一丝不苟。你也许可以再白一点??如果运行代码的用户不是 root,但很难确保没有人以 root 运行代码。

    你说得对,_s 函数在 Windows 上不可用。外部审计人员完全没有帮助,表明使用目标平台上不可用的功能会适得其反。尽管有 Microsoft,但使用 _s 函数是否足够仍有争议。它们可能被滥用,就像任何功能一样。请参阅我对 TR 24731 问题的回答中引用的 N1967 论文。 (后来 C 标准委员会的网站 http://www.open-std.org/jtc1/sc22/wg14/ 有一些论文与 Pre-London 2019 中的 N1967 和 N2336 不完全一致例如邮寄。我不确定我是否完全同意 N2336。)

    考虑 strlcpy()strlcat() 是否可用以及是否可以/应该用于 strcpy()strncpy()strcat()strncat()