baidu/openrasp

hook缺失导致Oracle部分版本jdk无法拦截目录遍历攻击

xuing opened this issue · 6 comments

xuing commented

FileHook拦截了java.io.File中的list函数用于检测File.listFiles方法导致的目录遍历攻击。
image
至少在windows的jdk11当中,listFiles是直接调用的normalizedList方法。对normalizedList方法的hook缺失,导致了无法正常拦截。
如图为linux jdk11的listFiles实现。是调用的list方法。
image
下图为windows下jdk11的listFiles实现。是调用的normalizedList方法。
image

xuing commented

我暂时不想提PR一个一个版本去测了,我自己这边的临时解决方案是,直接给normalizedList也加上hook。
image

你好,我看了下全版本的JDK源码

  1. Linux JDK 6-15 无此函数
  2. Windows JDK 仅11.X版本存在,其他版本均不存在;从13开始list()直接调用nio了。

对于 Windows + JDK 11 的情况,normalizedList 函数为私有,最终底层调用的nio相关函数也是私有的。JDK需要增加java.base/java.io权限才能反射调用,正常业务不太可能增加这个。

因此整个影响很小,所以暂时不打算增加这个hook。

xuing commented

我是在测试官方测试用例集合的第一个测试用例,使用 File.listFiles 遍历目录发现的这个问题。
listFiles是一个公开函数,针对此类攻击,目前OpenRasp是在FileHook.java中按照TYPE.DIRECTORY进行检测的。

阅读目前FileHook的代码后,我猜测目前选择挂钩list方法,而不是直接HooklistFiles方法,是基于以下考虑的

  1. list方法是public的,可能会被业务直接使用。
  2. listFiles有多个方法签名,但均会调用list方法。

但Windows+Oracle JDK11情况下,listFiles中直接调用了normalizedList方法,没有调用list方法,虽然normalizedList方法是Private的,但业务只要使用到listFiles函数,就不会进入到Hook的检测逻辑当中。
除此之外,Windows+Oracle JDK1.8,也是同样的情况。
image
Windows+Oracle JDK16,也是同样的情况
image

我们的结论不同,目前看来,可能是Oracle JDK与OpenJDK的区别。

xuing commented

我特地去看了一些Linux+Oracle版本的jdk16的File.java实现。
listFiles方法中也是使用的normalizedList。
image

好的,Windows + JDK11 下面,listFiles() 这个是个问题

xuing commented

image
OracleJDK 1.8.0_331