我正在尝试编写在 UNIX 环境中使用一些 ENV 变量的 C 代码。问题是:读取变量(例如 getenv())会导致缓冲区溢出吗?此外,我怎样才能找到我的平台的 env 变量大小的限制?例如哪个头文件?
最后,阅读环境提供的变量时最安全的代码实践是什么?
我正在尝试编写在 UNIX 环境中使用一些 ENV 变量的 C 代码。问题是:读取变量(例如 getenv())会导致缓冲区溢出吗?此外,我怎样才能找到我的平台的 env 变量大小的限制?例如哪个头文件?
最后,阅读环境提供的变量时最安全的代码实践是什么?
读取环境变量getenv()
不会导致缓冲区溢出。
在 Linux 上,继承的环境变量及其值由内核在exec()
. 该getenv()
函数只返回一个指向此现有数据的指针。由于它不复制任何数据,因此没有缓冲区,也不可能出现缓冲区溢出。
如果您尝试将过多的环境变量传递给新进程,exec()
则会发出E2BIG
错误信号。
环境变量实际上没有任何缓冲区溢出问题。
安全问题集中在您不应该信任环境内容这一事实上。如果您的程序运行 setuid(或 setgid 等),那么环境就是攻击媒介。用户可以恶意设置PATH
或LD_PRELOAD
其他变量。
但是,很少编写 setuid 程序。这是一件好事,因为有很多原因使 setuid 程序难以确保安全。
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *hai;
printf("The current User name is\n");
hai="USER";
printf("%s\n",getenv(hai));
printf("The current User Directory is\n");
char *hai1="PWD";
printf("%s\n",getenv(hai1));
exit(0);
}
该程序正在传递 getenv() 函数的参数,其有效方式是获取输出
Output:
The current User name is
loganaayahee
The current User Directory is
/home/loganaayahee/AdvanceUnix/
(or)
这不是环境变量意味着 getenv() 函数返回 NULL。
hai="HELLO";
if(getenv(hai)==NULL)
printf("This is not Env\n");
else
printf("%s\n",getenv(hai));
Output:
This is Not Env
您必须小心环境,特别是如果您想将其传递给子进程。例如,环境应该为每个变量只包含一个值,但是很容易创建一个包含多个值的环境,如果删除第一个并将结果传递给另一个,则会暴露另一个。如果您想为儿童净化环境,请从头开始创建环境,而不是通过删除现有环境中的值。David Wheeler 在他的网站上有一份 Unix/Linux 安全编程指南。
取决于您所说的“阅读”是什么意思。只是打电话getenv
不会造成任何问题。但是,如果您尝试将返回的字符串复制到某种类型的缓冲区并且您不检查缓冲区的限制,则可能会出现缓冲区溢出。返回的字符串getenv
可能很大,除了系统决定分配给环境的可用内存之外没有上限。
这与您可能获得的任何其他字符串输入没有什么不同——请注意使用它们strcpy
,sprintf
因为它们不会检查您的输出缓冲区的大小。