Säkerhetsöverväganden: Microsoft Windows Shell
Det här avsnittet innehåller information om säkerhetsöverväganden som rör Windows Shell. Det här dokumentet kan inte ge allt du behöver veta om säkerhetsproblem– använd det i stället som utgångspunkt och referens för det här specifika teknikområdet.
Shell styr ett antal viktiga aspekter av systemet, inklusive flera som utgör potentiella säkerhetsrisker om de inte hanteras korrekt. Det här avsnittet beskriver några av de vanligaste problemen och hur du åtgärdar dem i dina program. Kom ihåg att säkerheten inte är begränsad till Internetbaserade kryphål. På delade system, inklusive system som är tillgängliga via Terminal Services, måste du också se till att användarna inte kan göra något som kan skada andra som delar systemet.
- installera programmet korrekt
- Shlwapi
- Komplettera automatiskt
- ShellExecute, ShellExecuteEx och relaterade funktioner
- flytta och kopiera filer
- Skriva tillägg för säkert namnområde
- säkerhetsaviseringar
- Relaterade ämnen
Installera programmet korrekt
De flesta potentiella Shell-säkerhetsproblem kan åtgärdas genom att programmet installeras korrekt.
Installera programmet under mappen Programfiler.
Operativsystem Plats Windows XP, Windows Server 2003 och tidigare CSIDL_PROGRAM_FILES Windows Vista och senare FOLDERID_ProgramFiles, FOLDERID_ProgramFilesX86, FOLDERID_ProgramFilesX64, FOLDERID_ProgramFilesCommon, FOLDERID_ProgramFilesCommonX86 eller FOLDERID_ProgramFilesCommonX64. Mer information finns i KNOWNFOLDERID-. Lagra inte användardata under mappen Programfiler.
Använd lämplig datamapp för data som är gemensamma för alla användare.
Operativsystem Plats Windows XP, Windows Server 2003 och tidigare CSIDL_COMMON_APPDATA Windows Vista och senare FOLDERID_ProgramData Använd lämplig användardatamapp för data som tillhör en viss användare.
Operativsystem Plats Windows XP, Windows Server 2003 och tidigare CSIDL_APPDATA, CSIDL_PERSONAL och andra. Windows Vista och senare FOLDERID_RoamingAppData, FOLDERID_Documents och andra. Om du måste installera på en annan plats än mappen Programfiler kontrollerar du att du ställer in åtkomstkontrollistor (ACL: er) korrekt så att användarna inte har åtkomst till olämpliga delar av filsystemet. Alla data som är specifika för en viss användare bör ha en ACL som hindrar andra användare från att komma åt den.
När du konfigurerar filassociationer måste du ange kommandoraden korrekt. Använd en fullständigt kvalificerad sökväg och omslut alla element som innehåller tomt utrymme inom citattecken. Radbryt kommandoparametrar inom separata citattecken. Annars kan strängen parsas felaktigt och programmet startas inte korrekt. Här visas två exempel på korrekt formade kommandorader.
"C:\Program Files\MyApp\MyApp.exe" "%1" "%2" C:\MyAppDir\MyApp\MyApp.exe "%1"
Not
Platsen för standardinstallationsmapparna kan variera från system till system. Om du vill hämta platsen för en standardmapp i ett visst Windows Vista- eller senare system anropar du SHGetKnownFolderPath med lämpligt KNOWNFOLDERID- värde. I Windows XP, Windows Server 2003 eller tidigare system anropar du SHGetFolderLocation eller SHGetFolderPath med rätt CSIDL- värde.
Shlwapi
Shell Lightweight API (Shlwapi) innehåller ett antal funktioner för strängmanipulering. Om du använder dessa funktioner felaktigt kan det leda till oväntat trunkerade strängar utan att någon avisering om trunkeringen returneras. I följande fall ska Shlwapi-funktionerna inte användas. De listade alternativa funktionerna, som utgör färre risker, bör användas i deras ställe.
Shlwapi-funktion | Alternativ funktion |
---|---|
StrCat,StrNCat | StringCchCat, StringCbCat och relaterade funktioner |
StrCpy, StrCpyN | StringCchCopy, StringCbCopy och relaterade funktioner |
wnsprintf, wvnsprintf | StringCchPrintf, StringCbPrintf och relaterade funktioner |
Med funktioner som PathRelativePathTo som returnerar en filsökväg anger du alltid buffertens storlek till MAX_PATH tecken. Detta säkerställer att bufferten är tillräckligt stor för att innehålla den största möjliga filsökvägen, plus ett avslutande null-tecken.
Mer information om de alternativa strängfunktionerna finns i About Strsafe.h.
Komplettera automatiskt
Använd inte funktionen Komplettera automatiskt för lösenord.
ShellExecute, ShellExecuteEx och relaterade funktioner
Det finns flera Shell-funktioner som du kan använda för att starta program: ShellExecute, ShellExecuteEx, WinExecoch SHCreateProcessAsUserW. Se till att du anger en entydig definition av programmet som ska köras.
- När du anger sökvägen till den körbara filen anger du den fullständigt kvalificerade sökvägen. Var inte beroende av gränssnittet för att hitta filen.
- Om du anger en kommandoradssträng som innehåller tomt utrymme omsluter du strängen inom citattecken. Annars kan parsern tolka ett enda element som innehåller blanksteg som flera element.
Flytta och kopiera filer
En nyckel till systemsäkerhet är att tilldela ACL:er korrekt. Du kan också använda krypterade filer. Kontrollera att när du flyttar eller kopierar filer, att de har tilldelats rätt ACL och att de inte har dekrypterats av misstag. Detta inkluderar att flytta filer till Papperskorgen, samt i filsystemet. Använd IFileOperation (Windows Vista eller senare) eller SHFileOperation (Windows XP och tidigare). Använd inte MoveFile, som kanske inte anger den förväntade ACL:en för målfilen.
Skriva tillägg för säkert namnområde
Shell-namnområdestillägg är ett kraftfullt och flexibelt sätt att presentera data för användaren. De kan dock orsaka systemfel om de inte är korrekt skrivna. Några viktiga punkter att tänka på:
- Anta inte att data som bilder är korrekt formaterade.
- Anta inte att MAX_PATH motsvarar antalet byte i en sträng. Det är antalet tecken.
Säkerhetsaviseringar
I följande tabell visas några funktioner som, om de används felaktigt, kan äventyra säkerheten för dina program.
Drag | Förmildrande omständighet |
---|---|
ShellExecute, ShellExecuteEx | Sökningar som är beroende av att kontrollera en serie standardplatser för att hitta en specifik fil kan användas i en förfalskningsattack. Använd en fullständigt kvalificerad sökväg för att se till att du får åtkomst till önskad fil. |
StrCat | Det första argumentet, psz1, måste vara tillräckligt stort för att hålla psz2 och den avslutande '\0', annars kan en buffertöverskridning inträffa. Använd något av följande alternativ i stället. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat, StringCchCatEx, StringCchCatNeller StringCchCatNEx. |
StrCatBuff | Den sista strängen garanteras inte vara null-avslutad. Använd något av följande alternativ i stället. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat, StringCchCatEx, StringCchCatNeller StringCchCatNEx. |
StrCatChainW | Den sista strängen garanteras inte vara null-avslutad. Använd något av följande alternativ i stället. StringCbCatEx, StringCbCatNEx, StringCchCatExeller StringCchCatNEx. |
StrCpy | Det första argumentet, psz1, måste vara tillräckligt stort för att hålla psz2 och den avslutande '\0', annars kan en buffertöverskridning inträffa. Använd något av följande alternativ i stället. StringCbCopy, StringCbCopyEx, StringCbCopyN, StringCbCopyNEx, StringCchCopy, StringCchCopyEx, StringCchCopyNeller StringCchCopyNEx. |
StrCpyN | Den kopierade strängen garanteras inte vara null-avslutad. Använd något av följande alternativ i stället. StringCbCopy, StringCbCopyEx, StringCbCopyN, StringCbCopyNEx, StringCchCopy, StringCchCopyEx, StringCchCopyN, StringCchCopyNEx. |
StrDup | StrDup förutsätter att lpsz är en null-avslutad sträng. Dessutom är den returnerade strängen inte garanterad att vara null-avslutad. Använd något av följande alternativ i stället. StringCbCat, StringCbCopyEx, StringCbCopyN, StringCbCopyNEx, StringCchCopy, StringCchCopyEx, StringCchCopyNeller StringCchCopyNEx. |
StrNCat | Det första argumentet, pszFront, måste vara tillräckligt stort för att hålla pszBack- och avslutande \0, annars kan en buffertöverskridning inträffa. Tänk på att det sista argumentet, cchMax, är antalet tecken som ska kopieras till pszFront, inte nödvändigtvis storleken på pszFront i byte. Använd något av följande alternativ i stället. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat, StringCchCatEx, StringCchCatNeller StringCchCatNEx. |
wnsprintf | Den kopierade strängen garanteras inte vara null-avslutad. Använd något av följande alternativ i stället. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintfeller StringCchVPrintfEx. |
wvnsprintf | Den kopierade strängen garanteras inte vara null-avslutad. Använd något av följande alternativ i stället. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintfeller StringCchVPrintfEx. |
Relaterade ämnen