Nashorn:潜伏在Java中的JavaScript命令执行后门

Nashorn:潜伏在Java中的JavaScript命令执行后门

原创 火力猫 季升安全 2025-04-16 16:17

☢️ Java 类对象的 JavaScript 引擎 —— Nashorn

🧠 什么是 Nashorn?

Nashorn 是 Oracle 在 Java 8
 引入的 JavaScript 引擎,用于在 Java 应用中嵌入执行 JavaScript 代码。它支持调用 Java 类与对象,在构建动态脚本、配置逻辑、嵌入 DSL(特定领域语言)场景中非常流行。

📌 Nashorn 在 Java 15 被正式移除
,但仍可通过插件或老版本运行时继续使用。

✨ 基本用法示例

import javax.script.*;public class NashornExample {    public static void main(String[] args) throws Exception {        ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");        engine.eval("print('Hello from JavaScript!')");        engine.eval("var date = new java.util.Date(); print(date);");    }}

✅ JavaScript 代码可调用 Java 类(如 java.util.Date
),实现强大的互操作能力。

💥 安全风险分析

Nashorn 的高权限访问能力,若未加以控制,将带来严重的 RCE 风险:

❗ 1. 任意 Java 类访问

var File = Java.type("java.io.File");var f = new File("/etc/passwd");print(f.exists());

⛔ 可访问任意文件,甚至系统关键配置。

❗ 2. 命令执行

var Runtime = Java.type("java.lang.Runtime");Runtime.getRuntime().exec("whoami");

⛔ 具备完全的命令执行能力和 java.lang.Runtime.exec()
 是等价的,相当于 Java 中直接执行 RCE。

❗ 3. 反射/系统配置修改

var System = Java.type("java.lang.System");System.setProperty("java.home", "/malicious");

⛔ 可通过反射动态加载类、设置系统属性等。

🧨 常见危险函数列表

函数/类 描述 风险
Java.type("java.lang.Runtime") 系统命令执行 🔥 高
Java.type("java.lang.ProcessBuilder") 系统命令拼接执行 🔥 高
Java.type("java.io.File") 文件任意读写 ⚠️ 中
Java.type("java.lang.ClassLoader") 加载自定义类 🔥 高
Java.type("java.lang.System") 环境变量修改 ⚠️ 中
Java.type("java.lang.reflect.*") 反射调用绕过限制 🔥 高
Java.type("javax.crypto.*") 加解密敏感操作 ⚠️ 中

🛡️ 安全防护建议

✅ 1. 禁用 Nashorn(如非必要)

  • Java 15+ 默认移除 Nashorn;

  • Java 8~14 可通过 JVM 参数移除:

--disable=nashorn

✅ 2. 严格控制脚本来源

  • 不允许用户上传自定义脚本;

  • 不接受未经验证的配置脚本执行;

  • 脚本使用白名单命令封装,不暴露底层对象。

✅ 3. 脚本执行沙箱化

  • 使用类白名单/方法签名控制脚本可访问内容;

  • 引入 SecurityManager
     替代机制;

  • 配合安全类加载器限制对关键包的访问。

✅ 4. 脚本日志 + 审计

  • 所有脚本执行内容、来源、执行时间应完整记录;

  • 建议接入安全审计系统,监控异常调用(如执行 Runtime.exec()
    、访问外部网络等)。

🔁 替代方案(推荐)

替代方案
特点
安全性
GraalVM JavaScript
现代、支持多语言、可配置沙箱机制
✅ 强
MVEL / SpEL / OGNL
简化脚本表达式,限制 Java API 访问
✅ 中等
ANTLR 自定义 DSL
精确定义语法,完全可控
✅ 最强
封装自定义命令 API
仅允许调用业务允许的方法
✅ 推荐

✅ 总结建议

项目
建议
使用 Nashorn
❌ 不推荐,存在高危风险
使用 JavaScript 脚本
✅ 推荐使用 GraalVM 并启用沙箱
用户自定义脚本
❌ 禁止,或使用封装命令 API
安全机制
✅ 日志记录 + 沙箱限制 + 类/方法白名单