Problemas de segurança para códigos de controle de E/S
O processamento seguro de IRPs que contêm códigos de controle de E/S depende da definição de códigos IOCTL corretamente e do exame cuidadoso dos parâmetros que o driver recebe com o IRP.
Ao definir novos códigos IOCTL, use as seguintes regras:
Sempre especifique um valor FunctionCode igual ou maior que 0x800.
Sempre especifique um valor RequiredAccess . O gerente de E/S não enviará IOCTLs se o chamador não tiver direitos de acesso insuficientes.
Não defina códigos IOCTL que permitem que os chamadores leiam ou escrevam áreas não específicas da memória do kernel.
Ao processar códigos IOCTL em um driver, use as seguintes regras:
Sempre que o teste de rotinas de expedição de um driver recebe códigos IOCTL, ele sempre deve testar todo o valor de 32 bits.
Os drivers podem usar IoValidateDeviceIoControlAccess para executar dinamicamente uma verificação de acesso mais rigorosa do que a especificada pelo valor RequiredAccess na definição do código de controle de E/S.
Nunca leia ou escreva mais dados do que o buffer apontado por Irp-AssociatedIrp.SystemBuffer> pode conter. Portanto, sempre marcar Parameters.DeviceIoControl.InputBufferLength ou Parameters.DeviceIoControl.OutputBufferLength na estrutura IO_STACK_LOCATION para determinar os limites do buffer.
Sempre zero buffers alocados por driver que conterão dados destinados a um aplicativo que originou uma solicitação IOCTL. Dessa forma, você não copiará acidentalmente dados confidenciais para o aplicativo.
Para transferências de METHOD_IN_DIRECT e METHOD_OUT_DIRECT, siga as regras acima. Além disso, marcar para um valor de retorno NULL de MmGetSystemAddressForMdlSafe, que indica que o mapeamento falhou ou que um buffer de comprimento zero foi fornecido.
Para transferências de METHOD_NEITHER, siga as regras fornecidas em Usando nem E/S direta nem buffer.