如何通过Java安全管理器限制深层继承链中恶意子类的文件写权限

星婷大大_7276

星婷大大_7276

2026-06-28

206人浏览

原创

securitymanager不依赖继承链深度,而是基于调用栈在文件写操作时触发checkwrite进行运行时拦截。它通过检查所有调用者的权限上下文实现精准阻断,无论恶意子类继承多深或如何包装,只要最终调用fileoutputstream、files.write等api,即被拦截。

如何通过java安全管理器限制深层继承链中恶意子类的文件写权限

Java SecurityManager 本身不直接识别“继承链深度”,它只在敏感操作发生时(如调用 FileOutputStream 构造、Files.write 等)触发权限检查,检查依据是当前执行栈中**所有调用者的代码源和权限上下文**,而非类的继承层级。因此,限制“深层继承链中的恶意子类写文件”,关键不是追踪继承几层,而是确保:无论子类多深、包装多绕,只要最终触发了文件写行为,checkWrite 就能拦截。

核心机制:基于调用栈的运行时检查

SecurityManager 的设计哲学是“守门人”而非“谱系审查员”。它不解析类结构或继承关系,而是在 JVM 执行到受保护操作(例如 new FileOutputStream(...))时,自动调用 checkWrite(String file),并传入目标路径。此时 JVM 已将完整调用栈(包括最外层用户代码、中间工具类、底层 JDK 类)提供给安全管理器。

  • 你重写的 checkWrite 方法可访问当前线程的全部调用栈(通过 Thread.currentThread().getStackTrace() 可辅助调试,但非必需)
  • 真正起作用的是:只要该方法抛出 SecurityException,JVM 就立即中断操作,不管调用者是 MyApp、UtilsHelper 还是 EvilSubSubSubClass
  • 即使恶意类继承了 10 层、用了反射或动态代理调用写操作,只要最终落入 JVM 文件 I/O 路径,checkWrite 必然被触发

自定义 SecurityManager 精准拦截写操作

只需覆盖 checkWrite,无需关心继承深度。以下是最简有效实现:

public class StrictFileWriteBlocker extends SecurityManager {
    @Override
    public void checkWrite(String file) {
        // 拦截所有写操作(也可加路径白名单逻辑)
        throw new SecurityException("禁止任何文件写入,拒绝来自: " + 
            (file != null ? "路径[" + file + "]" : "空路径"));
    }

    // 可选:同时拦截文件删除、创建等关联操作
    @Override
    public void checkDelete(String file) {
        throw new SecurityException("禁止文件删除");
    }
}

启用方式(推荐启动参数,避免代码中误设):

java -Djava.security.manager -Djava.security.policy==/dev/null MyApp

Java Maven Code Review
Java Maven Code Review

审查Java Maven项目(ZIP压缩包或GitLab仓库URL),检查代码规范、命名、模块边界、可维护性问题以及重复代码。

下载

注意:policy==/dev/null 表示不加载任何显式权限,让自定义 SecurityManager 全权裁决;若需部分放行(如仅允许写临时目录),则配合策略文件使用。

搭配策略文件实现细粒度白名单

若需允许特定路径写入(如仅限 /tmp/sandbox/),应结合 policy 文件与自定义检查:

  • 策略文件 allow-tmp-write.policy 内容:
grant {
    permission java.io.FilePermission "/tmp/sandbox/-", "write,read,delete";
};
  • 自定义管理器中保留策略检查(调用父类)+ 额外校验:
@Override
public void checkWrite(String file) {
    // 先走标准策略检查(会根据 policy 文件判断是否授权)
    super.checkWrite(file);
    // 再加一层业务规则:禁止写入 /etc/、/root/ 等敏感路径
    if (file != null && (file.startsWith("/etc/") || file.startsWith("/root/"))) {
        throw new SecurityException("敏感系统路径禁止写入: " + file);
    }
}

启动命令:

java -Djava.security.manager -Djava.security.policy=allow-tmp-write.policy MyApp

为什么不用依赖继承分析?

试图通过 getClass().getSuperclass() 或遍历 getDeclaredClasses() 来判断“是否为深层子类”,既不可靠也不安全:

  • 恶意代码可使用 Unsafe、字节码生成(ASM)、模块层绕过等手段规避反射检查
  • 继承链可能跨模块、跨类加载器,Class 对象比较易失效
  • JVM 安全模型的设计原则是“最小权限 + 运行时阻断”,而非“静态结构审计”
  • SecurityManager 的废弃(自 Java 17 起标记为 deprecated,Java 21 后移除)也正因其耦合过重、难以维护,现代方案倾向沙箱容器(如 JVM 隔离进程)或语言级限制(如密封类+模块系统)

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

9817

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

6962

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6152

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1064

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

888

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1296

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2569

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

19911

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1155

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习