我将封面警告不信任的值作为参数,当我将ARGV作为参数传递给test_run()
时,请使用以下代码。它说被污染的变量传递给了污染的水槽,但我不确定如何使argv不受伤害!
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int
main (int argc, char **argv)
{
/* some code */
// char **nstr;
// nstr = malloc(sizeof(char*));
// if(!nstr) {
// return 1;
// }
// int i=0;
// for(i=0;i<argc;i++){
// nstr[i] = strdup(argv[i]);
// }
test_run(argc-1, argv, testf);
}
int test_run(int argc, char **argv, testf_handle testf)
{
if (!argv) {
return 1;
}
/* some code */
testf->prog_name = argv[0];
parse_context(&pc, argc, argv);
/*- - other code - -*/
}
我尝试使用注释的代码并通过ARGV的NSTR进行了尝试,但在行时仍会得到相同的警告:
nstr[i] = strdup(argv[i]);
我不确定在将其作为争论之前,我应该做什么理智。我正在Linux机器上使用GCC编译器。
testf 是结构的实例 test_framework 具有多个成员变量。
谢谢。
您可以通过对其进行检查以确保其符合某些特定规范的情况而不会污染argv
。例如,检查argv下的字符串长度以确保其小于某些上限,以确保其不包含不良字符序列等。
覆盖率将检测您的消毒尝试,一旦您实际对输入进行消毒。
我尚未使用覆盖率,但是使用了其他静态分析工具,它们都彼此相似。
通常,这样的工具很愚蠢。当他们看到污点从源流到沉没的情况下流动时,他们就会提出警告,但他们无法知道数据是否已被消毒。它要求人类审稿人检查警告是真实的还是(太常见)假阳性。
编辑: @caleb声称掩护可以检测数据固定性 - 请参见下面的评论。
该工具假设输入,例如命令行参数(ARGV)是安全风险。第一个问题是在您的应用程序上下文中这是否是正确的假设。如果这是测试代码(看起来可能是),那么假设是错误的,您可以将警告标记为误报。否则,让我们以假设为真的理由继续前进。
现在的掩护是惊慌的,因为这种污点正在发生某些事情,并且认为strdup()可能会发生危险的事情。这里有什么危险?通常,该工具会告诉您这里的风险(示例:缓冲区溢出,由于内存过多而导致的DOS等...)。
我在这里没有看到缓冲溢出风险,但我可能错了。也许警告是由于内存过多而引起的。如果这是问题所在,那么解决方案是编写拒绝不合理大小输入的代码。通常,解决方案是编写解决范围令人恐惧的问题的代码,因此您对输入进行了消毒。
但是,一旦您对解决方案进行编码,掩护可能仍然会给您相同的警告。问题是,尽管您已经对输入进行了消毒,但愚蠢的工具无法检测到。这是人类法规审阅者必须介入并告诉工具解决问题并因此抑制警告的地方。
底线:工具在那里有助于人类代码审阅者,而不是更换一个。如果没有人类安全专家的帮助,请勿尝试以自动化的方式使用它们。(编辑:@caleb建议掩护在修剪假阳性方面做得很好。)