C# 强化清洁规则不';Don’不要清洗一切

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.

我的团队最近开始在我们的.NET代码库(C#6和VB.NET)上使用Fortify Static Code Analyzer(17.10.0 156版),并且由于报告了大量误报而感到痛苦。对于任何给定的问题,我们不看它就无法知道它是否为假阳性,我们也不希望任何实际问题在混乱中迷失

我们有一个实用程序库,其中包含一个方法
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
  • 类别
将此文件传递到scan命令时,将从结果中筛选出与筛选文件中的任何字段匹配的任何查找

您可以在
\Samples\Advanced\filter

或者您可以查看附录B:过滤分析中的


*注意:您对使用过滤器的分析(在评论中)非常准确。

-1请再次尝试阅读该问题,此答案几乎将此场景的所有内容都弄错了,读起来是“做您说过已经做过的事情,但没有按应有的方式工作。”。Fortify不是在抱怨数据库出了什么,而是在抱怨数据库出了什么。(报告的漏洞是在命令上设置sql的地方,而不是在执行sql的地方,也不是在使用结果的地方(没有使用结果)。我添加了一个示例和注释,希望能更好地说明这一点。)。我报告的问题是,即使有规则,Fortify也不信任sql。Fortify没有显示“受污染”的输入来自何处。(为了更好地演示这一点,我添加了分析证据和图表的截图。)。未报告
ExecuteSomeLocalSql
ReadEmbeddedSQLLocalDefined
5'的漏洞再次写入其他清除规则报告的问题是,清除规则不能清除不信任。我知道我是普