在我的项目中解决Veracode Scanner的预约问题我一直有问题。我创建了一个函数来验证文件,但它没有通过veracode扫描程序;
以下是我的功能代码:
public static string GetSafeFileName(string fileNameToValidate)
{
fileNameToValidate= fileNameToValidate.Replace("'", "''").Replace(@"../", "").Replace(@"..\", "");
char[] blackListChars = System.IO.Path.GetInvalidPathChars();
char[] blackListFilename = System.IO.Path.GetInvalidFileNameChars();
foreach (var invalidChar in blackListChars)
{
if (fileNameToValidate.Contains(invalidChar))
{
fileNameToValidate = fileNameToValidate.Replace(invalidChar, ' ').Trim();
}
}
string fullPath = Path.GetFullPath(fileNameToValidate);
string directoryName = Path.GetDirectoryName(fullPath);
string fileName = Path.GetFileName(fullPath);
foreach (var invalidChar in blackListFilename)
{
if (fileName.Contains(invalidChar))
{
fileName = fileName.Replace(invalidChar, ' ').Trim();
}
}
string finalPath = Path.Combine(directoryName, fileName);
return finalPath;
}
我必须修改Veracode扫描仪中的cwe 73预约有哪些变化?有人可以帮帮我吗?
我的项目是在.net 4.0上运行的Windows窗体
谢谢,
布鲁诺
答案 0 :(得分:2)
我试图在java上下文中解决类似的问题。我们使用ESAPI作为外部库。您可以查看esapi项目(了解如何在项目中实现更好的解决方案):https://github.com/ESAPI/esapi-java-legacy
实际上使用esapi验证器并没有解决veracode 的问题,但在我看来,降低了攻击的风险。使用这样的库,您可以确保用户无法从父文件夹中读取文件(您必须对此类目录进行硬编码)并且用户无法读取具有不正确扩展名的文件 - >您可以添加带有文件扩展名的列表。但是这个库不能保证你不能使用允许的扩展来操纵父目录中的文件。
因此,如果您认为所有需要的文件路径验证都已完成,您必须通过设计请求缓解或开发包含项目中所有所需文件资源的Map,以确保用户无法操作外部文件。
此外,如果您认为已创建了良好的文件路径验证,则可以使用清洁程序注释来标记方法。在这里,您可以阅读有关定制清洁剂的更多信 https://help.veracode.com/reader/DGHxSJy3Gn3gtuSIN2jkRQ/xrEjru~XmUHpO6~0FSae2Q
答案 1 :(得分:2)
你的问题是Veracode实际上没有检测到你的代码在做什么,它检测到正在调用(或不调用)什么清理函数。如果您登录Veracode并在“支持的清洁功能”上搜索帮助,您将找到以您的语言检测到的列表。
不幸的是,.Net的列表中没有包含CWE-73的任何内容。
因此,您的解决方案是使用自定义清洁剂注释将您的功能标记为CWE-73的清洁剂。搜索Veracode帮助“注释自定义清洁剂”。
using Veracode.Attributes;
[FilePathCleanser]
public static string GetSafeFileName(string fileNameToValidate)
{
...
也就是说,您的实现不安全。尝试传入“C:\ Windows \ System32 \ notepad.exe”作为要写入的文件名,您将看到问题所在。
黑名单只能处理您的期望。白名单是一种更强大的方法。您的方法应基于目录白名单,文件名字符白名单和文件扩展名白名单。