大家好,我有一个由 fopen 使用产生的强化问题“路径操作”。根据 fortify 我可以实现一个白名单来修复它,所以有我的白名单验证器:
白名单.c
#define BUFF_WHITE_LIST_FILE 200
const char *white_list_validator( char *variable )
{
FILE *fp = NULL;
ssize_t read;
char * line = NULL;
size_t len = 0;
char white_list_file_buff[BUFF_WHITE_LIST_FILE];
if ( __secure_getenv("WHITE_LIST_FILE") == NULL )
return NULL;
else
{
strncpy(white_list_file_buff,
__secure_getenv("WHITE_LIST_FILE"),sizeof(white_list_file_buff)-1);
fp = fopen(white_list_file_buff,"r");
if ( fp == NULL )
return NULL;
else
{
while( (read = getline(&line, &len, fp)) != -1 )
{
if ( strncmp(line,variable,read - 1) == 0 ){
fclose(fp);
return variable;
}
}
fclose(fp);
}
if(line)
free(line);
}
return NULL;
}
如果在 White.list (*)中找不到变量,则返回 NULL,如果找到,则返回指向 char 的指针
int main( int argc, char **argv ) {
FILE *fp = NULL;
char mrd[50]={0};
const char *ptr = white_list_validator(argv[1]);
if ( argv[1] == NULL )
return -1;
if(ptr==NULL)
return -1;
else
{
strncpy(mrd,ptr,sizeof(mrd)-1);
printf("variables found : %s\n",mrd);
fp = fopen(mrd,"w"); <------ SINK
if ( fp == NULL ){
printf("line 22\n");
exit(1);
}
fprintf(fp, "%s %s %s %d", "We", "are", "in", 2077);
fclose(fp);
}
return 0;
}
但是当我运行 fortify 报告时,在 fopen 中出现了一个操纵路径漏洞,我不知道为什么。您可以在代码中看到,在此之前设法使用 fopen 归档它验证了 white_list_validator。所以有人知道为什么它不能正常工作吗?
注意(*):导出 WHITE_LIST_FILE=/path/White.list
猫白名单
测试1
测试2
某物
当我运行二进制文件时:
./white_list 一些东西
发现变量:某事