23-24

JNDI 如何做 Hook

1. 使用 Java Agent 动态修改字节码

这是最强大和最通用的 Hook 方法。Java Agent 可以在不修改源代码的情况下,在 JVM 运行时动态地修改类的字节码

  • 原理:创建一个 Java Agent,并在 JVM 启动时通过 -javaagent 参数加载它。在 Agent 的 premainagentmain 方法中,你可以使用 ASMJavassistByte Buddy 等字节码操作库,找到 InitialContext.lookup(name) 所在的类和方法
  • Hook 实现:找到目标方法后,可以修改它的字节码,在其原始逻辑执行前或执行后插入你自己的代码
    • 插入安全检查:在 lookup 方法的开头,插入一段代码来检查传入的 URL。你可以判断 URL 是否符合预设的白名单,或者直接拒绝所有远程 JNDI 请求
    • 记录日志:将 lookup 方法的参数和调用堆栈记录下来,以便进行审计
    • 修改返回对象:如果 URL 被判定为恶意,你可以修改 lookup 方法的返回值为一个安全的对象,而不是让其继续进行远程查找
  • 优点:非常灵活,可以 Hook 任何类的任何方法,无需访问源代码
  • 缺点:需要深入理解 Java 字节码,且实现起来比较复杂。