EreTIk's Box » Cтатьи, исходники » "Закат" Legacy-фильтров файловых систем: что под капотом?


Если вдруг кто-то не знает, то Microsoft уже сделала (в Windows 10 версии 1607) твердый шаг в сторону запрета Legacy-фильтров файловых систем: Blocking legacy file system filter drivers.

Так как же реализован этот запрет? В качестве целевой системы рассмотрим 32-х разрядную Windows 10 с номером сборки 16299.


Для начала найдем перемененную, в которую читается значение IoBlockLegacyFsFilters ключа реестра HKLM\SYSTEM\CurrentControlSet\Control\SessionManager\I/O System. Это глобальная переменная IopBlockLegacyFsFilters:

INIT:00A0826C dd offset aSessionMana_12 ; "Session Manager\\I/O System" INIT:00A08270 dd offset aIoblocklegacyf ; "IoBlockLegacyFsFilters" INIT:00A08274 dd offset _IopBlockLegacyFsFilters

Затем взглянем на использование IopBlockLegacyFsFilters:

.data:00665FB4 _IopBlockLegacyFsFilters dd ? ; DATA XREF: IopAttachDeviceToDeviceStackSafe(x,x,x)+8B .data:00665FB4 ; IopAttachDeviceToDeviceStackSafe(x,x,x):loc_5A32DA .data:00665FB4 ; IoRegisterFsRegistrationChangeMountAware(x,x,x)+12 .data:00665FB4 ; INIT:00A08274

Рассмотрим в начале функцию IoRegisterFsRegistrationChangeMountAware, которая является реализацией экспортируемой функции IoRegisterFsRegistrationChange(...). В ней мы обнаружим следующий псевдо-код:

  if ( IopBlockLegacyFsFilters && !IopIsKnownGoodLegacyFsFilter(&DriverObject->DriverName) )
  {
                

То есть для "встроенных" Legacy-фильтров файловых систем оставлено старое API. И, как видно из листинга, хороший драйвер распознается по имени:

bool IopIsKnownGoodLegacyFsFilter(_UNICODE_STRING *DriverObjectName)
{
  ULONG i = 0;
  USHORT DriverObjectNameLength = DriverObjectName->Length;

  do
  {
    if ( g_KnownGoodLegacyFsFilter[i].Length == DriverObjectNameLength
      && !memcmp(g_KnownGoodLegacyFsFilter[i].Buffer, DriverObjectName->Buffer, g_KnownGoodLegacyFsFilter[i].Length) )
    {
      break;
    }
    ++i;
  }
  while ( i < 3 );
  return i < 3;
}
                

Глобальный массив, названный мной g_KnownGoodLegacyFsFilter:

.text:004043F8 ; UNICODE_STRING g_KnownGoodLegacyFsFilter[3] .text:004043F8 g_KnownGoodLegacyFsFilter UNICODE_STRING <24h, 26h, offset aFilesystemFltm> .text:004043F8 UNICODE_STRING <20h, 22h, offset aFilesystemMsfs> .text:004043F8 UNICODE_STRING <20h, 22h, offset aFilesystemNpfs>
.text:0041E538 aFilesystemFltm: ; DATA XREF: .text:g_KnownGoodLegacyFsFilter .text:0041E538 unicode 0, <\FileSystem\FltMgr>,0 .text:0041E55E align 10h .text:0041E560 aFilesystemMsfs: ; DATA XREF: .text:g_KnownGoodLegacyFsFilter .text:0041E560 unicode 0, <\FileSystem\Msfs>,0 .text:0041E582 align 4 .text:0041E584 aFilesystemNpfs: ; DATA XREF: .text:g_KnownGoodLegacyFsFilter .text:0041E584 unicode 0, <\FileSystem\Npfs>,0 .text:0041E5A6 align 4

То есть банальный белый список по имени обьекта драйвера.


Microsoft не ограничилась контролем функции IoRegisterFsRegistrationChange: еще одна проверка была вставлена в код функциии IopAttachDeviceToDeviceStackSafe, которая является реализацией IoAttachDeviceToDeviceStackSafe(...). Взглянем на псевдо-код:

  TargetDeviceAttachmentBase = IopGetDeviceAttachmentBase(TargetDevice);
  TargetDeviceType = TargetDeviceAttachmentBase->DeviceType;
  if ( (TargetDeviceType == FILE_DEVICE_DISK_FILE_SYSTEM
     || TargetDeviceType == FILE_DEVICE_CD_ROM_FILE_SYSTEM
     || TargetDeviceType == FILE_DEVICE_NETWORK_FILE_SYSTEM
     || TargetDeviceType == FILE_DEVICE_TAPE_FILE_SYSTEM
     || TargetDeviceType == FILE_DEVICE_DFS_FILE_SYSTEM)
    && (TargetDeviceAttachmentBase->Flags & 0x10000000 || IopBlockLegacyFsFilters) )// DO_DAX_VOLUME (0x10000000)
  {
    if ( IopIsKnownGoodLegacyFsFilter(&SourceDevice_->DriverObject->DriverName) )
    {
                

Тут мы видим реализацию уточнения по DAX-томам, которое содержится в Blocking legacy file system filter drivers:

Also, legacy file system filter drivers can’t attach to direct access (DAX) volumes.

Стоит отметить, что в IopAttachDeviceToDeviceStackSafe Legacy-фильтрами файловых систем считаются все, кто пытается при-attach'иться к устройствам с типом файловой системы.


ΞρεΤΙκ