Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Un modo per ridurre al minimo i problemi di sicurezza consiste nel impedire overflow e underflow interi.
Gli overflow interi si verificano quando il risultato di un'operazione aritmetica è maggiore dello spazio di memoria del tipo di dati impostato per riceverlo. Questa operazione comporta il troncamento dell'intero e un risultato non corretto. Ad esempio, se si aggiungono due interi a 32 bit che generano un valore maggiore di
2^31-1, il risultato viene troncato per rientrare nello spazio intero a 32 bit, che può causare un comportamento imprevisto nel codice.L'underflow integer si verifica quando un'operazione, in genere sottrazione, restituisce un risultato non corretto. Ad esempio, se si sottrae un numero da INT_MIN (il valore più piccolo per un intero con segno a 32 bit), il risultato viene troncato per adattarsi allo spazio intero a 32 bit, che può causare anche un comportamento imprevisto.
Il cast tra due tipi di dati può anche causare risultati non corretti a causa del troncamento di un risultato che non rientra nel nuovo spazio di memoria.
La libreria ntintsafe fornisce un set di funzioni C che eseguono operazioni aritmetiche integer sicure con il controllo dei limiti per evitare overflow e underflow nel codice in modalità kernel. Tutte le funzioni si trovano nel file di intestazione ntintsafe.h fornito con Windows Driver Kit (WDK). Queste funzioni corrispondono alle funzioni di Windows IntSafe usate dal codice dell'applicazione.
Queste funzioni vengono usate per calcolare un indice o una dimensione del buffer o per calcolare un altro tipo di controllo dei limiti. Le funzioni sono ottimizzate per la velocità.
Le funzioni integer sicure offrono i vantaggi seguenti:
Le dimensioni del buffer di destinazione vengono sempre fornite alla funzione per assicurarsi che la funzione non scriva oltre la fine del buffer.
È garantito che i buffer vengano terminati con null, anche se l'operazione tronca il risultato previsto.
Tutte le funzioni restituiscono un NTSTATUS, con un solo codice di esito positivo possibile (STATUS_SUCCESS) e una possibile condizione di errore (STATUS_INTEGER_OVERFLOW). Ad esempio,
NTSTATUS status = RtlIntSub(INT_MIN, 1, &result);deve restituire un risultato = -2.147.483.649, ma questo numero non può essere rappresentato in un campo a 32 bit. Al contrario,resultnon è definito edstatusè STATUS_INTEGER_OVERFLOW, ovvero il valore di stato restituito per segnalare gli overflow e gli underflow.
La libreria ntintsafe ha due categorie di funzioni:
Funzioni di conversione: queste funzioni eseguono conversioni tra due tipi di dati.
Funzioni aritmetiche: queste funzioni eseguono operazioni di addizione, sottrazione e moltiplicazione per ogni tipo di dati.