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

HP-UX环境中不安全的C函数,c,function,security,hp-ux,C,Function,Security,Hp Ux,我们正在用C语言开发一个调度器应用程序。我们正在使用HP-UX环境编译和部署代码。在对申请进行年度外部审计期间,我们收到了一份报告,其中包含以下观察结果 危险功能:strcpy、strlen、strcat等 缓冲区溢出:memcpy 缓冲区溢出格式字符串:sprintf、snprintf等 格式字符串:printf、sprintf等 它们还提供了一般性建议——包含一些安全功能,即: 斯特恩皮尤 斯特伦 斯特恩卡特 memcpy_等 现在,问题是HP-UX环境中没有这样的库。上述给定函数仅在Win

我们正在用C语言开发一个调度器应用程序。我们正在使用HP-UX环境编译和部署代码。在对申请进行年度外部审计期间,我们收到了一份报告,其中包含以下观察结果

  • 危险功能:strcpy、strlen、strcat等

  • 缓冲区溢出:memcpy

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

  • 格式字符串:printf、sprintf等

  • 它们还提供了一般性建议——包含一些安全功能,即:

  • 斯特恩皮尤

  • 斯特伦

  • 斯特恩卡特

  • memcpy_等

  • 现在,问题是HP-UX环境中没有这样的库。上述给定函数仅在Windows环境中受支持

  • 对于Linux环境中的危险函数,是否有其他选择
  • 我们如何减轻缓冲区溢出格式字符串和格式字符串类别
  • 有关
    功能缺点的讨论,请参阅

    如果(并且仅当)您知道源字符串和目标字符串有多大,则诸如strcpy()之类的函数是安全的。如果你不知道,你在玩火

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

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

    使用
    sprintf()
    是不必要的危险;使用
    snprintf()
    应该是安全的,只要大小正确,并通过测试返回值来注意数据截断。检查是否<代码> AsPrTfF()/<代码>和<代码> VasPrtuff()>代码>,如果它们是,请考虑使用它们。

    在以下情况下会出现格式字符串漏洞:

    printf(fmtstr, value1, value2);
    
    其中,
    fmtstr
    参数可由用户控制或影响。如果您能够确定格式字符串的来源并知道它是安全的,那么就不会有问题,并且它可以帮助代码国际化。如果您无法确定格式字符串是否安全,那么您将面临风险。这些风险的严重程度取决于其使用的环境。如果用户
    root
    将运行代码,这对于调度程序来说很可能,那么您必须非常小心。如果运行代码的用户不是
    root
    ,那么您可能会变得更疯狂一些,但是很难确保没有人以
    root
    的身份运行代码

    您是对的,
    \u s
    功能只有在Windows上才可用。外部审计师完全没有帮助——他们认为使用目标平台上没有的功能会适得其反。尽管微软如此,使用
    \u s
    功能是否足够仍有争论的余地。它们可能被误用,就像任何函数一样。关于TR 24731问题,参见我的报告中引用的N1967论文。(例如,在C标准委员会的网站上,有一些论文并不完全同意2019年伦敦会议之前邮寄的N1967-N2336。我不确定我是否完全同意N2336。)


    考虑是否可用并且可以/应该用于
    strcpy()
    strncpy()
    strcat()
    strncat()
    strncat()

    您可以在以下位置看到这些函数的作用:。您可能可以找到具有适当许可证的免费实现,但它们也非常简单,如果性能不重要,您可以自己编写。对于2,除了“跟踪缓冲区有多大,不要溢出缓冲区”和“不要将不受信任的字符串用作printf格式字符串”之外,您不知道该说什么。他们给出的建议毫无意义。任何人如果向使用MSVC工具链的人推荐那些附件K“安全”功能,而不是专门针对Windows的人,都不应该听。