调用使用从不受信任的数据构建的命令进行写入

时间:2018-12-05 19:27:53

标签: java findbugs fortify

代码:

outputStream.write(buffer, 0, length);
outputStream.flush();

强化错误消息:中等级别

SomeFile.java中的run()方法使用从不受信任的数据构建的命令调用write()。此调用可能导致程序代表攻击者执行恶意命令。

我该如何解决?

Java版本:1.8

代码类似于this

1 个答案:

答案 0 :(得分:0)

Fortify SCA列出了函数outputStream.write()具有接收器API。这意味着如果不可信和未经验证的数据到达该函数的输入参数将很危险。我不确定在哪里获取源缓冲区,但是在这里Fortify考虑到缓冲区变量(或length变量)可能被未经验证的数据污染了。有两种方法可以解决此问题:

  1. 您可以在FPR文件中将其标记为“误报”,并将其与所有新扫描合并,以便您的审核持续到下一次审核中。
  2. 您可以编写清除规则,在其中教导Fortify识别您的清除API。例如,您可能具有以下代码:

    buffer = getUntrustedDataFromWeb(Request);

Validator.validate(buffer); //white list the accepted characters (e.g. A-Z,a-z,0-9)

length = buffer.size();

outputStream.write(buffer, 0, length);

outputStream.flush();

清理自定义规则如下:

    <DataflowCleanseRule formatVersion="3.2" language="java">
    <MetaInfo>
        <Group name="package">Java Core Web</Group>
    </MetaInfo>
    <RuleID>702AB36D-4473-4CD5-B656-5D1040B59F07</RuleID>
    <Notes><![CDATA[
Validate the data]]></Notes>
    <FunctionIdentifier>
        <NamespaceName>
            <Value>com.web.util</Value>
        </NamespaceName>
        <ClassName>
            <Value>Validator</Value>
        </ClassName>
        <FunctionName>
            <Value>validate</Value>
        </FunctionName>
        <Parameters/>
        <ApplyTo implements="true" overrides="true" extends="true"/>
    </FunctionIdentifier>
    <OutArguments>this</OutArguments>
</DataflowCleanseRule>

下次运行Fortify时,您必须添加上述自定义规则(有关语法,请参见sourceanalyzer -h)。