Свободное пространство не освобождено после усечения fd

В 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.

2
15.08.2016, 12:04
0 ответов

Теги

Похожие вопросы