Получение максимально возможной неинициализированной памяти

Я пытаюсь создать программу на C/С++, которая сбрасывает как можно больше неинициализированной памяти. Программа должна запускаться локальным пользователем, то есть в пользовательском режиме.

Не работает malloc: Почему malloc инициализирует значения до 0 в gcc?

Цель состоит не в том, чтобы использовать эти данные в качестве семени для случайности.

Всегда ли ОС всегда следит за тем, чтобы вы не видели "остатки" от других процессов?

Если возможно, мне нужны ссылки на реализации или дополнительные объяснения.

Ответы

Ответ 1

Наиболее распространенные многопользовательские операционные системы (современные Windows, Linux, другие Unix-варианты, VMS - возможно, все ОС с концепцией виртуальной памяти) пытаются изолировать процессы друг от друга для обеспечения безопасности. Если процесс A может считывать оставшуюся память процесса B, он может получить доступ к пользовательским данным, которых он не должен иметь, поэтому эти операционные системы очистят страницы памяти, прежде чем станут доступными для нового процесса. Вероятно, вам придется иметь повышенные привилегии, чтобы попасть в неинициализированную оперативную память, и решение, вероятно, будет зависеть от той операционной системы, в которой она была.

Встроенные ОС, DOS и древние версии Windows обычно не имеют средств защиты памяти. Но у них также нет понятия виртуальной памяти или сильной изоляции процесса. При этом простое выделение памяти с помощью обычных методов (например, malloc) даст вам неинициализированную память без необходимости делать что-то особенное.

Для получения дополнительной информации о Windows вы можете найти Windows zero page thread, чтобы узнать о потоке ОС, единственным заданием которого является запись нулей на неиспользуемые страницы, чтобы их можно было снова выставить. Кроме того, Windows имеет функцию под названием superfetch, которая заполняет неиспользуемую ОЗУ файлами, которые Windows предсказывает, что вы скоро захотите их открыть. Если вы выделили память, и Windows решила предоставить вам страницу суперзахвата, возникла бы опасность того, что вы увидите содержимое файла, к которому у вас нет доступа к чтению. Это еще одна причина, по которой страницы должны быть очищены, прежде чем они могут быть выделены для процесса.

Ответ 2

У вас есть неинициализированная память. Он содержит неопределенные значения. В вашем случае эти значения равны 0. Ничего неожиданного. Если вы хотите, чтобы псевдослучайные числа использовали PRNG. Если вам нужны реальные случайные числа/энтропия, используйте законный случайный источник, например, устройство случайных чисел операционной системы (например, /dev/urandom) или API.

Ответ 3

Никакая операционная система в своем собственном уме не предоставит неинициализированную память процессу.

Ближайшая вещь, которую вы собираетесь найти, - это стек. Эта память будет инициализирована при сопоставлении с процессом, но большая часть ее будет перезаписана.

Ответ 4

Это здравый смысл. Нам не нужно документировать, что 1 + 1 = 2.

Операционная система, которая утечки секретов между процессами будет бесполезной для многих приложений. Поэтому, если универсальная операционная система, которая хочет быть общей, будет изолировать процессы. Отслеживание того, какие страницы могут содержать секреты и которые безопасны, будет слишком большой работой и слишком подвержен ошибкам, поэтому мы предполагаем, что каждая страница, которая когда-либо использовалась, является грязной и содержит секреты. Инициализация новых страниц с мусором происходит медленнее, чем инициализация их только одним значением, поэтому случайный мусор не используется. Самое полезное значение равно нулю (например, для calloc или bss), поэтому новые страницы обнуляются, чтобы очистить их.

На самом деле нет другого способа сделать это.

Могут быть операционные системы специального назначения, которые этого не делают, и делают утечку секретов между процессами (это может потребоваться, например, для требований в режиме реального времени). В некоторых старых операционных системах не было достойного управления памятью и изоляции привилегий. Кроме того, malloc будет повторно использовать ранее освобожденную память в рамках одного и того же процесса. Поэтому malloc будет документироваться, чтобы содержать неинициализированный мусор. Но это не означает, что вы когда-либо сможете получить неинициализированную память из другого процесса в операционной системе общего назначения.

Я предполагаю, что простое эмпирическое правило: если ваша операционная система когда-либо запрашивает у вас пароль, он не выдаст неинициализированные страницы для процесса, и поскольку обнуление является единственным разумным способом инициализации страниц, они будут обнулены.