基于java字节码的灰盒动态漏洞检测
2021-09-09 86浏览
- 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