Re[9]: Прямой доступ к любому участку памяти
От: Mr.Cat  
Дата: 06.12.07 17:36
Оценка:
Здравствуйте, Аноним, Вы писали:
А>источник — здравый смысл и соображения о безопасности.
А документальный?
Re[4]: Прямой доступ к любому участку памяти
От: Antban  
Дата: 06.12.07 20:24
Оценка:
Здравствуйте, Mr.Cat, Вы писали:

MC>Здравствуйте, Antban, Вы писали:


MC>Насколько я знаю, NT-винда всегда выделяет процессам только чистые страницы — без чужих данных. Это требование одного из стандартов безопасности, которому она соответствует. Я не уверен (и не вспомню сейчас источник информации), но вроде это так.


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

Даже если NT выделяет чистые страницы, данные от предыдущего процесса могут остаться от неполного перекрытия предыдущих данных, и их может, например, считать злоумышленник, поэтому надо проверить, очистил тот процесс свою память или что-то оставил врагам

А ещё такой вопросец хотел задать: можно ли из драйвера считывать не только данные системных процессов, но и пользовательские заодно прихватить и вообще обойтись без ReadProcessMemory? Т.е. можно ли сразу считать вообще всю память, например, проверяя валидность адресов и пройдя все 4Гб или это плохой метод?
Re[10]: Прямой доступ к любому участку памяти
От: Аноним  
Дата: 06.12.07 20:57
Оценка: 2 (2)
А>>источник — здравый смысл и соображения о безопасности.
MC>А документальный?
скажу по другому — если пользовательский процесс может прочитать память ядра, он вычитает оттуда данные касающиеся авторизации, ключей шифрования NTFS и тп других пользователей. Если бы любой процесс читая свою память мог бы прочитать заодно диапазон памяти ядра — (а она общая для всех процессов, не считая малкнького кусочка связанного с win32k.sys) — это была бы local privileges elevation vulnerability и MS заплатил бы нашедшему ее бабло.
Люди, 9х винды остались в прошлом веке. NT семейство — многопользовательские ОС с жесткими требованиями безопасности стандарта С2 минимум. А вы тут пытаетесь из пользовательского процесса прочитать обычными АПи не требующими спец привилегий kernel-mode часть виртуального адресного пространства адресов.
Re: Прямой доступ к любому участку памяти
От: crash override  
Дата: 07.12.07 01:48
Оценка:
Здравствуйте, Antban, Вы писали:

ИМХО тут такие варианты:

1) Считывание физпамяти перебором по 4К. Не обязательно захватывать физпамять целиком (да и ОС не позволит)

2) Попробуйте перехватывать завершение процесса при помощи PsSetCreateProcessNotifyRoutine
(callback с параметром Create = FALSE) и затем в коллбэке проходить по дереву VAD
(дескрипторы виртуальных адресов, отображенных на процесс).


Кроме того, при написании программ не мешает добавлять зануление участков памяти перед их освобождением.
Re[11]: Прямой доступ к любому участку памяти
От: Mr.Cat  
Дата: 07.12.07 19:22
Оценка:
Здравствуйте, Аноним, Вы писали:
А>скажу по другому <skip> виртуального адресного пространства адресов.
Вы меня не так поняли. Я не Ваши слова под сомнения ставлю, а прошу источник, где можно об этом почитать.
Re[5]: Прямой доступ к любому участку памяти
От: Maxim S. Shatskih Россия  
Дата: 08.12.07 12:46
Оценка: 2 (2)
A>Нужно убедиться, что никаких данных не остаётся после завершения процесса, т.е. что память очищается процессом корректно (наверное речь идёт о явном занулении памяти этим процессом).

А это не дело процесса, а дело кернела.

A>Даже если NT выделяет чистые страницы, данные от предыдущего процесса могут остаться от неполного перекрытия предыдущих данных, и их может, например, считать злоумышленник


Не может. Не бывает там никакого "неполного перекрытия". Когда приватная физ.страница освобождается (на нее становится нуль ссылок), она уходит не в zeroed list, а во free list.

Страницы выделяются либо из zeroed list, либо из free list, но только после полного зануления.

Так что никакого "неполного перекрытия" тут не будет.

Занулять что-то в своей памяти нужно не как защита от утечки в другие процессы, а как защита от присоединения к процессу отладчика или там от userdump.

A>А ещё такой вопросец хотел задать: можно ли из драйвера считывать не только данные системных процессов, но и пользовательские заодно прихватить и вообще обойтись без ReadProcessMemory? Т.е. можно ли сразу считать вообще всю память, например, проверяя валидность адресов и пройдя все 4Гб или это плохой метод?


Сразу замечу, что валидность-невалидность адреса может измениться между проверкой валидности и самим обращением.
Занимайтесь LoveCraftом, а не WarCraftом!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.