Fortify 安全审查告知我们一些路径操纵漏洞。大多数都是显而易见且简单的修复,但我不明白如何修复以下问题。
string[] wsdlFiles = System.IO.Directory.GetFiles(wsdlPath, "*.wsdl");
“wsdlPath”是从文本框输入的。这是无法解决的问题吗?我可以验证路径是否存在等,但这对漏洞有何帮助?
Fortify 安全审查告知我们一些路径操纵漏洞。大多数都是显而易见且简单的修复,但我不明白如何修复以下问题。
string[] wsdlFiles = System.IO.Directory.GetFiles(wsdlPath, "*.wsdl");
“wsdlPath”是从文本框输入的。这是无法解决的问题吗?我可以验证路径是否存在等,但这对漏洞有何帮助?
如果数据总是从内容由用户决定的文本框中获取,并且代码使用该用户的权限运行,那么唯一的威胁就是用户攻击自己。这不是一个有趣的威胁。
该工具试图提醒您注意的漏洞是,如果低信任恶意代码可以确定该字符串的内容,那么恶意代码可以尝试发现有关用户机器的事实,例如“是这样那样的程序我碰巧知道安装了一个安全漏洞但没有打补丁?” 或“这台机器上是否有名为‘admin’的用户?” 等等。
您永远不应该将任何内容直接提供给未经过滤的 OS API。您应该清理输入,确保它不包含路径(即“../../../somefile”并确保它截断长名称,并且只包含有效的文件名字符(例如,有各种与国际字符有关的错误)。
使用该代码,任何经过身份验证和授权使用该功能的用户都能够访问服务器上的文件系统。访问将使用运行 Web 应用程序的服务帐户的凭据来完成。
根据返回数据的使用方式,恶意用户可能能够获取更多信息或使服务器以非预期方式运行。
您应该将允许的路径集限制为仅包含一个或几个精心选择的目录。使用Path
类中的函数将字符串组合成路径——它们负责处理用户c:\allowedpath\..\windows\system32
为您输入的内容。
这种场景需要编码和解码,以确保数据不会在任何地方被操纵。因为在解密时,如果数据被更改,您将得到错误的结果。
您可以创建您的编码和解码。我使用 System.Security.Cryptography 提供的 RijndaelManaged 和 PasswordDeriveBytes 类完成了它;