基于java字节码的灰盒动态漏洞检测
如果无法正常显示,请先停止浏览器的去广告插件。
1. 基于java 字节码的灰盒动态漏洞检测
杭州安恒-‐吴卓群
2. About
Me
! About Me
• ⺫目目前就职于杭州安恒信息技术有限公司,任信息安全服
务部副总监、研究院安全分院负责人人、高高级安全研究员。
• 从事多年的 web 应用用安全领域研究。擅⻓长漏洞发掘、代
码审计、安全测试。
3. Why
• 目前常用的WEB 应 用自 动 化 测试 程序
– 白盒 测试 (源 码审计 系 统 )
• 误报 率太高
• 逻辑顺 序关 联 的 问题 无法 测试
– 黑盒 测试 (web 扫 描器)
• 很多漏洞无法 检测 ,如
– 存 储 跨站
– ⻚页面面无无变化的注入入(
update,
insert
等)
– 大部分的代 码 注入
– 很多文件操作相关的漏洞
考虑使用
基于灰盒
的fuzzing
方式
4. • ⺫目目前做的内容
– Java平台的下的灰盒fuzzing测试
– 劫持关键的操作函数(使用用hook的方方式)
5. • Java
hook
的方式
太 过 繁 琐 ,兼容性不好
无法 满 足要求
修改中间
件及 JVM
字节码动
态修改
系统提供
的
hook
Java
Hook
6. • JAVA 编译执行行代码的过程
编译
Java源程序
(.java)
解释
字节码程
序(.class)
设置
hook
运行
JVM(转换
字节码到特
定平台机器
码)
操作系统
7. • Javaagent 实现 运行 时动态 修改
– 在启 动 和运行期都可以加 载 agent代理,在启
动 的 时 候可通 过 -‐javaagent参数来 执 行agent
代理,而在运行期就是通 过 aFach 这 种机制 动态
load了
8. • 修改
MANIFEST.MF
文件中 增加启动
Manifest-‐Version:
1.0
Sealed:
true
Main-‐Class:
JagentMain
Premain-‐Class:
com.jagent.Jagent
9. • 通过
InstrumentaRon 实现动态 字 节码 修改
10. • 强大大的
Javassist
– Javassist
是一个开源的分析、 编辑 和 创 建Java
字 节码 的 类库 。Javassist
是 jboss
的一个子
项 目,其主要的 优 点,在于 简单 ,而且快速。
直接使用java 编码 的形式,而不需要了解虚 拟
机指令,就能 动态 改 变类 的 结 构,或者 动态 生
成 类 。
– 利用 javassist
对⺫目目标函数动态注入入字节码代码
11. • Javassist
实现代码动态修改
– 备 份原有函数
– 修改原有函数注入回 调 函数
12. • Tomcat
为 例, 劫持的关键函数
– Request 请 求初始化函数
– Request 销毁 函数
– 数据 库查询 函数
– ⻚页 面 输 出函数
– ……
13. • Request 请 求初始化函数
– 只需要能在 执 行 执 行其他劫持函数前 获 得request
请求
的函数都可以
– Org.apache.catalina.connector.Request
类
– setRequestedSessionId函数
• Request 请 求 销毁 函数
– 其他函数 执 行 结 束后request 销毁 前 执 行的函数都可以
– org.apache.catalina.connector.Request
类
– recycle
14. • 数据 库查询 函数
– 各种
jdbc
的
class
库 中的 执 行 sql 语 句的函数
– 如:
com.mysql.jdbc.StatementImpl 类
executeQuery
函数
可检测存储跨站或注入入漏洞
15. • ⻚页 面 输 出函数
– Org.apache.jasper.runRme.JspWriterImpl
write
函数
检测跨站脚本、信息泄露等漏洞
16. • 使用反射解决 变 量 类型问题
– 在 编 写代 码时 ,会碰到大量中 间 件中使用的
class,及函数
– 通 过 反射的方式解决
17. • 系统函数的
HOOK
– 部分漏洞的操作 实习 并非中 间 件,如
• 文件操作的漏洞
– 无法通 过 hook中 间 件 实现 ,只能hook系 统 函
数完成
18. • Java.lang
包的 处 理
– JVM启 动 是加 载 RunRme,File等 类 加 载优 先于
premain 函数,所以无法劫持
– Java.lang
中的
class
出于安全考虑无无法
redefine
或重新加载
19. • Xbootclass 和
SecurityManager
– -‐Xbootclasspath:bootclasspath
让
jvm
从指定路
径(可以是分号分隔的⺫目目录、 jar、或者zip )中
加载 bootclass ,用用来替换 jdk的rt.jar
– SecurityManager,java的安全管理器(沙 盘 )
20. ClassLoader 加载流程
• 每个ClassLoader 加载 Class 的过程是:
– 1. 检测此 Class 是否载入入过(即在 cache中是否有此Class),如果有到
8,如果没有到2
– 2.如果parent
classloader不存在(没有parent,那parent一定是
bootstrap
classloader了),到4
– 3. 请求 parent
classloader 载入入,如果成功到 8,不成功到5
– 4. 请求 jvm从bootstrap
classloader 中载入入,如果成功到 8
– 5. 寻找 Class文件(从与此classloader 相关的类路径中寻找)。如果
找不到则到 7.
– 6. 从文文件中载入入 Class,到8.
– 7.抛出ClassNotFoundExcepRon.
– 8.返回Class.
21. • SecurityMananger
– 安全管理器根据Java安全策略文件决定将哪
组权 限授予 类
– 也可以自定 义 SecurityManager完成需要的功能
22. • 如何获得测试用用例
捕获正常请求,
生成fuzzing数据
设置HTTP代理
正常请求
浏览器
使用javaagent截
获fuzzing请求
正常请求
Proxy
Web服务器
Fuzzing
数据
23. • 部署方式
– 修改启动参数 ,正常启 动
24. • 扩展
– 劫持框架的关键函数,对中间件的安全进行行测
试
– 劫持所有应用用函数,判断瓶颈的函数
– 劫持函数进行行攻击阻断
– Php的灰盒, apache模块扩展
– .net的灰盒测试, Profiling
API
25. THINK
YOU