☢️ Java 类对象的 JavaScript 引擎 —— Nashorn
🧠 什么是 Nashorn?
Nashorn 是 Oracle 在 Java 8 引入的 JavaScript 引擎,用于在 Java 应用中嵌入执行 JavaScript 代码。它支持调用 Java 类与对象,在构建动态脚本、配置逻辑、嵌入 DSL(特定领域语言)场景中非常流行。
📌 Nashorn 在 Java 15 被正式移除,但仍可通过插件或老版本运行时继续使用。
✨ 基本用法示例
import javax.script.*;publicclassNashornExample{publicstaticvoidmain(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 |
|
|
ANTLR 自定义 DSL |
|
|
封装自定义命令 API |
|
|
✅ 总结建议
|
|
---|---|
|
|
|
|
|
|
|
|
原文始发于微信公众号(季升安全):Nashorn:潜伏在Java中的JavaScript命令执行后门
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论