Udostępnij przez


Korzystanie z bezpiecznych funkcji całkowitych

Jednym ze sposobów zminimalizowania problemów z zabezpieczeniami jest zapobieganie przepełnieniu i niedopełnieniu liczby całkowitej.

  • Przepełnienia całkowite występują, gdy wynik operacji arytmetycznej jest większy niż miejsce w pamięci typu danych ustawionego na odbieranie. Ta operacja powoduje obcięcie liczby całkowitej i nieprawidłowy wynik. Jeśli na przykład dodasz dwie 32-bitowe liczby całkowite, które powodują, że wartość jest większa niż 2^31-1, wynik zostanie obcięty, aby zmieścić się w 32-bitowej przestrzeni całkowitej, co może prowadzić do nieoczekiwanego zachowania w kodzie.

  • Przepływ liczby całkowitej występuje, gdy operacja, zwykle odejmowanie, daje nieprawidłowy wynik. Jeśli na przykład odejmiesz liczbę od INT_MIN (najmniejszej wartości 32-bitowej liczby całkowitej ze znakiem), wynik zostanie zredukowany, aby zmieścić się w 32-bitowej przestrzeni liczbowej, co również może prowadzić do nieoczekiwanego zachowania.

  • Rzutowanie między dwoma typami danych może również spowodować nieprawidłowe wyniki z powodu obcięcia wyniku, który nie pasuje do nowego miejsca w pamięci.

Biblioteka ntintsafe udostępnia zestaw funkcji języka C, które wykonują bezpieczne operacje arytmetyczne liczb całkowitych z sprawdzaniem granic, aby zapobiec przepełnieniu i niedopływom w kodzie trybu jądra. Wszystkie funkcje znajdują się w pliku nagłówkowym ntintsafe.h , który jest dostarczany z zestawem Windows Driver Kit (WDK). Te funkcje odpowiadają funkcjom Windows IntSafe, które są używane przez kod aplikacji.

Za pomocą tych funkcji można obliczyć rozmiar indeksu lub buforu albo obliczyć inną formę sprawdzania granic. Funkcje są zoptymalizowane pod kątem szybkości.

Bezpieczne funkcje liczb całkowitych oferują następujące korzyści:

  • Rozmiar buforu docelowego jest zawsze udostępniany funkcji, aby upewnić się, że funkcja nie zapisuje poza końcem buforu.

  • Bufory mają gwarantowane zakończenie zerem, nawet jeśli operacja obcina zamierzony wynik.

  • Wszystkie funkcje zwracają NTSTATUS z tylko jednym możliwym kodem powodzenia (STATUS_SUCCESS) i jednym możliwym warunkiem błędu (STATUS_INTEGER_OVERFLOW). Na przykład NTSTATUS status = RtlIntSub(INT_MIN, 1, &result); należy zwrócić wynik = -2,147,483,649, ale ta liczba nie może być reprezentowana w polu 32-bitowym. Zamiast tego, result jest niezdefiniowany, a status to STATUS_INTEGER_OVERFLOW, co jest wartością stanu zwracaną w celu zgłoszenia zarówno przepełnień, jak i niedomiarów.

Biblioteka ntintsafe ma dwie kategorie funkcji:

  • Funkcje konwersji — te funkcje wykonują konwersje między dwoma typami danych.

  • Funkcje arytmetyczne — te funkcje wykonują operacje dodawania, odejmowania i mnożenia dla każdego typu danych.

Podsumowanie funkcji bezpiecznych liczb całkowitych Kernel-Mode

Importowanie Kernel-Mode bezpiecznych funkcji liczb całkowitych