Delen via


Beveiligingsoverwegingen: Microsoft Windows Shell

Dit onderwerp bevat informatie over beveiligingsoverwegingen met betrekking tot de Windows Shell. Dit document kan niet alles bieden wat u moet weten over beveiligingsproblemen. Gebruik dit document in plaats daarvan als uitgangspunt en verwijzing voor dit specifieke technologiegebied.

De Shell beheert een aantal belangrijke aspecten van het systeem, waaronder verschillende aspecten die potentiële beveiligingsrisico's opleveren als ze niet goed worden afgehandeld. In dit onderwerp vindt u een overzicht van enkele veelvoorkomende problemen en hoe u deze in uw toepassingen kunt oplossen. Houd er rekening mee dat beveiliging niet beperkt is tot aanvallen op internet. Op gedeelde systemen, inclusief systemen die toegankelijk zijn via Terminal Services, moet u er ook voor zorgen dat gebruikers niets kunnen doen dat anderen die het systeem delen, kunnen schaden.

Uw toepassing correct installeren

Het merendeel van de mogelijke Shell-beveiligingsproblemen kan worden beperkt door uw toepassing correct te installeren.

  • Installeer de toepassing onder de map Program Files.

    Besturingssysteem Plaats
    Windows XP, Windows Server 2003 en eerder CSIDL_PROGRAM_FILES
    Windows Vista en hoger FOLDERID_ProgramFiles, FOLDERID_ProgramFilesX86, FOLDERID_ProgramFilesX64, FOLDERID_ProgramFilesCommon, FOLDERID_ProgramFilesCommonX86 of FOLDERID_ProgramFilesCommonX64. Zie KNOWNFOLDERID voor specifieke informatie.

     

  • Sla geen gebruikersgegevens op onder de map Program Files.

    Gebruik de juiste gegevensmap voor gegevens die gebruikelijk zijn voor alle gebruikers.

    Besturingssysteem Plaats
    Windows XP, Windows Server 2003 en eerder CSIDL_COMMON_APPDATA
    Windows Vista en hoger FOLDERID_ProgramData

     

    Gebruik de juiste map met gebruikersgegevens voor gegevens die deel uitmaken van een bepaalde gebruiker.

    Besturingssysteem Plaats
    Windows XP, Windows Server 2003 en eerder CSIDL_APPDATA, CSIDL_PERSONAL en andere.
    Windows Vista en hoger FOLDERID_RoamingAppData, FOLDERID_Documents en andere.

     

  • Als u moet installeren op een andere locatie dan de map Program Files, moet u ervoor zorgen dat u toegangsbeheerlijsten (ACL's) correct instelt, zodat gebruikers geen toegang hebben tot ongepaste onderdelen van het bestandssysteem. Alle gegevens die specifiek zijn voor een bepaalde gebruiker, moeten een ACL hebben die voorkomt dat andere gebruikers toegang tot deze toegang hebben.

  • Wanneer u bestandskoppelingen instelt, moet u de opdrachtregel correct opgeven. Gebruik een volledig gekwalificeerd pad en verpakt alle elementen die witruimte tussen aanhalingstekens bevatten. Opdrachtparameters tussen afzonderlijke aanhalingstekens laten teruglopen. Anders kan de tekenreeks onjuist worden geparseerd en wordt de toepassing niet goed gestart. Hier ziet u twee voorbeelden van correct gevormde opdrachtregels.

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

Notitie

De locatie van de standaardinstallatiemappen kan variëren van systeem tot systeem. Als u de locatie van een standaardmap op een bepaald Windows Vista- of hogersysteem wilt ophalen, roept u SHGetKnownFolderPath- aan met de juiste KNOWNFOLDERID waarde. Roep in Windows XP, Windows Server 2003 of eerdere systemen SHGetFolderLocation of SHGetFolderPath aan met de juiste CSIDL- waarde.

 

Shlwapi

De Shell Lightweight-API (Shlwapi) bevat een aantal tekenreeksmanipulatiefuncties. Als u deze functies onjuist gebruikt, kan dit leiden tot onverwacht afgekapte tekenreeksen zonder melding dat de afkapping wordt geretourneerd. In de volgende gevallen mogen de Shlwapi-functies niet worden gebruikt. De vermelde alternatieve functies, die minder risico's vormen, moeten op hun plaats worden gebruikt.

Shlwapi, functie Alternatieve functie
StrCat-,StrNCat- StringCchCat, StringCbCat- en gerelateerde functies
StrCpy-, StrCpyN- StringCchCopy, StringCbCopy- en gerelateerde functies
wnsprintf, wvnsprintf StringCchPrintf, StringCbPrintf en gerelateerde functies

 

Met functies zoals PathRelativePathTo die een bestandspad retourneren, stelt u altijd de grootte van de buffer in op MAX_PATH tekens. Dit zorgt ervoor dat de buffer groot genoeg is om het grootst mogelijke bestandspad op te slaan, plus een afsluit null-teken.

Zie Over Strsafe.hvoor meer informatie over de alternatieve tekenreeksfuncties.

Automatisch aanvullen

Gebruik de functie Automatisch aanvullen niet voor wachtwoorden.

Er zijn verschillende Shell-functies die u kunt gebruiken om toepassingen te starten: ShellExecute, ShellExecuteEx, WinExecen SHCreateProcessAsUserW. Zorg ervoor dat u een ondubbelzinnige definitie opgeeft van de toepassing die moet worden uitgevoerd.

  • Wanneer u het pad van het uitvoerbare bestand opgeeft, geeft u het volledig gekwalificeerde pad op. Niet afhankelijk van de Shell om het bestand te vinden.
  • Als u een opdrachtregeltekenreeks opgeeft die witruimte bevat, verpakt u de tekenreeks tussen aanhalingstekens. Anders kan de parser één element interpreteren dat spaties als meerdere elementen bevat.

Bestanden verplaatsen en kopiëren

Eén sleutel voor systeembeveiliging is het correct toewijzen van ACL's. U kunt ook versleutelde bestanden gebruiken. Zorg ervoor dat wanneer u bestanden verplaatst of kopieert, de juiste ACL is toegewezen en dat ze niet per ongeluk zijn ontsleuteld. Dit omvat het verplaatsen van bestanden naar de Prullenbak, evenals binnen het bestandssysteem. Gebruik IFileOperation (Windows Vista of hoger) of SHFileOperation (Windows XP en eerder). Gebruik MoveFileniet, waardoor de verwachte ACL mogelijk niet is ingesteld voor het doelbestand.

Veilige naamruimteextensies schrijven

Shell-naamruimteextensies zijn een krachtige en flexibele manier om gegevens aan de gebruiker te presenteren. Ze kunnen echter systeemfouten veroorzaken als ze niet correct zijn geschreven. Enkele belangrijke punten om rekening mee te houden:

  • Neem niet aan dat gegevens zoals afbeeldingen correct zijn opgemaakt.
  • Neem niet aan dat MAX_PATH gelijk is aan het aantal bytes in een tekenreeks. Het is het aantal tekens.

Beveiligingswaarschuwingen

De volgende tabel bevat een aantal functies die, indien onjuist gebruikt, de beveiliging van uw toepassingen kunnen in gevaar komen.

Gelaatstrek Verzachting
ShellExecute, ShellExecuteEx Zoekopdrachten die afhankelijk zijn van het controleren van een reeks standaardlocaties om een specifiek bestand te vinden, kunnen worden gebruikt bij een spoofing-aanval. Gebruik een volledig gekwalificeerd pad om ervoor te zorgen dat u toegang krijgt tot het gewenste bestand.
StrCat- Het eerste argument, psz1, moet groot genoeg zijn om psz2- en de sluiting '\0' vast te houden, anders kan er een bufferoverschrijding optreden. Gebruik in plaats daarvan een van de volgende alternatieven. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat, StringCchCatEx, StringCchCatNof StringCchCatNEx.
StrCatBuff- De uiteindelijke tekenreeks is niet gegarandeerd null-beëindigd. Gebruik in plaats daarvan een van de volgende alternatieven. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat, StringCchCatEx, StringCchCatNof StringCchCatNEx.
StrCatChainW- De uiteindelijke tekenreeks is niet gegarandeerd null-beëindigd. Gebruik in plaats daarvan een van de volgende alternatieven. StringCbCatEx, StringCbCatNEx, StringCchCatExof StringCchCatNEx.
StrCpy- Het eerste argument, psz1, moet groot genoeg zijn om psz2- en de sluiting '\0' vast te houden, anders kan er een bufferoverschrijding optreden. Gebruik in plaats daarvan een van de volgende alternatieven. StringCbCopy, StringCbCopyEx, StringCbCopyN, StringCbCopyNEx, StringCchCopy, StringCchCopyEx, StringCchCopyNof StringCchCopyNEx.
StrCpyN- De gekopieerde tekenreeks is niet gegarandeerd null-beëindigd. Gebruik in plaats daarvan een van de volgende alternatieven. StringCbCopy, StringCbCopyEx, StringCbCopyN, StringCbCopyNEx, StringCchCopy, StringCchCopyEx, StringCchCopyN, StringCchCopyNEx.
StrDup- StrDup ervan uit dat lpsz- een tekenreeks is die null-beëindigd is. Verder is de geretourneerde tekenreeks niet gegarandeerd null-beëindigd. Gebruik in plaats daarvan een van de volgende alternatieven. StringCbCat, StringCbCopyEx, StringCbCopyN, StringCbCopyNEx, StringCchCopy, StringCchCopyEx, StringCchCopyNof StringCchCopyNEx.
StrNCat- Het eerste argument, pszFront, moet groot genoeg zijn om pszBack- en de sluiting '\0' vast te houden, anders kan er een bufferoverschrijding optreden. Houd er rekening mee dat het laatste argument, cchMax, het aantal tekens is dat moet worden gekopieerd naar pszFront, niet noodzakelijkerwijs de grootte van de pszFront in bytes. Gebruik in plaats daarvan een van de volgende alternatieven. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat, StringCchCatEx, StringCchCatNof StringCchCatNEx.
wnsprintf- De gekopieerde tekenreeks is niet gegarandeerd null-beëindigd. Gebruik in plaats daarvan een van de volgende alternatieven. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintfof StringCchVPrintfEx.
wvnsprintf- De gekopieerde tekenreeks is niet gegarandeerd null-beëindigd. Gebruik in plaats daarvan een van de volgende alternatieven. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintfof StringCchVPrintfEx.

 

Microsoft Security

Security Developer Center-

Microsoft Solution Accelerators

Security TechCenter-

Over Strsafe.h