Compartilhar via


Usando funções inteiros seguras

Uma maneira de minimizar problemas de segurança é evitar estouros inteiros e subfluxos.

  • Estouros inteiros ocorrem quando o resultado de uma operação aritmética é maior que o espaço de memória do tipo de dados definido para recebê-lo. Essa operação resulta no truncamento do inteiro e em um resultado incorreto. Por exemplo, se você adicionar dois inteiros de 32 bits que resultam em um valor maior que 2^31-1, o resultado será truncado para caber no espaço inteiro de 32 bits, o que pode levar a um comportamento inesperado em seu código.

  • Um subfluxo de inteiro ocorre quando uma operação, geralmente uma subtração, fornece um resultado incorreto. Por exemplo, se você subtrair um número de INT_MIN (o menor valor para um inteiro com sinal de 32 bits), o resultado será truncado para caber no espaço inteiro de 32 bits, o que também pode levar a um comportamento inesperado.

  • A conversão entre dois tipos de dados também pode causar resultados incorretos devido ao truncamento de um resultado que não cabe no novo espaço de memória.

A biblioteca ntintsafe fornece um conjunto de funções C que executam operações aritméticas de inteiro seguro com verificação de limites para evitar estouros e subfluxos em código em modo kernel. Todas as funções estão no arquivo de cabeçalho ntintsafe.h , que é fornecido com o WDK (Windows Driver Kit). Essas funções correspondem às funções do Windows IntSafe usadas pelo código do aplicativo.

Você usa essas funções para calcular um índice ou tamanho de buffer ou para calcular alguma outra forma de verificação de limites. As funções são otimizadas para velocidade.

Funções inteiros seguras oferecem as seguintes vantagens:

  • O tamanho do buffer de destino sempre é fornecido para a função para garantir que a função não escreva após o final do buffer.

  • Os buffers têm a garantia de serem encerrados em nulo, mesmo que a operação trunque o resultado pretendido.

  • Todas as funções retornam um NTSTATUS, com apenas um código de êxito possível (STATUS_SUCCESS) e uma possível condição de erro (STATUS_INTEGER_OVERFLOW). Por exemplo, NTSTATUS status = RtlIntSub(INT_MIN, 1, &result); deve retornar um resultado = -2.147.483.649, mas esse número não pode ser representado em um campo de 32 bits. Em vez disso, result é indefinido e status é STATUS_INTEGER_OVERFLOW, que é o valor de status retornado para relatar estouros e subfluxos.

A biblioteca ntintsafe tem duas categorias de funções:

  • Funções de conversão — essas funções executam conversões entre dois tipos de dados.

  • Funções aritméticas — essas funções executam operações de adição, subtração e multiplicação para cada tipo de dados.

Resumo de Funções Seguras de Inteiros em Modo Kernel

Importando Funções Inteiras Seguras de Modo Kernel