序列化黑名单:分析如何通过配置 jdk.serialFilter 拦截危险的类反序列化变量

夜伟吖_6917

夜伟吖_6917

2026-05-06

611人浏览

原创

jdk.serialFilter 本质是白名单优先的过滤器,不支持可靠黑名单机制;应严格限定业务必需类、设置资源限制,并配合禁用默认类型、替换序列化方案等多重防护。

序列化黑名单:分析如何通过配置 jdk.serialfilter 拦截危险的类反序列化变量

jdk.serialFilter 不支持黑名单机制,它本质是白名单优先的过滤器。所谓“黑名单配置”在实践中不可靠、易绕过,且官方设计明确拒绝黑名单逻辑——试图用 !com.sun.* 或 !org.apache.commons.collections.* 这类排除规则来防御,反而会制造虚假安全感。

为什么 jdk.serialFilter 不能真正实现黑名单

过滤规则按顺序匹配,一旦某条规则命中(无论允许还是拒绝),后续规则不再生效。而危险 gadget 类往往来自第三方库(如 Jackson、FastJSON、Commons Collections),这些类名不固定、包路径多样、版本迭代频繁。更关键的是:

  • 攻击者可选用未被你“排除”的冷门 gadget 类,比如 sun.reflect.annotation.AnnotationInvocationHandler 或 javax.management.BadAttributeValueExpException,它们不在常见黑名单里却极常用
  • 用 !xxx 排除某个包,但 gadget 链可能跨多个包组合触发,单点排除毫无意义
  • JDK 自身部分内部类(如 sun.misc.Unsafe 相关路径)在低版本中无法被 filter 覆盖,且可通过非标准反序列化路径绕过

正确用法:严格白名单 + 限制资源消耗

应聚焦于“只放行业务必需的类”,配合深度、引用、字节等维度约束:

WriteGenie
WriteGenie

一款AI论文写作工具,主要用于一款专注于中英文AI降重与AIGC检测的智能工具,适合需要提升相关任务效率的用户。

下载
  • 基础包显式放行:如 java.base/*;java.desktop/*,确保 JDK 核心类可用
  • 业务模型精准限定:如 com.mycompany.dto.**;com.mycompany.model.**,用 ** 匹配子包,避免漏掉嵌套类
  • 全局兜底拒绝:末尾加 ;!* (注意分号和空格),确保未声明的类一律拦截
  • 附加资源限制:加上 maxdepth=5;maxrefs=100;maxbytes=1000000;maxarray=10000,防内存耗尽或深度嵌套攻击

典型错误配置与风险

以下写法看似合理,实则高危:

  • my.app.**;!* :放行整个业务包,但若引入了依赖库(如 com.fasterxml.jackson.databind.*),其内部类也会被一并放行,而这些类常含 gadget
  • !*;java.base/*;my.app.**:顺序错误,!* 在前直接拒绝全部,后面规则永不执行
  • -Djdk.serialFilter= 空值或仅设 maxbytes:等价于全放行,filterCheck 不触发校验

补充防线:不能只靠 jdk.serialFilter

该机制只是第一道轻量网关,不是银弹:

  • 对重写了 ObjectInputStream.resolveClass() 的代码无效——如果业务手动绕过 filter 加载类,配置即失效
  • RMI、JMX、HTTP Body、Redis、MQ 等所有接受字节流的地方,都需独立评估是否启用 filter
  • 优先替换原生序列化:用 Jackson(禁用 enableDefaultTyping)、Protobuf 或 Avro,从源头消除风险

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

黑名单

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

2026.10.28

20

16

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

2026.10.28

20

15

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

2026.10.28

0

10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

120

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

60

10

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

2026.10.22

60

15

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

2026.10.22

40

10

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

2026.10.22

60

25

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

2026.10.22

20

15

热门下载

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

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习