gpt4 book ai didi

c - 强化 : Path Manipulation in C - White List Implementation doesn't work - fopen issue

转载 作者:行者123 更新时间:2023-11-30 18:28:18 26 4
gpt4 key购买 nike

大家好,我有一个由 fopen 使用产生的强化问题“路径操作”。根据 fortify,我可以实现一个白名单来修复它,所以有我的白名单验证器:

white_list.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 某些内容

发现变量:某事

最佳答案

快速搜索 __secure_getenv 会导致此页面:

https://refspecs.linuxfoundation.org/LSB_1.1.0/gLSB/baselib---secure-getenv-1.html

引用:

__secure_getenv(name) has the same specification as getenv(name) with the exception that if the program is running SUID or SGID enabled, the result is always NULL.

所以,问题是:您的程序是否使用设置的 SUID 或 SGID 位运行?作为据我所知, __secure_getenv 已重命名为 secure_getenv (我的手册页说它出现在 glibc 2.17 中)。您应该使用它。

另一个原因可能是:如果源字符串的长度比 strncpysize 参数长,它不会添加 '\0' 终止字节。使用 strncpy 时,您应该始终确保写入 '\0' 终止字节。

man strcpy

#include <string.h>
char *strncpy(char *dest, const char *src, size_t n);

The strncpy() function is similar, except that at most n bytes of src are copied. Warning: If there is no null byte among the first n bytes of src, the string placed in dest will not be null-terminated.

white_list_file_buff 可能不是 '\0' 终止的,因此 fopen 失败。但你说你确实导出了WHITE_LIST_FILE=/path/White.list。是/path/White.list 您使用的实际值或某个长于的路径200 个字符?

这里还有你的代码

while( (read = getline(&line, &len, fp)) != -1 )
{
else if ( strncmp(line,variable,read - 1) == 0 ){
fclose(fp);
return variable;
}

}

要么是错误的,要么是您忘记粘贴整个代码?没有前面的 if 表示 else

假设您犯了复制粘贴错误,那么格式如何白名单?每行只包含变量名称?你的strncmp 比较你知道的整行,如果你只想匹配一个子字符串,您应该使用 strstr

关于c - 强化 : Path Manipulation in C - White List Implementation doesn't work - fopen issue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48196251/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com