Partilhar via


Usando funções de número inteiro seguro

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

  • Estouro de número inteiro ocorre quando o resultado de uma operação aritmética é maior do que o espaço de memória do tipo de dados definido para recebê-lo. Esta operação resulta no truncamento do inteiro e um resultado incorreto. Por exemplo, se se somarem dois inteiros de 32 bits que resultem em um valor maior que 2^31-1, o resultado será truncado para caber no intervalo de inteiros de 32 bits, o que pode resultar num comportamento inesperado no seu código.

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

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

A biblioteca ntintsafe fornece um conjunto de funções C que executam operações aritméticas inteiras seguras com verificação de limites para evitar estouros e subfluxos no código do modo kernel. Todas as funções estão no arquivo de cabeçalho ntintsafe.h , que acompanha o Windows Driver Kit (WDK). Essas funções correspondem às funções do Windows IntSafe que são 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.

As funções de número inteiro seguro oferecem as seguintes vantagens:

  • O tamanho do buffer de destino é sempre fornecido à função para garantir que a função não escreva além do final do buffer.

  • É garantido que os buffers tenham terminação nula, mesmo que a operação trunque o resultado destinado.

  • Todas as funções retornam um NTSTATUS, com apenas um código de sucesso 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 indicar tanto estouros quanto 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 das funções inteiras seguras Kernel-Mode

Importando funções Safe Integer Kernel-Mode