最小化安全问题的一种方法是防止整数溢出和下溢。
当算术运算的结果大于要接收它的数据类型的内存空间时,会发生整数溢出。 此操作将导致整数截断及产生不正确的结果。 例如,如果添加两个导致值大于
2^31-1值的 32 位整数,则结果将被截断以适应 32 位整数空间,这可能会导致代码中出现意外行为。当运算(通常是减法)给出不正确的结果时,会发生整数下溢。 例如,如果从INT_MIN中减去数字(32 位有符号整数的最小值),则结果将被截断,以适应 32 位整数空间,这也可能导致意外行为。
由于截断不符合新内存空间的结果,两种数据类型之间的转换也可能导致不正确的结果。
ntintsafe 库提供了一组 C 函数,这些函数通过边界检查来执行安全的整数算术运算,以防止内核模式代码中的溢出和下溢。 所有函数都在 ntintsafe.h 头文件中,该文件附带 Windows 驱动程序工具包(WDK)。 这些函数对应于应用程序代码使用的 Windows IntSafe 函数。
使用这些函数计算索引或缓冲区大小,或计算某种其他类型的边界检查。 函数针对速度进行优化。
安全整数函数具有以下优势:
目标缓冲区的大小每次都会提供给函数,以确保函数不写入超出缓冲区末尾的位置。
即使操作截断了预期结果,缓冲区仍然保证以 null 结束。
所有函数都返回 NTSTATUS,只有一个可能的成功代码(STATUS_SUCCESS)和一个可能的错误条件(STATUS_INTEGER_OVERFLOW)。 例如,
NTSTATUS status = RtlIntSub(INT_MIN, 1, &result);应返回结果 = -2,147,483,649,但不能在 32 位字段中表示此数字。 不是result未定义,而是statusSTATUS_INTEGER_OVERFLOW,这个状态值用于报告溢出和下溢。
ntintsafe 库有两类函数:
转换函数 - 这些函数在两种数据类型之间执行转换。
算术函数 - 这些函数对每种数据类型执行加法、减法和乘法运算。