我在VB.Net源上运行了IBM AppScan工具,在路径遍历类别下的File.Copy方法中遇到了一个安全问题。
问题详细信息-漏洞类型- PathTraversal此接口接受目录和/或文件名。如果使用用户提供的数据创建文件路径,则可以对该路径进行操作,使其指向不允许访问或可能包含恶意数据或代码的目录和文件。
如何解决此问题?
Imports System.Web.Security.AntiXss
Private Function ProcessFile() As Boolean
Dim drive As String = String.Empty
Dim folder As String = String.Empty
Dim filename As String = String.Empty
Dim sourcePath As String = String.Empty
Dim destinationPath As String = String.Empty
drive = AntiXssEncoder.XmlEncode(String.Format("{0}", System.Configuration.ConfigurationManager.AppSettings("Drive").ToString()))
folder = AntiXssEncoder.XmlEncode(String.Format("{0}", System.Configuration.ConfigurationManager.AppSettings("Folder").ToString()))
filename = AntiXssEncoder.XmlEncode(String.Format("{0}", System.Configuration.ConfigurationManager.AppSettings("File").ToString()))
sourcePath = Path.Combine(drive, folder, filename)
destinationPath = Path.Combine(drive, folder, "text2.txt")
Try
If sourcePath.IndexOfAny(Path.GetInvalidPathChars()) = -1 AndAlso destinationPath.IndexOfAny(Path.GetInvalidPathChars()) = -1 Then
File.Copy(sourcePath, destinationPath, True)
Return True
Else
Return False
End If
Catch ex As Exception
Return False
End Try
End Function发布于 2016-09-20 03:56:30
它可能认为AppSettings是不受信任的用户输入(我见过Java源对AppScan项目中的配置做类似的操作),所以它抱怨您正在创建一个包含不受信任的输入的路径,其中可能包含分隔符。
如果drive,folder和filename中的任何一个确实来自不可信,这肯定是一个问题。但是,假设只有受信任的管理员才能访问您的配置,这不算什么。把config当做未经检查的源码是很愚蠢的,但污点跟踪工具通常也是很愚蠢的。
这里对文件名的处理相当古怪。在使用文件名之前对其进行XML编码似乎不太可能是一个好主意;ToString和Format步骤完全是多余的;而且检查整个路径中的“无效”字符也不能防止来自单个部分的注入。这个东西是不是试图绕过AppScan?InvalidPathChars检查不会有什么帮助,因为它不会直接编码/验证和返回受污染的值,而XmlEncode只有在该函数被显式标记为验证/编码函数时才会有帮助。
为了满足静态分析器的迟钝工具,让代码变得更糟糕是很可悲的。您是否可以添加一个函数作为AppSettings值的包装器,并告诉AppScan它是一个验证/编码函数,这样它就不会认为这些值被污染了?或者只是忽略/静默虚假的警告?
发布于 2016-10-07 23:14:05
System.Configuration.ConfigurationManager.AppSettings可以被认为是一个安全的来源,你可以只排除这些发现,这样它就不会再次出现。
另一方面,这种代码可以被认为具有较差的安全编码实践。如果您将"System.Configuration.ConfigurationManager.AppSettings“替换为类似web UI输入的内容,则最终用户可以控制”文件夹“、”驱动器“和”文件名“的值,这将成为一个严重的路径遍历问题。
https://stackoverflow.com/questions/39569715
复制相似问题