Compartilhar via


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.