☢️ 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 |
安全机制 | ✅ 日志记录 + 沙箱限制 + 类/方法白名单 |
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容