C# 强化清洁规则不';Don’不要清洗一切
我的团队最近开始在我们的.NET代码库(C#6和VB.NET)上使用Fortify Static Code Analyzer(17.10.0 156版),并且由于报告了大量误报而感到痛苦。对于任何给定的问题,我们不看它就无法知道它是否为假阳性,我们也不希望任何实际问题在混乱中迷失 我们有一个实用程序库,其中包含一个方法C# 强化清洁规则不';Don’不要清洗一切,c#,fortify,C#,Fortify,我的团队最近开始在我们的.NET代码库(C#6和VB.NET)上使用Fortify Static Code Analyzer(17.10.0 156版),并且由于报告了大量误报而感到痛苦。对于任何给定的问题,我们不看它就无法知道它是否为假阳性,我们也不希望任何实际问题在混乱中迷失 我们有一个实用程序库,其中包含一个方法ReadEmbeddedSql,该方法从程序集中嵌入的资源中提取sql以执行。强化标记任何执行此方法返回的sql且带有sql注入漏洞的OracleCommand(来自Oracle.
ReadEmbeddedSql
,该方法从程序集中嵌入的资源中提取sql以执行。强化标记任何执行此方法返回的sql且带有sql注入漏洞的OracleCommand
(来自Oracle.ManagedDataAccess.Client
)。
在命令上设置sql时报告此漏洞,无论是通过构造函数还是通过CommandText属性
如果在本地程序集中定义了ReadEmbeddedSql
方法,则不会执行此操作
下面是生成此结果的源代码的精简列表。在示例代码中,ExecuteSomeSql()
和ExecuteSomeSql()
标记有漏洞,而ExecuteSomeLocalSql()
没有
对于分析证据,它仅列出创建OracleCommand的行:
cs:27-OracleCommand()
规则ID:31D4607A-A3FF-447C-908A-CA2BBE4CE4B7
在该问题的细节中,它提供了:
在TestDao.cs的第27行,ExecuteSomeSql()方法调用SQL查询
使用来自不可信源的输入构建。这个电话可能
允许攻击者修改语句的含义或执行
任意SQL命令
Fortify为此问题提供的示例图:
经过多次搜索,我发现了这篇文章,描述了一个类似的问题和建议的解决方案:
遵循此处的说明,并在a(第90页)中独立验证说明后
结果没有改变。我添加了一个额外的“SQL注入验证规则”,具体描述为“…标识一个函数,该函数在SQL查询中使用数据之前正确验证数据。”
还是没有用
编辑:
我更多地使用了自定义规则,并且能够确定CustomCleanseRules是否实际被应用(它们确实移除了其他类型的污染),但没有移除一些特定于信任的标志Fortify应用于我们的内部库
我的库的任何方法返回的每个值都是不可信的,我创建的任何规则似乎都无法消除这种不信任
是我做错了什么事,还是强化不起作用
是否需要一种不同的规则来消除这种普遍的不信任
示例源代码:
图书馆:
namespace Our.Utilities.Database
{
public abstract class BaseDao
{
protected string ReadEmbeddedSql(string key)
{
//... extract sql from assembly
return sql;
}
}
}
在应用中:
namespace Our.Application.DataAccess
{
public class TestDao: Our.Utilities.Database.BaseDao
{
public void ExecuteSomeSql()
{
//... connection is created
// Fortify Does not trust sqlText returned from library method.
var sqlText = ReadEmbeddedSql("sql.for.ExecuteSomeSql");
using(var someSqlCommand = new OracleCommand(sqlText, connection)) // Fortify flags creation of OracleCommand as SqlInjection vulnerability.
{
someSqlCommand.ExecuteNonQuery();
}
}
public void ExecuteSomeSqlDifferently()
{
//... connection is created
// Fortify Does not trust sqlText returned from library method.
var sqlText = ReadEmbeddedSql("sql.for.ExecuteSomeSql");
using(var someSqlCommand = connection.CreateCommand())
{
someSqlCommand.CommandText = sqlText; //Fortify flags setting CommandText as SqlInjection vulnerability.
someSqlCommand.ExecuteNonQuery();
}
}
public void ExecuteSomeLocalSql()
{
//... connection is created
var sqlText = ReadEmbeddedSqlLocallyDefined("sql.for.ExecuteSomeSql");
using(var someSqlCommand = new OracleCommand(sqlText, connection))
{
someSqlCommand.ExecuteNonQuery();
}
}
protected string ReadEmbeddedSqlLocallyDefined(string key)
{
//... extract sql from assembly
return sql;
}
}
}
自定义规则的XML:
<?xml version="1.0" encoding="UTF-8"?>
<RulePack xmlns="xmlns://www.fortifysoftware.com/schema/rules">
<RulePackID>5A78FC44-4EEB-49C7-91DA-6564805C3F23</RulePackID>
<SKU>SKU-C:\local\path\to\custom\rules\Our-Utilities</SKU>
<Name><![CDATA[C:\local\path\to\custom\rules\Our-Utilities]]></Name>
<Version>1.0</Version>
<Description><![CDATA[]]></Description>
<Rules version="17.10">
<RuleDefinitions>
<DataflowCleanseRule formatVersion="17.10" language="dotnet">
<RuleID>7C49FEDA-AA67-490D-8820-684F3BDD58B7</RuleID>
<FunctionIdentifier>
<NamespaceName>
<Pattern>Our.Utilities.Database</Pattern>
</NamespaceName>
<ClassName>
<Pattern>BaseDao</Pattern>
</ClassName>
<FunctionName>
<Pattern>ReadSqlTemplate</Pattern>
</FunctionName>
<ApplyTo implements="true" overrides="true" extends="true"/>
</FunctionIdentifier>
<OutArguments>return</OutArguments>
</DataflowCleanseRule>
<DataflowCleanseRule formatVersion="17.10" language="dotnet">
<RuleID>14C423ED-5A51-4BA1-BAE1-075E566BE58D</RuleID>
<TaintFlags>+VALIDATED_SQL_INJECTION</TaintFlags>
<FunctionIdentifier>
<NamespaceName>
<Pattern>Our.Utilities.Database</Pattern>
</NamespaceName>
<ClassName>
<Pattern>BaseDao</Pattern>
</ClassName>
<FunctionName>
<Pattern>ReadSqlTemplate</Pattern>
</FunctionName>
<ApplyTo implements="true" overrides="true" extends="true"/>
</FunctionIdentifier>
<OutArguments>return</OutArguments>
</DataflowCleanseRule>
</RuleDefinitions>
</Rules>
</RulePack>
5A78FC44-4EEB-49C7-91DA-6564805C3F23
SKU-C:\local\path\to\custom\rules\Our Utilities
1
7C49FEDA-AA67-490D-8820-684F3BDD58B7
我们的.Utilities.Database
BaseDao
ReadSqlTemplate
返回
14C423ED-5A51-4BA1-BAE1-075E566BE58D
+验证的SQL注入
我们的.Utilities.Database
BaseDao
ReadSqlTemplate
返回
当我运行您的示例代码时(我必须修改它,因为它不会按原样编译)。当我使用SCA17.10和2017Q3运行它时(我在2017Q2也这样做了),我没有得到与您相同的SQL注入规则ID
查看您的分析证据,我假设发现这一点的分析器不是数据流或控制流,而是语义或结构流
通过查看“摘要”选项卡,可以查看找到该查找的分析器的类型:
不管怎样,我不认为我会在这里做一个自定义规则
您可以选择使用筛选文件
这是一个可以包含
- 规则ID
- 实例ID
- 类别
\Samples\Advanced\filter
或者您可以查看附录B:过滤分析中的
*注意:您对使用过滤器的分析(在评论中)非常准确。-1请再次尝试阅读该问题,此答案几乎将此场景的所有内容都弄错了,读起来是“做您说过已经做过的事情,但没有按应有的方式工作。”。Fortify不是在抱怨数据库出了什么,而是在抱怨数据库出了什么。(报告的漏洞是在命令上设置sql的地方,而不是在执行sql的地方,也不是在使用结果的地方(没有使用结果)。我添加了一个示例和注释,希望能更好地说明这一点。)。我报告的问题是,即使有规则,Fortify也不信任sql。Fortify没有显示“受污染”的输入来自何处。(为了更好地演示这一点,我添加了分析证据和图表的截图。)。未报告
ExecuteSomeLocalSql
和ReadEmbeddedSQLLocalDefined
5'的漏洞再次写入其他清除规则报告的问题是,清除规则不能清除不信任。我知道我是普