安全考量:Microsoft Windows殼牌

本主題提供與 Windows Shell 相關的安全考量資訊。 這份文件無法提供你所有關於安全議題的資訊——但請將其作為該特定技術領域的起點與參考。

殼牌控制系統的多項重要面向,其中包括若未妥善處理可能帶來安全風險的部分。 本主題概述了一些較常見的問題,以及如何在申請中解決這些問題。 請記住,安全不僅限於基於網際網路的漏洞利用。 在共享系統上,包括可透過終端服務存取的系統,你也必須確保使用者不會做出任何可能傷害其他共享系統使用者的行為。

正確安裝您的應用程式

大多數潛在的 Shell 安全問題可以透過正確安裝應用程式來減輕。

  • 在 Program Files 資料夾下安裝該應用程式。

    作業系統 地點
    Windows XP、Windows Server 2003 及更早版本 CSIDL_PROGRAM_FILES
    Windows Vista 及後續版本 FOLDERID_ProgramFiles、FOLDERID_ProgramFilesX86、FOLDERID_ProgramFilesX64、FOLDERID_ProgramFilesCommon、FOLDERID_ProgramFilesCommonX86或FOLDERID_ProgramFilesCommonX64。 詳情請參見 KNOWNFOLDERID

     

  • 請勿將使用者資料存放在程式檔案資料夾下。

    使用適當的資料資料夾來存放所有使用者共同的資料。

    作業系統 地點
    Windows XP、Windows Server 2003 及更早版本 CSIDL_COMMON_APPDATA
    Windows Vista 及後續版本 FOLDERID_ProgramData

     

    請使用屬於特定使用者的資料資料夾。

    作業系統 地點
    Windows XP、Windows Server 2003 及更早版本 CSIDL_APPDATA、CSIDL_PERSONAL 以及其他。
    Windows Vista 及後續版本 FOLDERID_RoamingAppData、FOLDERID_Documents 以及其他。

     

  • 如果你必須安裝到非 Program Files 資料夾的位置,請確保正確設定存取控制清單(ACL),避免使用者存取檔案系統中不適當的部分。 任何特定使用者的資料都應該有 ACL 防止其他使用者存取。

  • 當你設定檔案關聯時,務必正確指定命令列。 使用完全限定的路徑,並將包含空白的元素包覆引號。 用不同的引號包裹指令參數。 否則,字串可能會被誤解析,應用程式無法正常啟動。 這裡展示了兩個正確形成的命令列範例。

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

備註

標準安裝資料夾的位置可能因系統而異。 要取得特定Windows Vista或更新系統中標準資料夾的位置,請以相應的 KNOWNFOLDERID> 呼叫 <>SHGetKnownFolderPath<<以相應的 SHGetFolderLocationSHGetFolderPath 並使用相應的 c5c4>CSIDL 值。

 

施爾瓦皮

Shell 輕量級 API(Shlwapi)包含多種字串操作功能。 錯誤使用這些函式可能導致字串意外截斷,且不會收到截斷通知。 在以下情況下,不應使用 Shlwapi 函數。 上述風險較低的替代功能應被採用。

Shlwapi 函數 替代功能
StrCat,StrNCat StringCchCatStringCbCat 及相關函式
StrCpy,StrCpyN StringCchCopyStringCbCopy 及相關函式
WNSPRINTFWVNSPRINTF StringCchPrintfStringCbPrintf 及相關函式

 

PathRelativePathTo 這類回傳檔案路徑的函式,請將緩衝區大小設為 MAX_PATH 字元。 這樣做可以確保緩衝區足夠大,能容納最大可能的檔案路徑,加上一個終端的空字元。

欲了解更多替代字串函式的資訊,請參閱 About Strsafe.h

自動完成

請勿使用密碼自動補全功能。

你可以用幾個 Shell 函式來啟動應用程式: ShellExecuteShellExecuteExWinExecSHCreateProcessAsUserW。 務必提供明確且明確的應用程式定義。

  • 提供可執行檔案路徑時,請提供完全限定的路徑。 不要依賴 Shell 來定位檔案。
  • 如果你提供包含空白的命令列字串,請用引號包裹該字串。 否則,解析器可能會將包含空間的單一元素解釋為多個元素。

檔案移動與複製

系統安全的關鍵之一是正確指派 ACL。 你也可以使用加密檔案。 確保在移動或複製檔案時,它們被分配了正確的 ACL,且沒有被誤解密。 這包括將檔案移至 回收站,以及檔案系統內的操作。 使用 IFileOperation(Windows Vista 或更新版本)或 SHFileOperation(Windows XP 及更早版本)。 不要使用 MoveFile,因為它可能無法設定目標檔案的預期 ACL。

撰寫安全命名空間擴充

Shell 命名空間擴充是一種強大且靈活的方式,能向使用者呈現資料。 然而,如果它們寫得不正確,可能會導致系統故障。 以下是幾個重點:

  • 不要假設像圖片這類資料的格式是正確的。
  • 不要假設 MAX_PATH 等同於字串中的 位元組 數。 它是字 數量。

安全性警示

下表列出了一些若使用不當,可能會危及應用程式安全性的功能。

Feature 緩和措施
ShellExecute,ShellExecuteEx 依賴檢查一連串預設位置以尋找特定檔案的搜尋,可能會被用於偽造攻擊。 使用完全合格的路徑,確保你能存取所需的檔案。
StrCat 第一個參數 psz1 必須足夠大以容納 psz2 和閉尾的 '\0',否則可能會發生緩衝區超載。 改用以下其中一種替代方案。 StringCbCatStringCbCatExStringCbCatNStringCbCatNExStringCchCatStringCchCatExStringCchCatNStringCchCatNEx
StrCatBuff 最後一個字串不保證會被 null 終止。 改用以下其中一種替代方案。 StringCbCatStringCbCatExStringCbCatNStringCbCatNExStringCchCatStringCchCatExStringCchCatNStringCchCatNEx
StrCatChainW 最後一個字串不保證會被 null 終止。 改用以下其中一種替代方案。 StringCbCatExStringCbCatNExStringCchCatExStringCchCatNEx
StrCpy 第一個參數 psz1 必須足夠大以容納 psz2 和閉尾的 '\0',否則可能會發生緩衝區超載。 改用以下其中一種替代方案。 StringCbCopyStringCbCopyExStringCbCopyNStringCbCopyNExStringCchCopyStringCchCopyExStringCchCopyNStringCchCopyNEx
StrCpyN 複製的字串不保證會是 null 終止。 改用以下其中一種替代方案。 StringCbCopyStringCbCopyExStringCbCopyNStringCbCopyNExStringCchCopyStringCchCopyExStringCchCopyNStringCchCopyNEx
StrDup StrDup 假設 lpsz 是零終端字串。 此外,回傳的字串不保證是 null 終止。 改用以下其中一種替代方案。 StringCbCatStringCbCopyExStringCbCopyNStringCbCopyNExStringCchCopyStringCchCopyExStringCchCopyNStringCchCopyNEx
StrNCat 第一個參數 pszFront 必須足夠大以容納 pszBack 和閉尾的 '\0',否則可能會發生緩衝區超載。 請注意,最後一個參數 cchMax 是要複製到 pszFront 的字元數,不一定是 pszFront 的位元組大小。 改用以下其中一種替代方案。 StringCbCatStringCbCatExStringCbCatNStringCbCatNExStringCchCatStringCchCatExStringCchCatNStringCchCatNEx
WNSPRINTF 複製的字串不保證會是 null 終止。 改用以下其中一種替代方案。 StringCbPrintfStringCbPrintfExStringCbVPrintfStringCbVPrintfExStringCchPrintf、StringCchPrintfExStringCchVPrintf,或 StringCchVPrintfEx
WVNSPRINTF 複製的字串不保證會是 null 終止。 改用以下其中一種替代方案。 StringCbPrintfStringCbPrintfExStringCbVPrintfStringCbVPrintfExStringCchPrintf、StringCchPrintfExStringCchVPrintf,或 StringCchVPrintfEx

 

Microsoft 安全性

安全開發者中心

Microsoft 解決方案加速器

安全科技中心

關於 Strsafe.h