Microsoft надасть антивірусам можливість контролю за активністю підсистеми Linux на Windows 10

В попередніх постах нашого корпоративного блогу ми кілька разів стосувалися теми підтримки підсистеми Linux на Windows 10 (WSL), а також описували особливості її технічної реалізації. Бета-версія цієї підсистеми була доставлена користувачам у вимкненому вигляді в рамках оновлення Windows 10 Redstone 1 (Anniversary Update) в серпні цього року.



Недавно Microsoft почала анонсировать зміни в ядрі Windows, які допоможуть AV-драйверам правильним чином працювати з процесами підсистеми Linux, в контексті яких запускаються виконувані ELF-файли.

Відомо, що до появи механізмів функцій зворотного виклику для контролю за різними операціями в режимі ядра, автори драйверів брандмауерів і антивірусів використовували перехоплення API-дзвінків в системній таблиці викликів KiServiceTable, яку можна було виявити з використанням експортованої ядром змінної KeServiceDescriptorTable. З появою нових вже документованих API-викликів для реєстрації callback-функції, розробники перейшли на їх використання. До того ж 64-розрядні версії Windows не дозволяли просто так перехоплювати сервіси KiServiceTable спочатку.


Рис. Архітектура файлової системи WSL. Видно, що LXCore.sys емулює різні об'єкти Linux з використанням функцій ядра Windows.

Однією з основних операцій, яка контролюється антивірусами або HIPS є створення процесів і потоків. Драйвер може зареєструвати функцію зворотного виклику за допомогою PsSetCreateProcessNotifyRoutineEx, а також PsSetCreateThreadNotifyRoutine. Після цього при створенні процесів або потоків у процесі, драйвер буде отримувати повідомлення про цю операцію. Microsoft модернізувала ці функції, додавши API PsSetCreateProcessNotifyRoutineEx2 PsSetCreateThreadNotifyRoutineEx. Ці API-функції ядра допоможуть драйверам відстежувати активність процесів всередині підсистеми Linux.

Type = PsCreateProcessNotifySubsystems; //новий тип повідомлень
Status = PsSetCreateProcessNotifyRoutineEx2(Type, Callback,TRUE); //нова API

void Callback (_In_ HANDLE ParentId, _In_ HANDLE ProcessId, _Inout_opt_ PPS_CREATE_NOTIFY_INFO CreateInfo) {
if (CreateInfo->Flags.IsSubsystemProcess == 0) {
/* Код оригінального обробника callback */
} else {
Type = ProcessSubsystemInformation;
Status = NtQueryInformationProcess(ProcessHandle, Type, &Subsystem, sizeof(Subsystem), NULL);
if (Subsystem == SubsystemInformationTypeWSL) {
/* Новий код для обробки створення процесів WSL */
}
}
}

Type = PsCreateThreadNotifySubsystems; //новий тип повідомлень
Status = PsSetCreateThreadNotifyRoutineEx(Type, Callback); //нова API

void Callback (_In_ HANDLE ProcssId, _In_ HANDLE ThreadId, _In_ BOOLEAN Create) {
Type = ThreadSubsystemInformation;
Status = NtQueryInformationThread(ThreadHandle, Type, &Subsystem, sizeof(Subsystem), NULL);
if (Subsystem == SubsystemInformationTypeWin32) {
/* Код оригінального обробника callback */
} else if (Subsystem == SubsystemInformationTypeWSL) {
/* Новий код для обробки створення процесів WSL */
}
}

» Microsoft опублікувала інформацію про реалізації VFS в підсистемі Linux на Windows 10
» Microsoft розкрила технічні аспекти реалізації підсистеми Linux Windows 10
» Microsoft підтвердила чутки про інтеграцію підсистеми Linux Windows 10
» Включення підсистеми Linux Windows 10
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.