Здравствуйте, Mr.Cat, Вы писали:
MC>Здравствуйте, Antban, Вы писали:
MC>Насколько я знаю, NT-винда всегда выделяет процессам только чистые страницы — без чужих данных. Это требование одного из стандартов безопасности, которому она соответствует. Я не уверен (и не вспомню сейчас источник информации), но вроде это так.
Нужно убедиться, что никаких данных не остаётся после завершения процесса, т.е. что память очищается процессом корректно (наверное речь идёт о явном занулении памяти этим процессом). Также возможна ситуация когда зануление будет выполнено во время работы тестируемого процесса, и нужно его проверить во время работы (именно на эту ситуацию и ориентируюсь). Процесс может быть как пользовательским, так и системным, поэтому без драйвера думаю не получится, ломаю голову над ним... Конкретной программы нет, одно из требований — универсальность. Поэтому нужно и на системные процессы расчитывать.
Даже если NT выделяет чистые страницы, данные от предыдущего процесса могут остаться от неполного перекрытия предыдущих данных, и их может, например, считать злоумышленник, поэтому надо проверить, очистил тот процесс свою память или что-то оставил врагам
А ещё такой вопросец хотел задать: можно ли из драйвера считывать не только данные системных процессов, но и пользовательские заодно прихватить и вообще обойтись без ReadProcessMemory? Т.е. можно ли сразу считать вообще всю память, например, проверяя валидность адресов и пройдя все 4Гб или это плохой метод?
А>>источник — здравый смысл и соображения о безопасности. MC>А документальный?
скажу по другому — если пользовательский процесс может прочитать память ядра, он вычитает оттуда данные касающиеся авторизации, ключей шифрования NTFS и тп других пользователей. Если бы любой процесс читая свою память мог бы прочитать заодно диапазон памяти ядра — (а она общая для всех процессов, не считая малкнького кусочка связанного с win32k.sys) — это была бы local privileges elevation vulnerability и MS заплатил бы нашедшему ее бабло.
Люди, 9х винды остались в прошлом веке. NT семейство — многопользовательские ОС с жесткими требованиями безопасности стандарта С2 минимум. А вы тут пытаетесь из пользовательского процесса прочитать обычными АПи не требующими спец привилегий kernel-mode часть виртуального адресного пространства адресов.
1) Считывание физпамяти перебором по 4К. Не обязательно захватывать физпамять целиком (да и ОС не позволит)
2) Попробуйте перехватывать завершение процесса при помощи PsSetCreateProcessNotifyRoutine
(callback с параметром Create = FALSE) и затем в коллбэке проходить по дереву VAD
(дескрипторы виртуальных адресов, отображенных на процесс).
Кроме того, при написании программ не мешает добавлять зануление участков памяти перед их освобождением.
Здравствуйте, Аноним, Вы писали: А>скажу по другому <skip> виртуального адресного пространства адресов.
Вы меня не так поняли. Я не Ваши слова под сомнения ставлю, а прошу источник, где можно об этом почитать.
A>Нужно убедиться, что никаких данных не остаётся после завершения процесса, т.е. что память очищается процессом корректно (наверное речь идёт о явном занулении памяти этим процессом).
А это не дело процесса, а дело кернела.
A>Даже если NT выделяет чистые страницы, данные от предыдущего процесса могут остаться от неполного перекрытия предыдущих данных, и их может, например, считать злоумышленник
Не может. Не бывает там никакого "неполного перекрытия". Когда приватная физ.страница освобождается (на нее становится нуль ссылок), она уходит не в zeroed list, а во free list.
Страницы выделяются либо из zeroed list, либо из free list, но только после полного зануления.
Так что никакого "неполного перекрытия" тут не будет.
Занулять что-то в своей памяти нужно не как защита от утечки в другие процессы, а как защита от присоединения к процессу отладчика или там от userdump.
A>А ещё такой вопросец хотел задать: можно ли из драйвера считывать не только данные системных процессов, но и пользовательские заодно прихватить и вообще обойтись без ReadProcessMemory? Т.е. можно ли сразу считать вообще всю память, например, проверяя валидность адресов и пройдя все 4Гб или это плохой метод?
Сразу замечу, что валидность-невалидность адреса может измениться между проверкой валидности и самим обращением.