我有一个运行在Windows Server 2012 R2和IIS 8.5上的ASP.NET Core Web应用程序。 IIS使用一对web.configconfigurationvariables来启动应用程序。 这是相关的web.config行:
<aspNetCore processPath="dotnet" arguments=".\MyWebsite.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false" />
processPathvariables是要运行的命令,而argumentsvariables指定要传递的参数。 将ASP.NET Core运行时添加到服务器时安装dotnet.exe 。 它位于目录C:\Program Files\dotnet 。 此path位于服务器的系统PATHvariables中,执行该命令的用户上下文(IIS应用程序池用户)具有该path的读/执行权限。
当我运行我的应用程序时,我得到一个IIS 502.5错误。 Windows日志报告如下:
物理根目录“C:\ Sites \ MyWebsite \”的应用程序“MACHINE / WEBROOT / APPHOST / MYWEBSITE”无法使用命令行“dotnet。\ MyWebsite.dll”启动进程,ErrorCode ='0x80004005:80008083。
但是,如果我更改web.config指定可执行文件的完整path(即C:\Program Files\dotnet\dotnet.exe而不是dotnet ),那么应用程序运行良好。
所以我的假设是由于某些原因,IIS无法访问系统环境variablesPATH 。 任何人都可以提出解决scheme 自安装ASP.NET Core运行时以来,我已经重新启动服务器。
当应用程序加载dynamic链接库或可执行而不指定完全限定的path时,Windows会尝试通过search定义良好的目录集来查找二进制文件。 这包括本地path,活动path和PATHvariables(说到像CMD这样的应用程序)。
如果攻击者获得了其中一个目录的控制权,就像IIS中的网站path一样,他们可以强制应用程序加载该文件的恶意副本,而不是它所期望的。 这些攻击被称为“预加载攻击”,对所有支持dynamic加载和/或共享库和二进制文件的操作系统来说都是常见的。
这种攻击的效果可能是攻击者可以在运行应用程序的用户(进程)的上下文中执行代码。 当以pipe理员身份运行应用程序池时,可能会导致本地特权提升。
这就是为什么很多系统进程不使用或不再使用PATH内容来search它们的二进制文件。
更多内容: 安全加载库以防止预加载攻击