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 correta de códigos IOCTL 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 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 as rotinas de despacho de um driver testarem os códigos IOCTL recebidos, elas devem sempre 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 verifique Parameters.DeviceIoControl.InputBufferLength ou Parameters.DeviceIoControl.OutputBufferLength na estrutura IO_STACK_LOCATION para determinar os limites de buffer.

  • Sempre zere os buffers alocados pelo driver que conterão dados destinados ao aplicativo que originou a solicitação IOCTL. Dessa forma, você não copiará acidentalmente dados confidenciais para o aplicativo.

  • Para transferências METHOD_IN_DIRECT e METHOD_OUT_DIRECT, siga as regras acima. Além disso, verifique um valor retornado 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 no Uso de E/S não armazenada em buffer nem direta.