Considerazioni sulla sicurezza: Microsoft Windows Shell
In questo argomento vengono fornite informazioni sulle considerazioni sulla sicurezza correlate alla shell di Windows. Questo documento non può fornire tutte le informazioni necessarie per conoscere i problemi di sicurezza, ma usarlo come punto di partenza e riferimento per questa specifica area tecnologica.
Shell controlla diversi aspetti importanti del sistema, tra cui diversi che presentano potenziali rischi per la sicurezza se non vengono gestiti correttamente. Questo argomento illustra alcuni dei problemi più comuni e come risolverli nelle applicazioni. Tenere presente che la sicurezza non è limitata agli exploit basati su Internet. Nei sistemi condivisi, inclusi i sistemi accessibili tramite Servizi terminal, è anche necessario assicurarsi che gli utenti non possano eseguire operazioni che potrebbero danneggiare altri utenti che condividono il sistema.
- l'installazione corretta dell'applicazione
- Shlwapi
- completamento automatico
- ShellExecute, ShellExecuteEx e funzioni correlate
- lo spostamento e la copia di file
- scrittura di estensioni dello spazio dei nomi sicure
- avvisi di sicurezza
- argomenti correlati
Installazione corretta dell'applicazione
La maggior parte dei potenziali problemi di sicurezza della shell può essere mitigata installando correttamente l'applicazione.
Installare l'applicazione nella cartella Programmi.
Non archiviare i dati utente nella cartella Programmi.
Usare la cartella dati appropriata per i dati comuni a tutti gli utenti.
Sistema operativo Ubicazione Windows XP, Windows Server 2003 e versioni precedenti CSIDL_COMMON_APPDATA Windows Vista e versioni successive FOLDERID_ProgramData Usare la cartella dati utente appropriata per i dati appartenenti a un determinato utente.
Sistema operativo Ubicazione Windows XP, Windows Server 2003 e versioni precedenti CSIDL_APPDATA, CSIDL_PERSONAL e altri. Windows Vista e versioni successive FOLDERID_RoamingAppData, FOLDERID_Documents e altri. Se è necessario eseguire l'installazione in un percorso diverso dalla cartella Programmi, assicurarsi di impostare correttamente gli elenchi di controllo di accesso (ACL) in modo che gli utenti non abbiano accesso a parti non appropriate del file system. Tutti i dati specifici di un determinato utente devono avere un ACL che impedisce a qualsiasi altro utente di accedervi.
Quando si configurano le associazioni di file, assicurarsi di specificare correttamente la riga di comando. Usare un percorso completo ed eseguire il wrapping di tutti gli elementi che contengono spazi vuoti tra virgolette. Eseguire il wrapping dei parametri dei comandi tra virgolette separate. In caso contrario, la stringa potrebbe essere analizzata in modo non corretto e l'applicazione non verrà avviata correttamente. Di seguito sono riportati due esempi di righe di comando correttamente formate.
"C:\Program Files\MyApp\MyApp.exe" "%1" "%2" C:\MyAppDir\MyApp\MyApp.exe "%1"
Nota
Il percorso delle cartelle di installazione standard può variare da sistema a sistema. Per ottenere il percorso di una cartella standard in un particolare sistema Windows Vista o versione successiva, chiamare SHGetKnownFolderPath con il valore KNOWNFOLDERID appropriato. In Windows XP, Windows Server 2003 o sistemi precedenti chiamare SHGetFolderLocation o SHGetFolderPath con il valoreCSIDLappropriato.
Shlwapi
L'API Shell Lightweight (Shlwapi) include diverse funzioni di manipolazione delle stringhe. L'uso di queste funzioni in modo errato può causare stringhe troncate in modo imprevisto senza alcuna notifica del troncamento restituito. Nei casi seguenti, le funzioni Shlwapi non devono essere usate. Le funzioni alternative elencate, che comportano un minor numero di rischi, devono essere usate al loro posto.
Funzione Shlwapi | Funzione alternativa |
---|---|
StrCat,StrNCat | StringCchCat, StringCbCat e funzioni correlate |
StrCpy, StrCpyN | StringCchCopy, StringCbCopy e funzioni correlate |
wnsprintf, wvnsprintf | StringCchPrintf, StringCbPrintf e funzioni correlate |
Con funzioni come PathRelativePathTo che restituiscono un percorso di file, impostare sempre le dimensioni del buffer su MAX_PATH caratteri. In questo modo si garantisce che il buffer sia sufficientemente grande da contenere il percorso di file più grande possibile, oltre a un carattere Null di terminazione.
Per altre informazioni sulle funzioni di stringa alternative, vedere Informazioni su Strsafe.h.
Completamento automatico
Non usare la funzionalità completamento automatico per le password.
ShellExecute, ShellExecuteEx e Funzioni correlate
Esistono diverse funzioni shell che è possibile usare per avviare applicazioni: ShellExecute, ShellExecuteEx, WinExece SHCreateProcessAsUserW. Assicurarsi di fornire una definizione non ambigua dell'applicazione da eseguire.
- Quando si specifica il percorso del file eseguibile, specificare il percorso completo. Non dipendere dalla shell per individuare il file.
- Se si specifica una stringa della riga di comando contenente spazi vuoti, eseguire il wrapping della stringa tra virgolette. In caso contrario, il parser potrebbe interpretare un singolo elemento che contiene spazi come più elementi.
Spostamento e copia di file
Una chiave per la sicurezza del sistema è l'assegnazione corretta degli elenchi di controllo di accesso. È anche possibile usare file crittografati. Assicurarsi che quando si spostano o si copiano i file, a cui viene assegnato l'ACL corretto e che non siano stati accidentalmente decrittografati. Sono inclusi lo spostamento di file nel Cestino , nonché all'interno del file system. Usare IFileOperation (Windows Vista o versione successiva) o SHFileOperation (Windows XP e versioni precedenti). Non usare MoveFile, che potrebbe non impostare l'ACL previsto per il file di destinazione.
Scrittura di estensioni dello spazio dei nomi sicure
Le estensioni dello spazio dei nomi della shell sono un modo potente e flessibile per presentare i dati all'utente. Tuttavia, possono causare errori di sistema se non sono scritti correttamente. Alcuni punti chiave da tenere presenti:
- Non presupporre che i dati come le immagini siano formattati correttamente.
- Non presupporre che MAX_PATH sia equivalente al numero di byte in una stringa. È il numero di caratteri .
Avvisi di sicurezza
Nella tabella seguente sono elencate alcune funzionalità che, se usate in modo non corretto, comprometteno la sicurezza delle applicazioni.
Caratteristica | Mitigazione |
---|---|
ShellExecute, ShellExecuteEx | Le ricerche che dipendono dal controllo di una serie di percorsi predefiniti per trovare un file specifico possono essere usate in un attacco di spoofing. Usare un percorso completo per assicurarsi di accedere al file desiderato. |
StrCat | Il primo argomento, psz1, deve essere sufficientemente grande da contenere psz2 e la chiusura '\0'. In caso contrario, potrebbe verificarsi un sovraccarico del buffer. Usare invece una delle alternative seguenti. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat, StringCchCatEx, StringCchCatNo StringCchCatNEx. |
StrCatBuff | Non è garantito che la stringa finale sia con terminazione Null. Usare invece una delle alternative seguenti. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat, StringCchCatEx, StringCchCatNo StringCchCatNEx. |
StrCatChainW | Non è garantito che la stringa finale sia con terminazione Null. Usare invece una delle alternative seguenti. StringCbCatEx, StringCbCatNEx, StringCchCatExo StringCchCatNEx. |
StrCpy | Il primo argomento, psz1, deve essere sufficientemente grande da contenere psz2 e la chiusura '\0'. In caso contrario, potrebbe verificarsi un sovraccarico del buffer. Usare invece una delle alternative seguenti. StringCbCopy, StringCbCopyEx, StringCbCopyN, StringCbCopyNEx, StringCchCopy, StringCchCopyEx, StringCchCopyNo StringCchCopyNEx. |
StrCpyN | Non è garantito che la stringa copiata sia con terminazione Null. Usare invece una delle alternative seguenti. StringCbCopy, StringCbCopyEx, StringCbCopyN, StringCbCopyNEx, StringCchCopyEx, StringCchCopyEx, StringCchCopyN, StringCchCopyNEx. |
StrDup | StrDup presuppone che lpsz sia una stringa con terminazione Null. Inoltre, la stringa restituita non è garantita la terminazione null. Usare invece una delle alternative seguenti. StringCbCat, StringCbCopyEx, StringCbCopyN, StringCbCopyNEx, StringCchCopy, StringCchCopyEx, StringCchCopyNo StringCchCopyNEx. |
StrNCat | Il primo argomento, pszFront, deve essere sufficientemente grande da contenere pszBack e la chiusura '\0'. In caso contrario, potrebbe verificarsi un sovraccarico del buffer. Tenere presente che l'ultimo argomento, cchMax, è il numero di caratteri da copiare in pszFront, non necessariamente le dimensioni del pszFront in byte. Usare invece una delle alternative seguenti. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat, StringCchCatEx, StringCchCatNo StringCchCatNEx. |
wnsprintf | Non è garantito che la stringa copiata sia con terminazione Null. Usare invece una delle alternative seguenti. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintfo StringCchVPrintfEx. |
wvnsprintf | Non è garantito che la stringa copiata sia con terminazione Null. Usare invece una delle alternative seguenti. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintfo StringCchVPrintfEx. |
Argomenti correlati