Escenarios de copia de archivos en modo kernel y detección de copia de archivos

En este artículo se describe la funcionalidad de copia de archivos en modo kernel de confianza introducida en Windows 11, versión 22H2. Esta funcionalidad permite que los filtros detecten fácilmente escenarios de copia. Resulta útil para los filtros antivirus (VV), lo que les permite determinar si pueden aplazar u omitir completamente el análisis de los archivos de origen y destino durante la copia.

Para asegurarse de que las operaciones de lectura y escritura en modo kernel estén marcadas de forma segura como parte de una operación de copia, se realizaron las siguientes actualizaciones:

  • Se agregaron la marca FILE_CONTAINS_EXTENDED_CREATE_INFORMATION y la estructura EXTENDED_CREATE_INFORMATION. Esta marca y estructura se usan para indicar la intención de copia en tiempo de creación a través de NtCreateFile. La estructura EXTENDED_CREATE_INFORMATION actúa como un contenedor alrededor del parámetro EaBuffer existente de NtCreateFile.

    Cuando se especifica la marca FILE_CONTAINS_EXTENDED_CREATE_INFORMATION, el administrador de E/S interpreta los parámetros EaBuffer y EaLength como una estructura EXTENDED_CREATE_INFORMATION. A continuación, el administrador de E/S analiza los campos de esa estructura como si se proporcionaran directamente a NtCreateFile. Los filtros subyacentes no experimentan ningún cambio en el comportamiento de los atributos extendidos.

  • Se han agregado IoCheckFileObjectOpenedAsCopySource y IoCheckFileObjectOpenedAsCopyDestination para comprobar si se abrió un archivo para la intención de copia.

  • Se ha agregado NtCopyFileChunk para realizar la copia en modo kernel.

Todas las operaciones de lectura y escritura de NtCopyFileChunk tienen:

  • El modo de solicitante del IRP establecido en KernelMode
  • Una extensión IRP de tipo IopCopyInformationType.

Los filtros no tienen acceso directamente a las extensiones IRP, pero pueden comprobar la presencia de esta extensión y obtener información de copia de los datos de devolución de llamada llamando a FltGetCopyInformationFromCallbackData.