Sdílet prostřednictvím


Důležité informace o zabezpečení: Microsoft Windows Shell

Toto téma obsahuje informace o aspektech zabezpečení souvisejících s prostředím Windows Shell. Tento dokument nemůže poskytnout vše, co potřebujete vědět o problémech se zabezpečením – místo toho ho použijte jako výchozí bod a odkaz na tuto konkrétní oblast technologií.

Prostředí řídí řadu důležitých aspektů systému, včetně několika, které představují potenciální bezpečnostní rizika, pokud nejsou řádně zpracovány. Toto téma popisuje některé z nejběžnějších problémů a jejich řešení ve vašich aplikacích. Mějte na paměti, že zabezpečení není omezeno na internetové zneužití. Ve sdílených systémech, včetně systémů, které jsou přístupné prostřednictvím Terminálové služby, musíte také zajistit, aby uživatelé nemohli dělat nic, co by mohlo poškodit ostatní, kteří sdílejí systém.

Správně nainstalovat aplikaci

Většinu potenciálních problémů se zabezpečením prostředí je možné zmírnit správnou instalací aplikace.

  • Nainstalujte aplikaci do složky Program Files.

    Operační systém Umístění
    Windows XP, Windows Server 2003 a starší CSIDL_PROGRAM_FILES
    Windows Vista a novější FOLDERID_ProgramFiles, FOLDERID_ProgramFilesX86, FOLDERID_ProgramFilesX64, FOLDERID_ProgramFilesCommon, FOLDERID_ProgramFilesCommonX86 nebo FOLDERID_ProgramFilesCommonX64. Konkrétní informace najdete v KNOWNFOLDERID.

     

  • Neukládejte uživatelská data do složky Program Files.

    Pro data, která jsou společná pro všechny uživatele, použijte příslušnou složku dat.

    Operační systém Umístění
    Windows XP, Windows Server 2003 a starší CSIDL_COMMON_APPDATA
    Windows Vista a novější FOLDERID_ProgramData

     

    Pro data, která patří konkrétnímu uživateli, použijte příslušnou složku dat uživatele.

    Operační systém Umístění
    Windows XP, Windows Server 2003 a starší CSIDL_APPDATA, CSIDL_PERSONAL a další.
    Windows Vista a novější FOLDERID_RoamingAppData, FOLDERID_Documents a další.

     

  • Pokud je nutné nainstalovat do jiného umístění než složka Program Files, ujistěte se, že jste správně nastavili seznamy řízení přístupu (ACL), aby uživatelé neměli přístup k nevhodným částem systému souborů. Všechna data specifická pro konkrétního uživatele by měla mít seznam ACL, který brání jakémukoli jinému uživateli v přístupu k němu.

  • Při nastavování přidružení souborů nezapomeňte správně zadat příkazový řádek. Použijte plně kvalifikovanou cestu a zabalte všechny prvky, které obsahují prázdné znaky v uvozovkách. Zalomení parametrů příkazu do samostatných uvozovek V opačném případě může být řetězec nesprávně analyzován a aplikace se nespustí správně. Tady jsou uvedeny dva příklady správně vytvořených příkazových řádků.

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

Poznámka

Umístění standardních instalačníchsch Chcete-li získat umístění standardní složky v určitém systému Windows Vista nebo novější, zavolejte SHGetKnownFolderPath s příslušnou POLEFOLDERID hodnotu. V systému Windows XP, Windows Server 2003 nebo starších systémech volejte SHGetFolderLocation nebo SHGetFolderPath s odpovídající hodnotou CSIDL.

 

Shlwapi

Rozhraní Shell Lightweight API (Shlwapi) obsahuje řadu funkcí pro manipulaci s řetězci. Nesprávné použití těchto funkcí může vést k neočekávaně zkráceným řetězcům bez oznámení o vrácení zkrácení. V následujících případech by se neměly používat funkce Shlwapi. Uvedené alternativní funkce, které představují méně rizik, by měly být použity na jejich místě.

Shlwapi – funkce Alternativní funkce
StrCat,StrNCat StringCchCat, StringCbCat a související funkce
StrCpy, StrCpyN StringCchCopy, StringCbCopy a související funkce
wnsprintf, wvnsprintf StringCchPrintf, StringCbPrintf a související funkce

 

U funkcí, jako je PathRelativePathTo, které vrací cestu k souboru, vždy nastavte velikost vyrovnávací paměti na MAX_PATH znaky. Tím zajistíte, že je vyrovnávací paměť dostatečně velká, aby držela největší možnou cestu k souboru a ukončující znak null.

Další informace o alternativních řetězcových funkcích naleznete v tématu O strsafe.h.

Automatické dokončování

Nepoužívejte funkci automatického dokončování pro hesla.

Ke spouštění aplikací můžete použít několik funkcí prostředí: ShellExecute, ShellExecuteEx, WinExeca SHCreateProcessAsUserW. Ujistěte se, že zadáte jednoznačnou definici aplikace, která se má spustit.

  • Při zadávání cesty spustitelného souboru zadejte plně kvalifikovanou cestu. Nezávisí na prostředí pro vyhledání souboru.
  • Pokud zadáte řetězec příkazového řádku, který obsahuje prázdné znaky, zabalte řetězec do uvozovek. V opačném případě může analyzátor interpretovat jeden prvek, který obsahuje mezery jako více prvků.

Přesouvání a kopírování souborů

Jedním z klíčů k zabezpečení systému je správné přiřazování seznamů ACL. Můžete také použít šifrované soubory. Ujistěte se, že při přesouvání nebo kopírování souborů jsou přiřazeny správné seznamy ACL a že nebyly omylem dešifrovány. To zahrnuje přesun souborů do koša také v systému souborů. Použijte IFileOperation (Windows Vista nebo novější) nebo SHFileOperation (Windows XP a starší). Nepoužívejte MoveFile, což nemusí nastavit očekávaný seznam ACL cílového souboru.

Zápis rozšíření zabezpečeného oboru názvů

Rozšíření oboru názvů prostředí představují výkonný a flexibilní způsob prezentace dat uživateli. Pokud ale nejsou správně napsané, můžou způsobit selhání systému. Některé klíčové body, které je potřeba mít na paměti:

  • Nepředpokládáte, že jsou data, jako jsou obrázky, správně naformátovaná.
  • Nepředpokládáme, že MAX_PATH odpovídá počtu bajtů v řetězci. Jedná se o počet znaků.

Výstrahy zabezpečení

Následující tabulka uvádí některé funkce, které můžou v případě nesprávného použití ohrozit zabezpečení vašich aplikací.

Rys Zmírnění
ShellExecute, ShellExecuteEx Hledání, která závisí na kontrole řady výchozích umístění a vyhledání konkrétního souboru, se dá použít při útoku na falšování identity. K zajištění přístupu k požadovanému souboru použijte plně kvalifikovanou cestu.
StrCat První argument, psz1, musí být dostatečně velký pro uložení psz2 a uzavření \0, jinak může dojít k přetečení vyrovnávací paměti. Místo toho použijte jednu z následujících alternativ. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat, StringCchCatEx, StringCchCatNnebo StringCchCatNEx.
strCatBuff Konečný řetězec není zaručen, že bude ukončen s hodnotou null. Místo toho použijte jednu z následujících alternativ. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat, StringCchCatEx, StringCchCatNnebo StringCchCatNEx.
StrCatChainW Konečný řetězec není zaručen, že bude ukončen s hodnotou null. Místo toho použijte jednu z následujících alternativ. StringCbCatEx, StringCbCatNEx, StringCchCatExnebo StringCchCatNEx.
StrCpy První argument, psz1, musí být dostatečně velký pro uložení psz2 a uzavření \0, jinak může dojít k přetečení vyrovnávací paměti. Místo toho použijte jednu z následujících alternativ. StringCbCopy, StringCbCopyEx, StringCbCopyN, StringCbCopyNEx, StringCchCopyEx, StringCchCopyEx, StringCchCopyNnebo StringCchCopyNEx.
StrCpyN Zkopírovaný řetězec není zaručen, že bude ukončen s hodnotou null. Místo toho použijte jednu z následujících alternativ. StringCbCopy, StringCbCopyEx, StringCbCopyN, StringCbCopyNEx, StringCchCopyEx, StringCchCopyEx, StringCchCopyN, StringCchCopyNEx.
StrDup StrDup předpokládá, že lpsz je řetězec ukončený hodnotou null. Vrácený řetězec navíc není zaručen, že bude ukončen s hodnotou null. Místo toho použijte jednu z následujících alternativ. StringCbCat, StringCbCopyEx, StringCbCopyN, StringCbCopyNEx, StringCchCopyEx, StringCchCopyEx, StringCchCopyNnebo StringCchCopyNEx.
StrNCat První argument, pszFront, musí být dostatečně velký pro uložení pszBack a závěr '\0', jinak může dojít k přetečení vyrovnávací paměti. Mějte na paměti, že poslední argument, cchMax, je počet znaků, které se mají zkopírovat do pszFront, nemusí nutně velikost pszFront v bajtech. Místo toho použijte jednu z následujících alternativ. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat, StringCchCatEx, StringCchCatNnebo StringCchCatNEx.
wnsprintf Zkopírovaný řetězec není zaručen, že bude ukončen s hodnotou null. Místo toho použijte jednu z následujících alternativ. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintfnebo StringCchVPrintfEx.
wvnsprintf Zkopírovaný řetězec není zaručen, že bude ukončen s hodnotou null. Místo toho použijte jednu z následujících alternativ. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintfnebo StringCchVPrintfEx.

 

Zabezpečení Microsoftu

Security Developer Center

akcelerátory řešení Microsoftu

Security TechCenter

o aplikaci Strsafe.h