Použití bezpečných celočíselných funkcí

Jedním ze způsobů, jak minimalizovat problémy se zabezpečením, je zabránit přetečení a podtečení integerů.

  • K přetečení celého čísla dochází, když je výsledek aritmetické operace větší, než jaký je paměťový prostor datového typu určeného pro jeho příjem. Výsledkem této operace je zkrácení celého čísla a nesprávný výsledek. Pokud například přidáte dvě 32bitová celá čísla, která mají za následek hodnotu větší než 2^31-1, výsledek se zkrátí tak, aby se vešl do 32bitového celočíselného prostoru, což může vést k neočekávanému chování v kódu.

  • Integer underflow nastane, když operace, obvykle odčítání, vede k nesprávnému výsledku. Pokud například odečtete číslo od INT_MIN (nejmenší hodnota pro 32bitové celé číslo se znaky), výsledek se zkrátí tak, aby se vešl do 32bitového celočíselného prostoru, což může také vést k neočekávanému chování.

  • Přetypování mezi dvěma datovými typy může také způsobit nesprávné výsledky kvůli zkrácení výsledku, který nevejde do nového místa v paměti.

Knihovna ntintsafe poskytuje sadu funkcí jazyka C, které provádějí bezpečné celočíselné aritmetické operace s kontrolou hranic, aby se zabránilo přetečení a podtečení v kódu v režimu jádra. Všechny funkce jsou v souboru záhlaví ntintsafe.h, který je součástí sady Windows Driver Kit (WDK). Tyto funkce odpovídají funkcím Windows IntSafe, které používá aplikační kód.

Tyto funkce slouží k výpočtu velikosti indexu nebo vyrovnávací paměti nebo k výpočtu jiné formy kontroly hranic. Funkce jsou optimalizované pro rychlost.

Bezpečné celočíselné funkce nabízejí následující výhody:

  • Velikost cílové vyrovnávací paměti je vždy předána funkci, aby se zajistilo, že funkce nezapisuje za konec vyrovnávací paměti.

  • Vyrovnávací paměti se zaručují, že budou ukončeny hodnotou null, i když operace zkrátí zamýšlený výsledek.

  • Všechny funkce vrací NTSTATUS, pouze s jedním možným kódem úspěchu (STATUS_SUCCESS) a jednou možnou chybovou podmínkou (STATUS_INTEGER_OVERFLOW). Měl by například NTSTATUS status = RtlIntSub(INT_MIN, 1, &result); vrátit výsledek = -2 147 483 649, ale toto číslo nemůže být reprezentováno v 32bitovém poli. result Místo toho není definován a status je STATUS_INTEGER_OVERFLOW, což je hodnota stavu vrácená k hlášení přetečení i podtečení.

Knihovna ntintsafe má dvě kategorie funkcí:

  • Převodní funkce – tyto funkce provádějí převody mezi dvěma datovými typy.

  • Aritmetické funkce – tyto funkce provádějí operace sčítání, odčítání a násobení pro každý datový typ.

Souhrn bezpečných celočíselných funkcí pro režim jádra

Importování bezpečných celočíselných funkcí režimu jádra