
Доказательство концепции, инструмент и техническое глубокое погружение в Process Herpaderping. Process Herpaderping обходит средства безопасности, скрывая намерения процесса.
Process Herpaderping — это метод сокрытия намерений процесса путем изменения содержимого на диске после того, как образ был отображен. Это приводит к любопытному поведению со стороны продуктов безопасности и самой ОС.


Обычно продукт безопасности реагирует на создание процесса, регистрируя callback в ядре Windows (PsSetCreateProcessNotifyRoutineEx). На этом этапе продукт безопасности может проверить файл, который использовался для отображения исполняемого файла, и определить, следует ли разрешить выполнение этого процесса. Этот kernel callback вызывается при вставке начального потока, а не при создании объекта процесса.
Из-за этого субъект может создать и отобразить процесс, изменить содержимое файла, а затем создать начальный поток. Продукт, выполняющий проверку в callback создания, увидит измененное содержимое. Кроме того, некоторые продукты используют подход сканирования при записи, который заключается в мониторинге записи в файлы. Знакомая оптимизация здесь заключается в записи того, что файл был записан, и откладывании фактической проверки до возникновения IRP_MJ_CLEANUP (например, когда файловый дескриптор закрывается). Таким образом, субъект, использующий рабочий процесс write -> map -> modify -> execute -> close, обойдет сканирование при записи, которое полагается исключительно на проверку в IRP_MJ_CLEANUP.
Чтобы злоупотребить этим соглашением, мы сначала записываем двоичный файл в целевой файл на диске. Затем мы отображаем образ целевого файла и передаем его ОС для использования при создании процесса. ОС любезно отображает исходный двоичный файл для нас. Используя существующий дескриптор файла и до создания начального потока, мы изменяем содержимое целевого файла, чтобы скрыть или подменить файл, лежащий в основе образа. Через некоторое время мы создаем начальный поток, чтобы начать выполнение исходного двоичного файла. Наконец, мы закроем дескриптор целевого файла. Давайте рассмотрим это пошагово:
NtCreateProcessEx).NtCreateThreadEx).
@startuml
hide empty description
[*] --> CreateFile
CreateFile --> FileHandle
FileHandle --> Write
FileHandle --> NtCreateSection
Write -[hidden]-> NtCreateSection
NtCreateSection --> SectionHandle
SectionHandle --> NtCreateProcessEx
FileHandle --> Modify
NtCreateProcessEx -[hidden]-> Modify
NtCreateProcessEx --> NtCreateThreadEx
Modify -[hidden]-> NtCreateThreadEx
NtCreateThreadEx --> [*]
FileHandle --> CloseFile
NtCreateThreadEx -[hidden]-> CloseFile
NtCreateThreadEx --> PspCallProcessNotifyRoutines
PspCallProcessNotifyRoutines -[hidden]-> [*]
CloseFile --> IRP_MJ_CLEANUP
IRP_MJ_CLEANUP -[hidden]-> [*]
PspCallProcessNotifyRoutines --> Inspect
PspCallProcessNotifyRoutines -[hidden]-> CloseFile
IRP_MJ_CLEANUP --> Inspect
Inspect -[hidden]-> [*]
CreateFile : Создать целевой файл, оставить дескриптор открытым.
Write : Записать полезную нагрузку в целевой файл.
Modify : Скрыть файл на диске.
NtCreateSection : Создать раздел, используя дескриптор файла.
NtCreateProcessEx : Раздел образа для процесса отображается и кэшируется в объекте файла.
NtCreateThreadEx : Используется кэшированный раздел.
NtCreateThreadEx : Уведомления о процессе срабатывают в ядре.
Inspect : Содержимое на диске не соответствует тому, что было выполнено.
Inspect : Проверка файла на этом этапе приведет к неверной атрибуции.
@enduml
В демонстрации ниже вы увидите, что CMD.exe используется в качестве цели выполнения. Первый запуск перезаписывает байты на диске шаблоном. Второй запуск перезаписывает CMD.exe файлом ProcessHacker.exe. Инструмент Herpaderping исправляет двоичный файл, чтобы он максимально походил на ProcessHacker.exe, сохраняя даже оригинальную подпись. Обратите внимание на множественные выполнения одного и того же двоичного файла и на то, как процесс выглядит для пользователя по сравнению с тем, что находится в файле на диске.


Мы наблюдали за поведением, и кое-что из этого может быть удивительным. Давайте попробуем объяснить это поведение.
Техническое глубокое погружение
При разработке продуктов для обеспечения безопасности платформ Windows многие инженеры в этой области (включая меня) полагались на предвзятые представления о том, как ОС будет обрабатывать данные. В этом сценарии некоторые могут ожидать, что файл на диске останется «заблокированным» при создании процесса. Вы не можете удалить файл. Вы не можете записать в него. Но вы можете его переименовать. Как показано здесь, при определенных условиях вы действительно можете в него записать. Будьте бдительны в своих предположениях, всегда ставьте их под сомнение и проводите исследования.
Мотивация для этого исследования возникла при обнаружении того, как проводить анализ, когда файл записывается. Имея предварительный опыт исследования Process Hollowing и Doppelganging, я теоретизировал, что это может быть возможно. Цель — обеспечить лучшую безопасность. Вы не можете создать лучший замок, не поняв сначала, как взломать старый.
Herpaderping похож на Hollowing и Doppelganging, но есть некоторые ключевые различия:
Process Hollowing включает изменение отображенного раздела до начала выполнения, что абстрактно выглядит так: map -> modify section -> execute. Этот рабочий процесс приводит к тому, что предполагаемый поток выполнения Hollowed-процесса отклоняется в непредусмотренный код. Doppelganging можно считать формой Hollowing. Однако Hollowing, на мой взгляд, ближе к инъекции в том смысле, что Hollowing обычно включает явную запись в уже отображенный код. Это отличается от Herpaderping, где нет измененных разделов.
Process Doppelganging ближе к Herpaderping. Doppelganging злоупотребляет транзакционными файловыми операциями и обычно включает следующие шаги: transact -> write -> map -> rollback -> execute. В этом рабочем процессе ОС создаст раздел образа и учтет транзакции, поэтому кэшированный раздел образа в итоге оказывается тем, что вы записали в транзакцию. ОС исправила эту технику. Ну, они исправили крах, который она вызывала. Может быть, они считают это «легальным» использованием транзакции. К счастью, Windows Defender перехватывает технику Doppelganging. Doppelganging отличается от Herpaderping тем, что Herpaderping не полагается на транзакционные файловые операции. И Defender не перехватывает Herpaderping.
Для справки, обобщенные техники:
| Тип | Техника |
|---|---|
| Hollowing | map -> modify section -> execute |
| Doppelganging | transact -> write -> map -> rollback -> execute |
| Herpaderping | write -> map -> modify -> execute -> close |
Мы видим различия, изложенные здесь. Хотя Herpaderping, возможно, более шумный, чем Doppelganging, в том смысле, что вредоносные биты действительно попадают на диск, мы видели, что продукты безопасности все еще неспособны обнаружить Herpaderping.
Здесь нет четкого исправления. Кажется разумным, что предотвращение отображения/кэширования раздела образа при наличии доступа на запись к файлу должно закрыть дыру. Однако это может быть или не быть практическим решением.
Другой вариант может заключаться в сбросе изменений в файле в кэшированный раздел образа, если он еще не был отображен в процесс. Однако, поскольку отображение в новый процесс происходит в NtCreateProcess, это, вероятно, нежизнеспособное решение.
С точки зрения обнаружения, нет хорошего способа идентифицировать фактические биты, которые были отображены. Проверка в IRP_MJ_CLEANUP или callback, зарегистрированном в PsSetCreateProcessNotifyRoutineEx, приводит к неверной атрибуции, поскольку биты на диске были изменены; вам пришлось бы перестроить файл из созданного раздела. Стоит отметить, что в Windows 10 появился новый callback, который вы можете зарегистрировать как PsSetCreateProcessNotifyRoutineEx2, однако он страдает той же проблемой, что и предыдущий callback: он вызывается при выполнении начального потока, а не при создании объекта процесса. Microsoft добавила PsSetCreateThreadNotifyRoutineEx, который вызывается при вставке начального потока, если зарегистрирован с PsCreateThreadNotifyNonSystem, в отличие от старого callback, который вызывался перед началом выполнения. Расширение PSCREATEPROCESSNOTIFYTYPE для вызова при создании объекта процесса тоже не поможет, как мы видели в разделе Углубленное изучение, объект раздела образа кэшируется при вызове NtCreateSection, а не NtCreateProcess.
Мы не можем легко идентифицировать, что было выполнено. Нам остается пытаться обнаружить эксплуатационное поведение со стороны субъекта; я оставлю обнаружение индикаторов поведения в качестве упражнения для читателя.
Ниже приведен список продуктов и ОС Windows, которые были протестированы по состоянию на (31.08.2020). Тесты проводились с известным вредоносным двоичным файлом.
Эта уязвимость была раскрыта Microsoft Security Response Center (MSRC) 17.07.2020, и 22.07.2020 MSRC открыло дело. MSRC завершило расследование 25.08.2020 и определило, что находки действительны, но не соответствуют их критериям для немедленного исправления. На данный момент их дело закрыто без решения и помечено для будущего рассмотрения без указания сроков.
Мы не согласны с серьезностью этой ошибки; это было сообщено MSRC 27.08.2020.
Этот репозиторий содержит инструмент для отработки метода Herpaderping по сокрытию процесса. Использование следующее:
Process Herpaderping Tool - Copyright (c) Johnny Shaw
ProcessHerpaderping.exe SourceFile TargetFile [ReplacedWith] [Options...]
Usage:
SourceFile Исходный файл для выполнения.
TargetFile Целевой файл для выполнения исходного файла.
ReplacedWith Файл для замены целевого. Необязательно,
по умолчанию перезаписывает двоичный файл шаблоном.
-h,--help Выводит справку по инструменту.
-d,--do-not-wait Не ждать завершения порожденного процесса,
по умолчанию ждет.
-l,--logging-mask number Задает маску логирования, по умолчанию полное
логирование.
0x1 Успехи
0x2 Информационные
0x4 Предупреждения
0x8 Ошибки
0x10 Контекстные
-q,--quiet Работает тихо, переопределяет маску логирования, без заголовка.
-r,--random-obfuscation Использует случайные байты вместо шаблона для
сокрытия файла.
-e,--exclusive Целевой файл создается с монопольным доступом,
и дескриптор удерживается открытым как можно дольше.
Без этой опции дескриптор имеет полный доступ
для совместного использования и закрывается как можно скорее.
-u,--do-not-flush-file Не сбрасывать файл после перезаписи.
-c,--close-file-early Закрывает файл до создания потока (до того, как
callback уведомления о процессе сработает в ядре).
Недействительно с опцией "--exclusive".
-k,--kill Завершает порожденный процесс независимо от
успеха или неудачи; это полезно в некоторых
средах автоматизации. Принудительно включает
опцию "--do-not-wait".
Репозиторий использует подмодули; после клонирования обязательно инициализируйте и обновите подмодули. Файлы проектов предназначены для Visual Studio 2019.
git clone https://github.com/jxy-s/herpaderping.git
cd .\herpaderping\
git submodule update --init --recursive
MSBuild .\herpaderping.sln
Следующие компоненты используются без изменений. Спасибо их авторам.
| Операционная система | Версия | Уязвима |
|---|
| Windows 7 Enterprise x86 | 6.1.7601 | Да |
| Windows 10 Pro x64 | 10.0.18363.900 | Да |
| Windows 10 Pro Insider Preview x64 | 10.0.20170.1000 | Да |
| Windows 10 Pro Insider Preview x64 | 10.0.20201.1000 | Да |
| Продукт безопасности | Версия | Уязвим |
|---|
| Windows Defender AntiMalware Client | 4.18.2006.10 | Да |
| Windows Defender Engine | 1.1.17200.2 | Да |
| Windows Defender Antivirus | 1.319.1127.0 | Да |
| Windows Defender Antispyware | 1.319.1127.0 | Да |
| Windows Defender AntiMalware Client | 4.18.2007.6 | Да |
| Windows Defender Engine | 1.1.17300.2 | Да |
| Windows Defender Antivirus | 1.319.1676.0 | Да |
| Windows Defender Antispyware | 1.319.1676.0 | Да |
| Windows Defender AntiMalware Client | 4.18.2007.8 | Да |
| Windows Defender Engine | 1.1.17400.5 | Да |
| Windows Defender Antivirus | 1.323.267.0 | Да |
| Windows Defender Antispyware | 1.323.267.0 | Да |