Considerazioni sulla sicurezza: Microsoft Windows Shell

In questo argomento vengono fornite informazioni sulle considerazioni sulla sicurezza correlate a Windows Shell. Questo documento non può fornire tutto ciò che è necessario conoscere sui problemi di sicurezza, ma usarlo come punto di partenza e riferimento per questa specifica area tecnologica.

Shell controlla alcuni aspetti importanti del sistema, tra cui diversi che presentano potenziali rischi di 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 alcuna operazione che potrebbe danneggiare altri utenti che condividono il sistema.

Installazione corretta dell'applicazione

La maggior parte dei potenziali problemi di sicurezza di Shell può essere mitigata correttamente installando l'applicazione.

  • Installare l'applicazione nella cartella Programmi.

    Sistema operativo Posizione
    Windows XP, Windows Server 2003 e versioni precedenti CSIDL_PROGRAM_FILES
    Windows Vista e versioni successive FOLDERID_ProgramFiles, FOLDERID_ProgramFilesX86, FOLDERID_ProgramFilesX64, FOLDERID_ProgramFilesCommon, FOLDERID_ProgramFilesCommonX86 o FOLDERID_ProgramFilesCommonX64. Per specifiche, vedere KNOWNFOLDERID .

     

  • Non archiviare i dati utente nella cartella Programmi.

    Usare la cartella dati appropriata per i dati comuni a tutti gli utenti.

    Sistema operativo Posizione
    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 Posizione
    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 installare 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 alle parti inappropriati del file system. Tutti i dati specifici di un determinato utente devono avere un elenco di controllo di controllo di accesso che impedisce a qualsiasi altro utente di accedervi.

  • Quando si configurano associazioni di file, assicurarsi di specificare correttamente la riga di comando. Usare un percorso completo e eseguire il wrapping di tutti gli elementi che contengono spazi vuoti tra virgolette. Eseguire il wrapping dei parametri dei comandi in virgolette separate. In caso contrario, la stringa potrebbe essere analizzata correttamente e l'applicazione non verrà avviata correttamente. Ecco due esempi di righe di comando formate correttamente.

    "C:\Program Files\MyApp\MyApp.exe" "%1" "%2"
    C:\MyAppDir\MyApp\MyApp.exe "%1"
    

Nota

Il percorso delle cartelle di installazione standard può variare dal sistema al sistema. Per ottenere il percorso di una cartella standard in un determinato 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 valore CSIDL appropriato.

 

Shlwapi

L'API Shell Lightweight (Shlwapi) include numerose funzioni di manipolazione delle stringhe. L'uso di queste funzioni in modo errato può causare stringhe troncate impreviste senza notifica del troncamento restituito. Nei casi seguenti, le funzioni Shlwapi non devono essere usate. Le funzioni alternative elencate, che rappresentano 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 file, impostare sempre le dimensioni del buffer su MAX_PATH caratteri. In questo modo si garantisce che il buffer sia abbastanza grande per contenere il percorso di file più grande possibile, oltre a un carattere null terminante.

Per altre informazioni sulle funzioni di stringa alternative, vedere Informazioni su Strsafe.h.

Completamento automatico

Non usare la funzionalità Completamento automatico per le password.

Esistono diverse funzioni shell che è possibile usare per avviare applicazioni: ShellExecute, ShellExecuteEx, WinExecuteESHCreateProcessAsUserW. Assicurarsi di specificare 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 spazio vuoto, 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, che vengono assegnati all'ACL corretto e che non siano stati decrittografati accidentalmente. Ciò include lo spostamento dei file nel Cestino, nonché all'interno del file system. Usare IFileOperation (Windows Vista o versioni successive) 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 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 presente:

  • Non presupporre che i dati come le immagini siano formattati correttamente.
  • Non si supponga che MAX_PATH equivale al numero di byte in una stringa. È il numero di caratteri.

Avvisi di sicurezza

Nella tabella seguente sono elencate alcune funzionalità che possono, se usate in modo errato, compromettere la sicurezza delle applicazioni.

Funzionalità Strategia di riduzione del rischio
ShellExecute, ShellExecuteEx Le ricerche che dipendono dal controllo di una serie di posizioni predefinite per trovare un file specifico possono essere usate in un attacco spoofing. Usare un percorso completo per assicurarsi di accedere al file desiderato.
StrCat Il primo argomento, psz1, deve essere abbastanza grande per contenere psz2 e la chiusura '\0', in caso contrario, potrebbe verificarsi un overrun del buffer. Usare invece una delle seguenti alternative. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat,StringCchCatEx, StringCchCatN o StringCchCatNEx.
StrCatBuff La stringa finale non è garantita la terminazione null. Usare invece una delle seguenti alternative. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat,StringCchCatEx, StringCchCatN o StringCchCatNEx.
StrCatChainW La stringa finale non è garantita la terminazione null. Usare invece una delle seguenti alternative. StringCbCatEx, StringCbCatNEx, StringCchCatEx o StringCchCatNEx.
Strcpy Il primo argomento, psz1, deve essere abbastanza grande per contenere psz2 e la chiusura '\0', in caso contrario, potrebbe verificarsi un overrun del buffer. Usare invece una delle seguenti alternative. StringCbCopy, StringCbCopyEx, StringCbCopyN, StringCbCopyNEx, StringCchCopy, StringCchCopyEx, StringCchCopyN o StringCchCopyNEx.
StrCpyN La stringa copiata non è garantita la terminazione null. Usare invece una delle seguenti alternative. StringCbCopy, StringCbCopyEx, StringCbCopyN, StringCbCopyNEx, StringCchCopy, StringCchCopyEx, StringCchCopyN,StringCchCopyNEx.
StrDup StrDup presuppone che lpsz sia una stringa con terminazione null. Inoltre, la stringa restituita non deve essere terminata con null. Usare invece una delle seguenti alternative. StringCbCat, StringCbCopyEx, StringCbCopyN, StringCbCopyNEx, StringCchCopy, StringCchCopyEx, StringCchCopyN o StringCchCopyNEx.
StrNCat Il primo argomento, pszFront, deve essere abbastanza grande per contenere pszBack e la chiusura '\0', in caso contrario, potrebbe verificarsi un overrun 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 seguenti alternative. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat,StringCchCatEx, StringCchCatN o StringCchCatNEx.
wnsprintf La stringa copiata non è garantita la terminazione null. Usare invece una delle seguenti alternative. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintfEx, StringCchPrintfEx, StringCchVPrintf o StringCchVPrintfEx.
wvnsprintf La stringa copiata non è garantita la terminazione null. Usare invece una delle seguenti alternative. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintfEx, StringCchPrintfEx, StringCchVPrintf o StringCchVPrintfEx.

 

Microsoft Security

Centro per sviluppatori dedicato alla sicurezza

Microsoft Solution Accelerator

Security TechCenter

Informazioni su Strsafe.h