Partilhar 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 adequada 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 que seja igual ou maior que 0x800.

  • Sempre especifique um valor RequiredAccess . O gerente de E/S não envia IOCTLs se o chamador tiver direitos de acesso insuficientes.

  • Não defina códigos IOCTL que permitam aos chamadores ler ou escrever áreas não específicas da memória do kernel.

Ao processar códigos IOCTL dentro de um driver, use as seguintes regras:

  • Sempre que o teste de rotinas de despacho de um motorista recebeu códigos IOCTL, eles sempre devem 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 grave 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.

  • Certifique-se de inicializar sempre os buffers alocados pelo driver, que conterão dados destinados a uma aplicação que originou uma 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 se há 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 METHOD_NEITHER, siga as regras fornecidas em Usando Nem Buffer Nem E/S Direta.