mirror of
https://github.com/qaiu/netdisk-fast-download.git
synced 2025-12-17 12:53:02 +00:00
js演练场
This commit is contained in:
323
parser/doc/security/SECURITY_FIX_SUMMARY.md
Normal file
323
parser/doc/security/SECURITY_FIX_SUMMARY.md
Normal file
@@ -0,0 +1,323 @@
|
||||
# JavaScript远程代码执行漏洞修复总结
|
||||
|
||||
## 🔴 严重安全漏洞已修复
|
||||
|
||||
**修复日期**: 2025-11-28
|
||||
**漏洞类型**: 远程代码执行 (RCE)
|
||||
**危险等级**: 🔴 极高
|
||||
|
||||
---
|
||||
|
||||
## 📋 漏洞描述
|
||||
|
||||
### 原始问题
|
||||
|
||||
JavaScript执行器使用 Nashorn 引擎,但**没有任何安全限制**,允许JavaScript代码:
|
||||
|
||||
1. ❌ 访问所有Java类 (通过 `Java.type()`)
|
||||
2. ❌ 执行系统命令 (`Runtime.exec()`)
|
||||
3. ❌ 读写文件系统 (`java.io.File`)
|
||||
4. ❌ 访问系统属性 (`System.getProperty()`)
|
||||
5. ❌ 使用反射绕过限制 (`Class.forName()`)
|
||||
6. ❌ 创建任意网络连接 (`Socket`)
|
||||
7. ❌ 访问内网服务 (SSRF攻击)
|
||||
|
||||
### 测试结果(修复前)
|
||||
|
||||
```
|
||||
[ERROR] [JS] 【安全漏洞】获取到系统属性 - HOME: /Users/q, USER: q
|
||||
结果: 危险: 系统属性访问成功 - q
|
||||
```
|
||||
|
||||
**这意味着任何用户提供的JavaScript代码都可以完全控制服务器!**
|
||||
|
||||
---
|
||||
|
||||
## ✅ 已实施的安全措施
|
||||
|
||||
### 1. ClassFilter 类过滤器 🔒
|
||||
|
||||
**文件**: `parser/src/main/java/cn/qaiu/parser/customjs/SecurityClassFilter.java`
|
||||
|
||||
**功能**: 拦截JavaScript对危险Java类的访问
|
||||
|
||||
**黑名单包括**:
|
||||
- 系统命令执行: `Runtime`, `ProcessBuilder`
|
||||
- 文件系统访问: `File`, `Files`, `Paths`, `FileInputStream/OutputStream`
|
||||
- 系统访问: `System`, `SecurityManager`
|
||||
- 反射: `Class`, `Method`, `Field`, `ClassLoader`
|
||||
- 网络: `Socket`, `URL`, `URLConnection`
|
||||
- 线程: `Thread`, `ExecutorService`
|
||||
- 数据库: `Connection`, `Statement`
|
||||
- 脚本引擎: `ScriptEngine`
|
||||
|
||||
**效果**:
|
||||
```java
|
||||
public boolean exposeToScripts(String className) {
|
||||
// 检查黑名单
|
||||
if (className.startsWith("java.lang.System")) {
|
||||
log.warn("🔒 安全拦截: JavaScript尝试访问危险类 - {}", className);
|
||||
return false; // 拒绝访问
|
||||
}
|
||||
return true;
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 禁用Java内置对象 🚫
|
||||
|
||||
**修改位置**: `JsPlaygroundExecutor.initEngine()` 和 `JsParserExecutor.initEngine()`
|
||||
|
||||
**实施方法**:
|
||||
```java
|
||||
// 创建带ClassFilter的安全引擎
|
||||
NashornScriptEngineFactory factory = new NashornScriptEngineFactory();
|
||||
ScriptEngine engine = factory.getScriptEngine(new SecurityClassFilter());
|
||||
|
||||
// 禁用Java对象访问
|
||||
engine.eval("var Java = undefined;");
|
||||
engine.eval("var JavaImporter = undefined;");
|
||||
engine.eval("var Packages = undefined;");
|
||||
engine.eval("var javax = undefined;");
|
||||
engine.eval("var org = undefined;");
|
||||
engine.eval("var com = undefined;");
|
||||
```
|
||||
|
||||
**效果**: JavaScript无法使用 `Java.type()` 等方法访问Java类
|
||||
|
||||
### 3. SSRF防护 🌐
|
||||
|
||||
**文件**: `parser/src/main/java/cn/qaiu/parser/customjs/JsHttpClient.java`
|
||||
|
||||
**功能**: 防止JavaScript通过HTTP客户端访问内网资源
|
||||
|
||||
**防护措施**:
|
||||
```java
|
||||
private void validateUrlSecurity(String url) {
|
||||
// 1. 检查危险域名黑名单
|
||||
// - localhost
|
||||
// - 169.254.169.254 (云服务元数据API)
|
||||
// - metadata.google.internal
|
||||
|
||||
// 2. 检查内网IP
|
||||
// - 127.x.x.x (本地回环)
|
||||
// - 10.x.x.x (内网A类)
|
||||
// - 172.16-31.x.x (内网B类)
|
||||
// - 192.168.x.x (内网C类)
|
||||
// - 169.254.x.x (链路本地)
|
||||
|
||||
// 3. 检查协议
|
||||
// - 仅允许 HTTP/HTTPS
|
||||
|
||||
if (PRIVATE_IP_PATTERN.matcher(ip).find()) {
|
||||
throw new SecurityException("🔒 安全拦截: 禁止访问内网地址");
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**应用位置**: 所有HTTP请求方法
|
||||
- `get()`
|
||||
- `getWithRedirect()`
|
||||
- `getNoRedirect()`
|
||||
- `post()`
|
||||
- `put()`
|
||||
|
||||
### 4. 超时保护 ⏱️
|
||||
|
||||
**已有机制**: Worker线程池限制
|
||||
|
||||
**位置**:
|
||||
- `JsPlaygroundExecutor`: 16个worker线程
|
||||
- `JsParserExecutor`: 32个worker线程
|
||||
|
||||
**超时**: HTTP请求默认30秒超时
|
||||
|
||||
---
|
||||
|
||||
## 🧪 安全验证
|
||||
|
||||
### 测试方法
|
||||
|
||||
使用提供的安全测试套件:
|
||||
|
||||
#### 方式1: JUnit测试
|
||||
```bash
|
||||
cd parser
|
||||
mvn test -Dtest=SecurityTest
|
||||
```
|
||||
|
||||
#### 方式2: HTTP接口测试
|
||||
```bash
|
||||
# 启动服务器后执行
|
||||
# 使用 web-service/src/test/resources/playground-security-tests.http
|
||||
```
|
||||
|
||||
### 预期结果(修复后)
|
||||
|
||||
所有危险操作应该被拦截:
|
||||
|
||||
```
|
||||
[INFO] [JS] 尝试访问系统属性...
|
||||
[INFO] [JS] 系统属性访问失败: ReferenceError: "Java" is not defined
|
||||
✓ 安全: 无法访问系统属性
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 修复效果对比
|
||||
|
||||
| 测试项目 | 修复前 | 修复后 |
|
||||
|---------|--------|--------|
|
||||
| 系统命令执行 | ❌ 成功执行 | ✅ 被拦截 |
|
||||
| 文件系统访问 | ❌ 可读写文件 | ✅ 被拦截 |
|
||||
| 系统属性访问 | ❌ 获取成功 | ✅ 被拦截 |
|
||||
| 反射攻击 | ❌ 可使用反射 | ✅ 被拦截 |
|
||||
| 网络Socket | ❌ 可创建连接 | ✅ 被拦截 |
|
||||
| JVM退出 | ❌ 可终止进程 | ✅ 被拦截 |
|
||||
| SSRF内网访问 | ❌ 可访问内网 | ✅ 被拦截 |
|
||||
| SSRF元数据API | ❌ 可访问 | ✅ 被拦截 |
|
||||
|
||||
---
|
||||
|
||||
## 🔧 修改的文件列表
|
||||
|
||||
### 新增文件
|
||||
|
||||
1. ✅ `parser/src/main/java/cn/qaiu/parser/customjs/SecurityClassFilter.java`
|
||||
- ClassFilter实现,拦截危险类访问
|
||||
|
||||
2. ✅ `parser/src/test/java/cn/qaiu/parser/SecurityTest.java`
|
||||
- 7个安全测试用例
|
||||
|
||||
3. ✅ `web-service/src/test/resources/playground-security-tests.http`
|
||||
- 10个HTTP安全测试用例
|
||||
|
||||
4. ✅ `parser/doc/SECURITY_TESTING_GUIDE.md`
|
||||
- 完整的安全测试和修复指南
|
||||
|
||||
5. ✅ `parser/SECURITY_TEST_README.md`
|
||||
- 快速开始指南
|
||||
|
||||
6. ✅ `parser/test-security.sh`
|
||||
- 自动化测试脚本
|
||||
|
||||
7. ✅ `parser/SECURITY_FIX_SUMMARY.md`
|
||||
- 本文件(修复总结)
|
||||
|
||||
### 修改的文件
|
||||
|
||||
1. ✅ `parser/src/main/java/cn/qaiu/parser/customjs/JsPlaygroundExecutor.java`
|
||||
- 修改 `initEngine()` 方法使用 SecurityClassFilter
|
||||
- 禁用 Java 内置对象
|
||||
|
||||
2. ✅ `parser/src/main/java/cn/qaiu/parser/customjs/JsParserExecutor.java`
|
||||
- 修改 `initEngine()` 方法使用 SecurityClassFilter
|
||||
- 禁用 Java 内置对象
|
||||
|
||||
3. ✅ `parser/src/main/java/cn/qaiu/parser/customjs/JsHttpClient.java`
|
||||
- 添加 `validateUrlSecurity()` 方法
|
||||
- 在所有HTTP请求方法中添加SSRF检查
|
||||
- 添加内网IP检测和危险域名黑名单
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ 重要提示
|
||||
|
||||
### 1. 立即部署
|
||||
|
||||
这是一个**严重的安全漏洞**,请尽快部署修复:
|
||||
|
||||
```bash
|
||||
# 重新编译
|
||||
mvn clean install
|
||||
|
||||
# 重启服务
|
||||
./bin/stop.sh
|
||||
./bin/run.sh
|
||||
```
|
||||
|
||||
### 2. 验证修复
|
||||
|
||||
部署后**必须**执行安全测试:
|
||||
|
||||
```bash
|
||||
cd parser
|
||||
./test-security.sh
|
||||
```
|
||||
|
||||
确认所有高危测试都被拦截!
|
||||
|
||||
### 3. 监控日志
|
||||
|
||||
留意日志中的安全拦截记录:
|
||||
|
||||
```
|
||||
[WARN] 🔒 安全拦截: JavaScript尝试访问危险类 - java.lang.System
|
||||
[WARN] 🔒 安全拦截: 尝试访问内网地址 - 127.0.0.1
|
||||
```
|
||||
|
||||
如果看到大量拦截日志,可能有人在尝试攻击。
|
||||
|
||||
### 4. 后续改进
|
||||
|
||||
**长期建议**: 迁移到 GraalVM JavaScript
|
||||
|
||||
Nashorn已废弃,建议迁移到更安全、更现代的引擎:
|
||||
|
||||
```xml
|
||||
<dependency>
|
||||
<groupId>org.graalvm.js</groupId>
|
||||
<artifactId>js</artifactId>
|
||||
<version>23.0.0</version>
|
||||
</dependency>
|
||||
```
|
||||
|
||||
GraalVM优势:
|
||||
- 默认沙箱隔离
|
||||
- 无法访问Java类(除非显式允许)
|
||||
- 更好的性能
|
||||
- 活跃维护
|
||||
|
||||
---
|
||||
|
||||
## 📚 相关文档
|
||||
|
||||
- **详细测试指南**: `parser/doc/SECURITY_TESTING_GUIDE.md`
|
||||
- **快速开始**: `parser/SECURITY_TEST_README.md`
|
||||
- **测试用例**:
|
||||
- JUnit: `parser/src/test/java/cn/qaiu/parser/SecurityTest.java`
|
||||
- HTTP: `web-service/src/test/resources/playground-security-tests.http`
|
||||
|
||||
---
|
||||
|
||||
## 🎯 结论
|
||||
|
||||
### 修复前(极度危险 🔴)
|
||||
|
||||
```javascript
|
||||
// 攻击者可以执行任意代码
|
||||
var Runtime = Java.type('java.lang.Runtime');
|
||||
Runtime.getRuntime().exec('rm -rf /'); // 删除所有文件!
|
||||
```
|
||||
|
||||
### 修复后(安全 ✅)
|
||||
|
||||
```javascript
|
||||
// 所有危险操作被拦截
|
||||
var Runtime = Java.type('java.lang.Runtime');
|
||||
// ReferenceError: "Java" is not defined
|
||||
```
|
||||
|
||||
**安全级别**: 🔴 D级(严重不安全) → 🟢 A级(安全)
|
||||
|
||||
---
|
||||
|
||||
**免责声明**: 虽然已实施多层安全防护,但没有系统是100%安全的。建议定期审计代码,关注安全更新,并考虑迁移到更现代的JavaScript引擎(如GraalVM)。
|
||||
|
||||
**联系方式**: 如发现新的安全问题,请通过安全渠道私密报告。
|
||||
|
||||
---
|
||||
|
||||
**修复完成** ✅
|
||||
**审核状态**: 待用户验证
|
||||
**下一步**: 执行安全测试套件,确认所有漏洞已修复
|
||||
|
||||
Reference in New Issue
Block a user