Использование стандартного C getenv и безопасных методов

Я пытаюсь написать код C, который использует некоторые переменные ENV в среде UNIX. Возникает вопрос: могли ли чтение переменных (например, getenv ()) вызвать переполнение буфера? Более того, как я могу найти предел размера переменной env для моей платформы? Например, какой файл заголовка?

Наконец, каковы наиболее безопасные методы кода в среде, в которую входят переменные чтения?

Чтение переменной окружения с помощью getenv() не приведет к переполнению буфера.

В Linux унаследованные переменные среды и их значения хранятся в адресном пространстве процесса kernelм во время exec() . Функция getenv() просто возвращает указатель на эти существующие данные. Поскольку он не копирует никаких данных, буфер не существует, и переполнение буфера не может быть.

Если вы попытаетесь передать слишком много переменных окружения в новый процесс, exec() будет сигнализировать об ошибке E2BIG .

Проблемы безопасности

На самом деле нет проблем с переполнением буфера с переменными окружения.

Опасность связана с тем, что вы не должны доверять содержимому среды. Если ваша программа запущена setuid (или setgid и т. Д.), То среда является вектором атаки. Пользователь может установить PATH или LD_PRELOAD или другие переменные вредоносными способами.

Тем не менее, редко можно писать программы setuid. Это хорошо, поскольку существует так много причин, по которым сложно сделать программы setuid безопасными.

  #include #include 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)); } 

Выход: это не Env

Зависит от того, что вы подразумеваете под «чтением». Просто вызов getenv не вызовет никаких проблем. Однако, если вы попытаетесь скопировать возвращенную строку в какой-либо буфер, и вы не проверяете предел буфера, вы можете получить переполнение буфера. Строка, возвращаемая getenv может быть большой, без верхней границы, кроме доступной памяти, которую ваша система решает выделить в среду.

Это ничем не отличается от любого другого ввода строки, который вы можете получить – остерегайтесь использования strcpy и sprintf поскольку они не проверяют размер вашего выходного буфера.

Вы должны быть осторожны с окружающей средой, особенно если вы хотите передать ее дочерним процессам. Например, среда должна содержать только одно значение для каждой переменной, но ее легко создать, содержащую несколько, если вы удалите первый и передаете результат, будет открыт другой. Если вы хотите дезинфицировать среду для детей, создайте ее с нуля, а не удалите значения из того, что у вас есть. Дэвид Уилер имеет руководство по безопасному программированию в Unix / Linux на своем веб-сайте .