HP-UX环境中不安全的C函数
我们正在用C语言开发一个调度器应用程序。我们正在使用HP-UX环境编译和部署代码。在对申请进行年度外部审计期间,我们收到了一份报告,其中包含以下观察结果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
功能缺点的讨论,请参阅
如果(并且仅当)您知道源字符串和目标字符串有多大,则诸如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的人,都不应该听。