2013年9月10日发布的Java SE 7 Update 40修复了空字节截断这个历史遗留问题。此次更新在java.io.File类中添加了一个isInvalid方法,专门检测文件名中是否包含了空字节。

    1. /**
    2. * Check if the file has an invalid path. Currently, the inspection of
    3. * a file path is very limited, and it only covers Nul character check.
    4. * Returning true means the path is definitely invalid/garbage. But
    5. * returning false does not guarantee that the path is valid.
    6. *
    7. * @return true if the file path is invalid.
    8. */
    9. final boolean isInvalid() {
    10. if (status == null) {
    11. status = (this.path.indexOf('\u0000') < 0) ? PathStatus.CHECKED
    12. : PathStatus.INVALID;
    13. }
    14. return status == PathStatus.INVALID;
    15. }

    修复的JDK版本所有跟文件名相关的操作都调用了isInvalid方法检测,防止文件名空字节截断。
    2. 文件名空字节漏洞历史 - 图1
    修复前(Java SE 7 Update 25)和修复后(Java SE 7 Update 40)的对比会发现Java SE 7 Update 25中的java.io.File类中并未添加\u0000的检测。
    2. 文件名空字节漏洞历史 - 图2
    受空字节截断影响的JDK版本范围:JDK<1.7.40,单是JDK7于2011年07月28日发布至2013年09月10日发表Java SE 7 Update 40这两年多期间受影响的就有16个版本,值得注意的是JDK1.6虽然JDK7修复之后发布了数十个版本,但是并没有任何一个版本修复过这个问题,而JDK8发布时间在JDK7修复以后所以并不受此漏洞影响。
    参考:

    1. JDK-8014846 : File and other classes in java.io do not handle embedded nulls properly
    2. 维基百科-Java版本歷史
    3. Oracle Java 历史版本下载