OpenRASP Documents (Old)
  • 简介
  • 安装部署
    • 兼容性说明
    • 安装管理后台
    • 快速接入
      • PHP 服务器
      • Tomcat 服务器
      • JBoss 服务器
      • Wildfly 服务器
      • Resin 服务器
      • Jetty 服务器
      • Spring Boot 框架
      • WebLogic 服务器
      • WebSphere 服务器
      • 宝兰德BES服务器
      • 东方通TongWeb服务器
      • 中创InforSuiteAS服务器
      • 普元PAS服务器
    • 安装测试用例
    • 安装灰盒扫描工具
      • IAST 高级配置选项
    • SIEM 系统集成
      • Splunk
      • Logstash
    • 大规模部署
    • 卸载软件
  • 服务配置
    • 日志说明
    • 管理后台
    • 单机版本
    • 其他配置
  • 功能说明
    • 攻击检测能力说明
    • CVE 漏洞覆盖说明
    • 安全基线检查
    • 应用加固支持
    • 应用异常监控
    • 类库信息查询
    • HTML 响应修改
  • 插件开发
    • 开发插件
    • 接口说明
      • RASP 类接口
      • Context 类接口
    • 参数说明
    • 单元测试
    • 在线调试
    • 官方插件定制
  • 二次开发
    • 架构说明
      • Java 版本
      • PHP 版本
      • 管理后台
      • IAST 扫描器
      • Hook 函数列表
    • 从源代码编译
      • Java 版本
      • PHP 版本
      • 管理后台
    • 云控后台接口
    • 代码调试
    • 添加新的Hook点
    • 添加新的插件API
    • 提交你的代码
  • 性能测试
  • 版本变更
  • 关于我们
Powered by GitBook
On this page
  • 简要说明
  • 启动流程
  • Hook Class 流程
  • 请求处理流程
  • 基线检测
Export as PDF
  1. 二次开发
  2. 架构说明

Java 版本

Previous架构说明NextPHP 版本

Last updated 11 days ago

简要说明

java 版本使用 javaagent 机制来实现。在服务器启动时,可动态的修改Java字节码,对敏感操作的函数进行挂钩,比如:

  • 数据库操作

  • 文件读取、写入操作

  • 命令执行

  • ...

当服务器发生攻击,就会触发这些Hook点,此时RASP agent就可以获取到函数的参数,比如要读取的文件名、要执行的命令等等。

启动流程

  1. 启动时首先会进入 javaagent 的 premain 函数,该函数会在 main 函数之前预先执行,

  2. 当去 hook 像 java.io.File 这样由 BootstrapClassLoader 加载的类的时候,无法从该类调用非 BootstrapClassLoader 加载的类中的接口,所以 agent.jar 会先将自己添加到 BootstrapClassLoader 的ClassPath下,这样 hook 由 BootstrapClassLoader 加载的类的时候就能够成功调用到 agent.jar 中的检测入口

  3. 释放 log4j 日志配置文件,如果存在则跳过

  4. 根据 openrasp.yml 文件初始化相应配置项

  5. 初始化 JS 插件模块

    • JS 上下文类初始化

    • 插件文件初始化

  6. 初始化字节码转换模块

    • 给 load class 操作进行插桩操作,当类加载的时候会先进入 agent 进行处理

    • 对于在初始化前已加载的类执行 retransform 处理,e.g FileInputStream

  7. 输出启动成功日志,开启全局 Hook 开关(启动阶段为关闭状态)

    • 若启动过程中发生错误,记录错误日志

  8. 给 openrasp.yml 配置文件和 js 插件目录以及 assets 目录增加文件监控,以便文件内容更改的时候不需要重启就能够实时生效

Hook Class 流程

  1. 因为启动时候进行了插桩操作,当有类被 ClassLoader 加载时候,所以会把该类的字节码先交给自定义的 Transformer 处理

  2. javassist 框架会将类的字节码依照事件驱动模型逐步解析每个方法,当触发了我们需要 hook 的方法,我们会在方法的开头或者结尾插入进入检测函数的字节码

  3. 把 hook 好的字节码返回给 transformer 从而载入虚拟机

启动时架构如下图所示:

请求处理流程

我们以 tomcat + JDBC + MySQL 为例,简单说明下请求处理的流程

  1. 服务器收到一个请求,从而进入了服务器的请求 hook 点(该 hook 点每个服务器不一样,具体参照源码),该 hook 点标注当前线程为请求线程,开启当前线程的检测开关并把请求对象和响应对象进行缓存,以便后面使用

  2. 服务器发起SQL查询

  3. 进入 SQLStatementHook 点,我们挂钩了 execute、executeUpdate、executeQuery 等方法,从该方法进入检测流程如下:

    • 判断当前线程是否为请求线程(第一步标记的),如果是继续下面检测

    • 采集 connection_id(这个字段仅JDBC支持)、SQL 语句以及数据库类型 等信息

    • 根据插件的执行结果决定是拦截请求、放行还是仅打印日志

  4. 进入 SQLResultSetHook 点,我们挂钩了 resultSet.next 方法

    • 调用本地插件检查是否发生拖库行为,默认策略为一次查询结果超过500条就报警

  5. 若决定拦截攻击

    • 输出报警日志到 logs/alarm.log

    • 如果header还没有发出,默认使用 302 跳转到拦截页面

    • 如果body还没有发出,则重置未发送的body

    • 输出自定义拦截页面跳转js脚本

      • </script><script>location.href='.../?request_id=xxx'</script>

OpenRASP 中JS引擎执行架构如下图所示:

基线检测

我们以 tomcat 启动为例,说明基线检测流程

  1. 进入了基线检测关键函数(tomcat 启动函数)

  2. 进入本地基线检测插件(注:基线检测不进入js插件检测),检测当前环境的关键参数(http-only是否开启,是否为root启动等)

  3. 根据检测结果决定是否拦截,不拦截的情况下只打印日志到 logs/policy_alarm.log

检测架构如下图所示:

自定义 Transformer 会判断该类是否为需要 hook 的类,如果是会将该类交给 javassist 字节码处理框架进行处理,

构建参数信息,调用本地插件和 JS 插件进行安全检测,JS 插件由 Rhino 引擎执行,Rhino 引擎执行是 mozilla 为 java 提供的 JavaScript引擎,该引擎会将 JS 代码编译为 java 的 class 字节码在 JVM 中运行,

javaagent参考文档
javassist
Rhino 引擎文档
images/startup.png
images/js.png
images/check.png