- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
大家好,我有一个由 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 asgetenv(name)
with the exception that if the program is running SUID or SGID enabled, the result is alwaysNULL
.
所以,问题是:您的程序是否使用设置的 SUID 或 SGID 位运行?作为据我所知, __secure_getenv
已重命名为 secure_getenv
(我的手册页说它出现在 glibc 2.17 中)。您应该使用它。
另一个原因可能是:如果源字符串的长度比 strncpy
的 size
参数长,它不会添加 '\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 mostn
bytes ofsrc
are copied. Warning: If there is no null byte among the firstn
bytes ofsrc
, 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/
我想在我的 cpp 函数中调用 fopen,但是,Rcpp 总是提示“没有匹配的函数来调用‘fopen’”。所以完全复制了 https://github.com/hadley/xml2/blob/93
我想在我的 cpp 函数中调用 fopen,但是,Rcpp 总是提示“没有匹配的函数来调用‘fopen’”。所以完全复制了 https://github.com/hadley/xml2/blob/93
我正在使用本教程 http://papermashup.com/caching-dynamic-php-pages-easily/用于缓存页面 /* Heres where you put your
我在 Wordpress 上工作,我对 PHP 几乎一无所知。我正在尝试让带有帖子摘录的滚动条正常工作,但它使用了 fopen() 但它在我客户的主机上已关闭。 $f = fopen( $url, '
我有一个基本程序,旨在复制 bash 的 cp 命令的功能。我正在为 UNIX 和 Windows 开发一个副本。我的 UNIX 版本运行良好,但是,我发现 Windows 不支持 fopen() 的
在我的网站上,用户填写表格进行注册,然后该信息会添加到数据库中。我也试图将信息写入 CSV 文件。到目前为止我的代码给了我这个错误: 警告:fopen() [function.fopen]:第 122
我正在尝试学习 C。函数 Foo 的目标是接受一个字符串,更改其中的一些字符,然后查看是否存在具有该名称的文件。如果存在这样的文件,则在 STDOUT 上打印它的内容。 听起来很简单而且应该很简单,但
我目前有一些未压缩的代码读取文件,它使用以下方法在C++中读取文件 FILE* id = fopen("myfile.dat", "r"); 获得id后,代码的不同部分使用fread、fseek等访问
My last question作为背景。我试图环绕“fopen()”,但 gcc 给了我这个错误,而“remove()”没有问题。 错误:“fopen”的类型冲突fopen(const char *
好的,所以我正在学习 Docker,并且我正在尝试部署一个带有指向我的服务器的子域(其域是从另一个提供商处购买的)的测试应用程序。服务器已经具有非 dockerized Nginx 设置,可以完美地服
我需要在我的系统 verilog 代码中打开一个文件,我需要知道它对我的相对路径才能使用 $fopen。所以首先,我需要知道我的立场。有没有办法知道我当前的目录路径? (通过使用 $display 或
我的网站被一个脚本小子攻击得非常成功。在自动的基础上,一个隐藏的脚本在我的服务器上被访问,导致我所有的 index.php 文件被修改,并在它们的顶部添加一个 iframe(base 64 编码)。
我尝试通过fopen("serial port path", "+w")打开串口 并通过fileno()获取文件描述符。 之后,我调用了 tcsetattr() 但它生成了一个错误,显示 Inappr
在下面的声明中: $handle = fopen('./readme.txt'); $handle 是什么变量?是 bool 值还是什么? 在运行这两个不同的语句后我有疑问: if($handle)
我是一名 PHP 学习者,我正在处理文件,但我无法在自己的服务器中打开文件,因为出现“权限被拒绝”错误。我正在使用 fopen()功能:fopen('file.txt', 'r+'); 我在 Cent
我需要打开一个文件,替换一些内容(12345 为 77348)并保存。据我所知 $cookie_file_path=$path."/cookies/shipping-cookie".$unique;
我有一个巨大的二进制文件,有 2148181087 字节 (> 2gb) 我正在尝试执行 fopen (file, "r") 但失败了 Can not open: xyz file (Value to
我的桌面上有一个名为 fun 的文本文件,但是当我通过时: FILE* fp; if((fp = fopen("/Users//Desktop/fun", "r")) == NULL) { p
我有一个名为 denem.txt 的文件并且有内容 123456789 123456789 123456789 当我们以“a+b”模式打开文件时,PHP 应该将指针指向文件末尾,这意味着当我尝试使用
我想知道是否有人可以通过 Matlab fopen 命令阐明以下问题: >> [stat myjob] = unix('echo $PBS_NODEFILE'); % gets PBS file na
我是一名优秀的程序员,十分优秀!