fortify 抱怨 try-with-resources 块中的资源

Posted

技术标签:

【中文标题】fortify 抱怨 try-with-resources 块中的资源【英文标题】:fortify complains about resource in try-with-resources block 【发布时间】:2018-06-27 21:17:40 【问题描述】:

我有一个 try-with-resources 块,它启动了一些可自动关闭的对象

    try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("some-file), "UTF-8"))) 
         ......
     catch (IOException e) 
        .....
    

Fortify 扫描报告此问题

函数 ... in ... 有时 无法释放 FileInputStream() 分配的系统资源 行....

我想知道上面的代码有什么问题。我认为 try-with-resources 可以处理多个自动关闭的对象。任何想法是什么问题?谢谢。

【问题讨论】:

【参考方案1】:

当然 Fortify 会抱怨它不应该抱怨的事情(误报),但上面的代码实际上可能会泄漏 FileInputStream 对象。考虑一下如果 InputStreamReader 构造函数抛出异常会发生什么。在这种情况下,我们当然已经创建了 FileInputStream,但它不会被清理。

您似乎认为在实现 AutoCloseable 的表达式中遇到的每个对象都将由 try-with-resources 语句管理。但是,如果您查看语言规范:https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

try (VariableModifier R Identifier = Expression ...)
    Block

翻译成:


    final VariableModifierNoFinal R Identifier = Expression;
    Throwable #primaryExc = null;
...

因此,只有表达式的“最终结果”(在您的情况下为 BufferedReader)会自动关闭。 (通常,组合流/读取器/写入器沿链传播关闭操作,但请记住,我们的前提是其中一个构造函数因异常而失败。)

您可以通过为链中的每个元素声明单独的变量来解决编码问题:

        try (FileInputStream fis = new FileInputStream("some-file");
            InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
            BufferedReader bufferedReader = new BufferedReader(isr)) 
            //...
        

Fortify security issue "Unreleased resource stream" for try-with-resource 或多或少是相同的示例。

【讨论】:

以上是关于fortify 抱怨 try-with-resources 块中的资源的主要内容,如果未能解决你的问题,请参考以下文章

将字段设置为 null 时的 Java Null 取消引用 - Fortify

发生异常时如何正确关闭资源流

wvss漏洞扫描和fortify漏洞扫描的区别

Fortify:如何使用 fortify rest api 获取项目下的问题(漏洞)列表

如何覆盖验证规则登录 Laravel\Fortify?

coverity和fortify有啥区别