为什么 Windows Server 2012 上的 IIS 无法访问系统环境变量?

为什么 Windows Server 2012 上的 IIS 无法访问系统环境变量?

我有一个在 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”启动进程,ErrorCode =“0x80004005:80008083”。

但是,如果我更改 web.config 以指定可执行文件的完整路径(即C:\Program Files\dotnet\dotnet.exe而不是dotnet),那么应用程序就可以正常运行。

因此,我的假设是,由于某种原因,IIS 无法访问系统环境变量PATH。有人能提出解决方案吗?自从安装 ASP.NET Core 运行时以来,我已经重新启动了服务器。

答案1

当应用程序加载动态链接库或可执行文件而未指定完整路径时,Windows 会尝试通过搜索一组明确定义的目录来定位二进制文​​件。这包括本地路径、活动路径和 PATH 变量(指尊重这些条件的应用程序,如 CMD)。

如果攻击者控制了某个目录(例如 IIS 中的网站路径),他们就可以强制应用程序加载文件的恶意副本,而不是预期的副本。这些攻击被称为“预加载攻击”,并且常见于所有支持动态加载和/或共享库和二进制文件的操作系统。

此类攻击的后果是,攻击者可以在运行应用程序的用户(进程)上下文中执行代码。当应用程序池以管理员身份运行时,这可能导致本地特权提升。

这就是为什么许多系统进程不使用或不再使用 PATH 内容来搜索它们的二进制文件的原因。

更多内容:安全加载库以防止预加载攻击

相关内容