В Linux вы можете перезаписать значение строк среды в стеке.
Таким образом, вы можете скрыть запись, перезаписав ее нулями или чем-то еще:
#include
#include
#include
#include
#include
int main(int argc, char* argv[], char* envp[]) {
char cmd[100];
while (*envp) {
if (strncmp(*envp, "k=", 2) == 0)
memset(*envp, 0, strlen(*envp));
envp++;
}
sprintf(cmd, "cat /proc/%u/environ", getpid());
system(cmd);
return 0;
}
Запуск от имени:
$ env -i a=foo k=v b=bar ./wipe-env | hd
00000000 61 3d 66 6f 6f 00 00 00 00 00 62 3d 62 61 72 00 |a=foo.....b=bar.|
00000010
k = v
был заменен на \ 0 \ 0 \ 0
.
Обратите внимание, что setenv ("k", "", 1)
для перезаписи значения не будет работать, поскольку в этом случае выделяется новая строка "k ="
.
Если вы иным образом не изменили переменную среды k
с помощью setenv ()
/ putenv ()
, то вы также должны иметь возможность что-то делать вот так, чтобы получить адрес строки k = v
в стеке (ну, одной из них):
#include
#include
#include
#include
#include
int main(int argc, char* argv[]) {
char cmd[100];
char *e = getenv("k");
if (e) {
e -= strlen("k=");
memset(e, 0, strlen(e));
}
sprintf(cmd, "cat /proc/%u/environ", getpid());
system(cmd);
return 0;
}
Обратите внимание, однако, что она удаляет только один из ] k = v
записей, полученных в среде. Обычно есть только один, но ничто не мешает кому-либо передать оба k = v1
и k = v2
(или k = v
дважды) в env список передан в execve ()
. Это было причиной уязвимостей системы безопасности в прошлом, таких как CVE-2016-2381 . Это действительно могло произойти с bash
до шеллшока при экспорте и переменной, и функции с одним и тем же именем.
В любом случае всегда будет небольшое окно, в течение которого строка env var еще не была переопределена, поэтому вы можете найти другой способ передать команде секретную информацию (например, канал, например), если его раскрытие через / proc / pid / окружающая среда
вызывает беспокойство.
Также обратите внимание, что в отличие от / proc / pid / cmdline
, / proc / pid / environment
доступны только процессам с тем же euid или root (или root, только если euid и ruid процесса - это не одно и то же, казалось бы).
Вы можете скрыть от них это значение в / proc / pid / environmental
, но они все равно смогут получить любую другую копию, которую вы сделали из строки в памяти, например, прикрепив отладчик к нему.
См. https: //www.kernel.org / doc / Documentation / security / Yama.txt , чтобы узнать о способах предотвратить это по крайней мере для пользователей без полномочий root.