Можно ли создать ключ реестра, который будет виден в Windows как часть активного (подключенного) реестра, но не будет виден программам, работающим с неактивным (отключенным) реестром? Оказывается, если у вас есть возможность изменить только одну переменную ядра (например, с помощью драйвера), то да, способ есть.
Почему это необходимо?
Скрытие ключей реестра от программ, работающих с неактивным реестром, при сохранении возможности нормально работать с этими ключами стандартными средствами операционной системы Windows (в составе активного реестра) можно использовать для достижения двух целей:- сокрытие изменений, внесенных в реестр, от криминалистических исследований (например, сокрытие ключей определенного сервиса, которые будут корректно читаться и использоваться операционной системой Windows в процессе загрузки, но не будут видны работающим сторонним программам) при неактивном реестре во время проверки диска);
- скрытие изменений, внесенных в реестр, от предзагрузочного контроля целостности (например, внесение изменений в ключи реестра, которые не будут видны доверенным загрузочным модулям во время контроля целостности, но будут видны самой операционной системе Windows).
Как это произошло?
Реестр Windows состоит из двух частей: энергозависимая часть (ключи реестра и значения, которые будут потеряны после отключения куста из-за того, что они не сохраняются в файл; пример: ключ «CurrentControlSet» раздела СИСТЕМА).куст), энергонезависимая часть (синхронизированная с файлом куста реестра).
Поскольку целостность сохраняемых данных должна быть обеспечена при записи энергонезависимой части в файл куста (например, в случае сбоя питания, прерывающего операции записи данных), ядро Windows использует журналирование реестра — данные записанное сначала сохраняется в файл журнала (этот файл находится в том же каталоге, что и основной файл, и имеет расширение «.
LOG», «.
LOG1» или «.
LOG2») и только затем в основной файл куста ( если запись в файл журнала не завершена успешно, то основной файл останется нетронутым и нетронутым, а если запись в основной файл не завершится успешно, его целостность можно восстановить с помощью данных журнала, которые были успешно записаны до сбоя) .
Предлагаемый способ скрыть ключи (и их значения, а также другие элементы) — сохранить соответствующие данные только в журнале, а не в основном файле куста реестра.
Сторонние программы, работающие с неактивным реестром, в подавляющем большинстве игнорируют файлы журнала, и поэтому ключи реестра, хранящиеся в журнале, но не в основном файле, будут невидимы для этих программ.
Ядро Windows же использует журнал для восстановления целостности куста при его монтировании, и поэтому обсуждаемые ключи будут видны ядру и, соответственно, другим запущенным программам.
Чтобы заблокировать запись в основной файл куста, вы можете использовать механизм отладки, представленный в Windows Vista. Чтобы понять суть этого механизма, необходимо рассмотреть схему журналирования, появившуюся в Windows Vista.
Ведение журнала до Windows Vista
В Windows XP и более ранних версиях Windows каждый энергонезависимый куст реестра имеет один основной файл и один файл журнала.Исключением из этого правила является куст SYSTEM в Windows 2000 и более ранних версиях Windows, который зеркально отображается (в файл с именем «system.alt»), а не протоколируется, чтобы упростить код загрузчика (который должен загрузить указанный куст в память).
а не добавлять поддержку восстановления из журнала (зеркалирование подразумевает поочередную запись данных в два основных файла, которые в результате будут иметь одинаковую логическую структуру ключей, значений и других элементов).
Журналирование происходит путем компактного (без выравнивания по смещению) сохранения в файл журнала данных, подлежащих записи в основной файл, вместе со структурой - растровым изображением секторов основного файла, позволяющим определить, по каким смещениям расположены блоки данных от основного файла.
Файл журнала необходимо записать в основной файл.
Если при подключении улья будет определено, что данные не завершили запись в его основной файл, то блоки будут считаны из файла журнала, будут определены смещения этих блоков в основном файле (с помощью битовой карты), и затем эти блоки будут записаны в основной файл.
таким образом завершая ранее прерванную запись из-за сбоя.
У этой схемы есть существенный недостаток — если при записи в основной файл произойдет ошибка ввода-вывода (например, из-за попытки записи в сбойный сектор), то дальнейшие операции синхронизации куста с основным файлом будут невозможны.
до перезагрузки компьютера (даже если сбойный сектор будет нейтрализован переназначением секторов на уровне файловой системы или драйвера хранилища).
Это связано с тем, что логирование каждый раз очищает лог-файл от старых данных, а это значит, что ошибка записи в основной файл приведет к нарушению целостности этого файла, и новая попытка синхронизации куста приведет к нарушению целостности этого файла.
требуют стирания данных из журнала, что остается единственным способом восстановить и без того нарушенную целостность основного файла.
Следовательно, если такое стирание журнала разрешено, может возникнуть ситуация, когда новый сбой приведет к нарушению целостности одного файла журнала, в то время как целостность основного файла была нарушена предыдущим сбоем.
Ведение журнала из Windows Vista (до Windows 8.1)
Для решения проблемы синхронизации улья с основным файлом при повторяющихся сбоях была реализована схема двойного логирования.В этой схеме каждому основному файлу соответствуют два файла журнала (с расширениями «.
LOG1» и «.
LOG2»).
По умолчанию используется первый файл журнала (".
LOG1").
Если при записи в основной файл возникает ошибка, файл журнала изменяется (с «.
LOG1» на «.
LOG2» и наоборот).
Такой подход гарантирует, что всегда будет доступен правильный файл журнала, содержащий данные предыдущей попытки синхронизации.
В результате сбой при записи в файл журнала (после сбоя при записи в основной файл) не приведет к непоправимому нарушению целостности куста реестра (кстати, если такая ситуация все же возникнет, Ядро Windows имеет механизмы самовосстановления, исправляющие очевидные ошибки в структуре логического куста).
Но эту схему логирования нужно отлаживать, и поэтому в ядро Windows была введена переменная, позволяющая имитировать повторяющиеся ошибки записи в основные файлы всех кустов реестра — CmpFailPrimarySave. По неизвестным причинам эта переменная присутствует и в обычных версиях ядра (а не только в отладочных).
Если в эту переменную записать какое-то значение, отличное от нуля, то функция записи данных в основной файл будет имитировать ошибку на разных этапах такой записи.
Следует отметить, что в процессе монтирования куста реестра ядро должно выбрать, какой из двух файлов журналов использовать для восстановления, что реализует относительно сложный алгоритм определения того, какой из файлов журналов сохранил целостность, какой из них содержит более последняя версия записываемых данных и т. д. e. До Windows 8 этот алгоритм содержал серьезную ошибку, из-за которой почти во всех случаях, независимо от конкретных деталей, выбирался первый файл журнала («.
LOG1»).
В частности, для Windows 7 соответствующие исправления алгоритма были выпущены только в марте 2016 года (следовательно, за это время двойное журналирование в Windows 7 не обеспечивало лучшую защиту целостности, чем в Windows XP).
Для преодоления описанной ошибки необходимо не только заблокировать запись в основной файл куста, но и заблокировать переход ко второму файлу журнала («.
LOG2») в случае сбоя (чтобы первый файл журнала всегда содержал самые последние данные, даже в ущерб целостности в случае сбоя, в противном случае при следующей загрузке кусты системного реестра могут восстановиться до состояния, неожиданно предшествующего выключению компьютера).
К счастью, следующее значение обсуждаемой переменной позволяет добиться желаемого эффекта без изменения файла журнала — 3. «Та же переменная будет работать одинаково в новых версиях Windows (8.1 и 10), в которых используется другой метод ведения журнала (выходящий за рамки этой статьи).
Ээксперимент
В качестве эксперимента создадим невидимый ключ и его значение в операционной системе Windows 7 (Service Pack 1).Для этого в работающей операционной системе измените (редактируя память) значение переменной ядра CmpFailPrimarySave с 0 на 3, а затем создайте ключ реестра «HKEY_LOCAL_MACHINE\SYSTEM\invisible_key» со значением «invisible_value», содержащим строка «123456».
Затем выключаем операционную систему обычным способом и экспортируем файлы куста реестра SYSTEM. После повторного включения операционной системы запустите редактор реестра и обратите внимание, что в нем видны искомые вами ключ и значение (рис.
1).
Рис.
1: Редактор реестра Windows В то же время сторонние программы (например, Windows Registry Recovery и Registry Explorer) не отображают нужный ключ и значение в экспортируемых файлах реестра (рис.
2 и 3).
Рис.
2. Восстановление реестра Windows
Рис.
3: Обозреватель реестра
Заключение
Не следует чрезмерно полагаться на программы, работающие с неактивным реестром, при расследовании инцидентов ИБ, а также при мониторинге целостности.В этой статье был продемонстрирован один из многих способов скрыть ключ реестра, его значения и другие элементы от таких программ.
Теги: #bi.zone #реестр Windows #информационная безопасность #обратное проектирование
-
Компьютерная Безопасность – Что Это Такое?
19 Oct, 24 -
Необычное Интервью: Гпт-3 Как Кандидат
19 Oct, 24