Windows

為什麼 Windows Server 2012 上的 IIS 不能訪問系統環境變數?

  • October 24, 2017

我有一個在 Windows Server 2012 R2 和 IIS 8.5 上執行的 ASP.NET Core Web 應用程序。IIS 使用一對 web.config 配置變數來啟動應用程序。這是相關的 web.config 行:

<aspNetCore processPath="dotnet" arguments=".\MyWebsite.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false" />

processPath變數是要執行的命令,變數arguments指定要傳遞的參數。dotnet.exe在將 ASP.NET Core 執行時添加到伺服器時安裝。它位於目錄中C:\Program Files\dotnet。此路徑位於伺服器的系統PATH變數中,執行命令的使用者上下文(IIS 應用程序池使用者)對該路徑具有讀取/執行權限。

當我執行我的應用程序時,我得到一個 IIS 502.5 錯誤。Windows 日誌報告以下內容:

物理根目錄為“C:\Sites\MyWebsite\”的應用程序“MACHINE/WEBROOT/APPHOST/MYWEBSITE”無法使用命令行“dotnet .\MyWebsite.dll”啟動程序,錯誤程式碼 = ‘0x80004005:80008083。

但是,如果我更改 web.config 以指定執行檔的完整路徑(即C:\Program Files\dotnet\dotnet.exe,而不是dotnet),則應用程序執行良好。

所以我的假設是,由於某種原因 IIS 無法訪問系統環境變數PATH。任何人都可以提出解決方案嗎?安裝 ASP.NET Core 執行時後,我重新啟動了伺服器。

當應用程序載入動態連結庫或執行檔而不指定完全限定的路徑時,Windows 會嘗試通過搜尋定義明確的目錄集來定位二進製文件。這包括本地路徑、活動路徑和 PATH 變數(說到尊重它的應用程序,如 CMD)。

如果攻擊者控制了其中一個目錄,例如在 IIS 中的網站路徑上,他們可以強制應用程序載入文件的惡意副本,而不是預期的。這些攻擊被稱為“預載入攻擊”,在所有支持動態載入和/或共享庫和二進製文件的作業系統中都很常見。

此類攻擊的影響可能是攻擊者可以在執行應用程序的使用者(程序)的上下文中執行程式碼。當應用程序池以管理員身份執行時,這可能會導致本地特權提升。

這就是為什麼許多系統程序不使用或不再使用 PATH 內容來搜尋其二進製文件的原因。

更多內容:安全載入庫以防止預載入攻擊

引用自:https://serverfault.com/questions/879977