Considerazioni sulla sicurezza: Interfaccia utente di Windows
In questo argomento vengono fornite informazioni sulle considerazioni sulla sicurezza nell'interfaccia utente di Windows. Questo argomento non fornisce tutte le informazioni necessarie per conoscere i problemi di sicurezza. Usarlo invece come punto di partenza e riferimento per questa area tecnologica.
Con l'aumento dell'interconnettività dei computer, gli sviluppatori devono ora preoccuparsi della sicurezza delle applicazioni. Tuttavia, la sicurezza migliora anche la sicurezza generale delle applicazioni e la robustezza; pertanto è un altro modo in cui lo sviluppatore può offrire un'esperienza utente ottimale. Negli argomenti seguenti vengono illustrati alcuni potenziali problemi di sicurezza quando si usa l'interfaccia utente di Windows.
Considerazioni sulle stringhe
Molte funzioni, messaggi e macro usano stringhe nei relativi parametri. Tuttavia, spesso le stringhe non vengono controllate per la terminazione Null o per la lunghezza. Un problema correlato è il calcolo errato della lunghezza di una stringa o di un buffer. In entrambi i casi, ciò può causare un overflow del buffer o un troncamento dei dati, che può influire negativamente sull'applicazione. Per altre informazioni sui sovraccarichi del buffer e altri problemi di sicurezza, vedere Scrittura di codice sicuro di Michael Howard e David Leblanc, Microsoft Press, 2002.
Per gestire le stringhe in modo sicuro, è necessario eseguire le operazioni seguenti:
- Controllare le stringhe per la terminazione null o per la lunghezza corretta, in base alle esigenze.
- Prestare particolare attenzione a determinare la lunghezza di una stringa o di un buffer, soprattutto quando contiene valori TCHAR .
- Se si crea una stringa o si usa una stringa usata in precedenza, inizializzarla in zero o inserire un carattere di terminazione Null, in base alle esigenze.
È inoltre consigliabile usare le funzioni Str Cassaforte quando si gestiscono stringhe. Queste funzioni sono progettate per gestire le stringhe in modo sicuro.
User Input
L'interfaccia utente di Windows riguarda il recupero e la risposta alle informazioni degli utenti. Tuttavia, gli utenti che immettono dati non corretti possono interrompere l'applicazione, indipendentemente dal fatto che intendano farlo. Pertanto, la regola cardinale è che tutti gli input devono essere convalidati.
Il problema principale è costituito dai dati stringa, descritti in Considerazioni sulle stringhe. Tuttavia, tutti i tipi di input devono essere convalidati prima di essere usati dall'applicazione. Un altro problema riguarda la convalida dei dati in un punto, ma le modifiche prima che vengano usate, ad esempio, quando si ricevono messaggi che forniscono la lunghezza del testo. Pertanto, se è possibile che i dati vengano modificati, è consigliabile controllare i dati appena prima di usarli
Avvisi di sicurezza
Nella tabella seguente sono elencate le funzionalità che, se usate in modo non corretto, possono compromettere la sicurezza delle applicazioni.
Funzionalità | Mitigazione |
---|---|
GetAtomName | Prestare attenzione quando si specificano le dimensioni del buffer. |
GlobalGetAtomName | Gli atomi di stringa globali sono accessibili a qualsiasi applicazione. Tuttavia, se un'altra applicazione non è carente, potrebbe non essere gestito in modo improprio i conteggi dei riferimenti ed eliminarli. È consigliabile usare invece atomi interi globali. |
ImpersonateDdeClientWindow | Se la funzione ha esito negativo, le richieste client successive vengono effettuate nel contesto di sicurezza del processo chiamante. Questo può essere un problema se il processo chiamante è in esecuzione come account con privilegi elevati. Pertanto, se la chiamata ha esito negativo o genera un errore non continuare l'esecuzione della richiesta client. |
DdeImpersonateClient | Se la funzione ha esito negativo, le richieste client successive vengono effettuate nel contesto di sicurezza del processo chiamante. Questo può essere un problema se il processo chiamante è in esecuzione come account con privilegi elevati. Pertanto, se la chiamata ha esito negativo o genera un errore non continuare l'esecuzione della richiesta client. |
GetClipboardFormatName | Il calcolo errato delle dimensioni appropriate del buffer lpszFormatName , in particolare quando l'applicazione viene usata sia in versioni ANSI che Unicode, può causare un overflow del buffer. Si noti inoltre che la stringa viene troncata se è più lunga del parametro cchMaxCount , che può causare la perdita di informazioni. |
GetMenuString | Il parametro lpString è un buffer TCHAR e nMaxCount è la lunghezza della stringa di menu in TCHARs. Il dimensionamento di questi parametri in modo errato può essere la lunghezza della stringa di menu in caratteri. Il ridimensionamento di questi parametri in modo errato può causare il troncamento della stringa, causando la possibile perdita di dati. |
GetStringTypeA, GetStringTypeEx, GetStringTypeW | Per evitare un overflow del buffer, impostare correttamente le dimensioni del buffer lpCharType . |
Loadlibrary | L'uso di LoadLibrary in modo errato può compromettere la sicurezza dell'applicazione caricando la DLL errata. |
LoadString | L'uso non corretto include la specifica delle dimensioni errate nel parametro nBufferMax . Ad esempio, sizeof(lpBuffer) fornisce la dimensione del buffer in byte, che potrebbe causare un overflow del buffer per la versione Unicode della funzione. Le situazioni di overflow del buffer sono la causa di molti problemi di sicurezza nelle applicazioni. In questo caso, l'uso sizeof(lpBuffer)/sizeof(TCHAR) di fornisce le dimensioni appropriate del buffer. |
lstrcat | Questa funzione usa la gestione strutturata delle eccezioni (edizione Standard H) per intercettare le violazioni di accesso e altri errori. Quando questa funzione rileva gli errori edizione Standard H, restituisce NULL senza terminazione null della stringa e senza NULL senza terminazione null della stringa e senza notificare al chiamante l'errore. Il chiamante non è sicuro presupporre che lo spazio insufficiente sia la condizione di errore. Il primo argomento, lpString1, deve essere sufficientemente grande da contenere lpString2 e la chiusura '\0'. In caso contrario, potrebbe verificarsi un sovraccarico del buffer. I sovraccarichi del buffer possono causare un attacco Denial of Service all'applicazione se si verifica una violazione di accesso. Nel peggiore dei casi, un sovraccarico del buffer può consentire a un utente malintenzionato di inserire codice eseguibile nel processo, soprattutto se lpString1 è un buffer basato su stack. Prendere in considerazione l'uso di una delle alternative seguenti. StringCbCat o StringCchCat. |
lstrcpy | Questa funzione usa la gestione strutturata delle eccezioni (edizione Standard H) per intercettare le violazioni di accesso e altri errori. Quando questa funzione rileva gli errori edizione Standard H, restituisce NULL senza terminazione null della stringa e senza NULL senza terminazione null della stringa e senza notificare al chiamante l'errore. Il chiamante non è sicuro presupporre che lo spazio insufficiente sia la condizione di errore. Il primo argomento, lpString1, deve essere sufficientemente grande da contenere lpString2 e la chiusura '\0'. In caso contrario, potrebbe verificarsi un sovraccarico del buffer. I sovraccarichi del buffer possono causare un attacco Denial of Service all'applicazione se si verifica una violazione di accesso. Nel peggiore dei casi, un sovraccarico del buffer può consentire a un utente malintenzionato di inserire codice eseguibile nel processo, soprattutto se lpString1 è un buffer basato su stack. Prendere invece in considerazione l'uso di StringCchCopy. |
lstrcpyn | Questa funzione usa la gestione strutturata delle eccezioni (edizione Standard H) per intercettare le violazioni di accesso e altri errori. Quando questa funzione rileva gli errori edizione Standard H, restituisce NULL senza terminazione null della stringa e senza NULL senza terminazione null della stringa e senza notificare al chiamante l'errore. Il chiamante non è sicuro presupporre che lo spazio insufficiente sia la condizione di errore. Se lpString1 non è sufficientemente grande da contenere la stringa copiata, può verificarsi un sovraccarico del buffer. Inoltre, quando si copia un'intera stringa, si noti che sizeof restituisce il numero di byte anziché WCHAR, che sizeof restituisce il numero di byte anziché i caratteri, che non è corretto per la versione Unicode di questa funzione. I sovraccarichi del buffer possono causare un attacco Denial of Service all'applicazione se si verifica una violazione di accesso. Nel peggiore dei casi, un sovraccarico del buffer può consentire a un utente malintenzionato di inserire codice eseguibile nel processo, soprattutto se lpString1 è un buffer basato su stack. Prendere invece in considerazione l'uso di StringCchCopy. |
lstrlen | lstrlen presuppone che lpString sia una stringa con terminazione Null. In caso contrario, questo potrebbe causare un sovraccarico del buffer o un attacco Denial of Service all'applicazione. Prendere in considerazione l'uso di una delle alternative seguenti. StringCbLength o StringCchLength. |
wsprintf | La stringa restituita in lpOut non è garantita la terminazione null. Evitare anche il formato %s, che può causare un sovraccarico del buffer. Se si verifica una violazione di accesso, si verifica un attacco Denial of Service all'applicazione. Nel peggiore dei casi, un utente malintenzionato può inserire codice eseguibile. Prendere in considerazione l'uso di una delle alternative seguenti. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintf o StringCchVPrintfEx. |
wvsprintf | La stringa restituita in lpOutput non è garantita la terminazione null. Evitare inoltre l'uso del formato %s, che può causare un sovraccarico del buffer. Ciò può causare un attacco Denial of Service se si verifica una violazione di accesso o un utente malintenzionato potrebbe inserire codice eseguibile. Prendere in considerazione l'uso di una delle alternative seguenti. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintf o StringCchVPrintfEx. |
Argomenti correlati