标准C使用getenv和安全做法

时间:2013-02-22 23:08:53

标签: c unix environment-variables getenv

我正在尝试编写在UNIX环境中使用一些ENV变量的C代码。问题是:读取变量(例如getenv())会导致缓冲区溢出吗?此外,如何找到我的平台的env变量大小的限制?例如哪个头文件?

最后,阅读环境提供的变量中最安全的代码实践是什么?

4 个答案:

答案 0 :(得分:6)

使用getenv()读取环境变量不会导致缓冲区溢出。

在Linux上,继承的环境变量及其值在exec()期间由内核存储在进程地址空间中。 getenv()函数只返回指向此现有数据的指针。由于它不复制任何数据,因此没有缓冲区,也没有缓冲区溢出。

如果您尝试将过多的环境变量传递给新流程,exec()将发出E2BIG错误信号。

安全问题

环境变量实际上没有任何缓冲区溢出问题。

安全问题的核心是您不应该信任环境的内容。如果您的程序运行setuid(或setgid等),则环境是攻击向量。用户可以恶意设置PATHLD_PRELOAD或其他变量。

然而,编写setuid程序很少见。这是一件好事,因为有很多理由说明为什么很难使setuid程序安全。

答案 1 :(得分:1)

#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)

这不是Environment变量意味着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

答案 2 :(得分:0)

取决于“阅读”的含义。只是调用getenv不会导致任何问题。但是,如果您尝试将返回的字符串复制到某种缓冲区并且不检查缓冲区的限制,则可能会出现缓冲区溢出。 getenv返回的字符串可能很大,除系统决定分配给环境的可用内存外没有上限。

这与您可能获得的任何其他字符串输入没有什么不同 - 请注意使用strcpysprintf,因为它们不会检查输出缓冲区的大小。

答案 3 :(得分:0)

您必须小心环境,特别是如果您想将其传递给子进程。例如,环境应该只包含每个变量的一个值,但是很容易创建一个包含多个值的值,如果删除第一个并传递结果,则会公开另一个。如果您想要清理儿童的环境,请从头开始创建它,而不是删除您所拥有的值。 David Wheeler在his website有一个Unix / Linux安全编程指南。