当前位置:首页 > 技术分析 > 正文内容

OpenRASP Agent 源码导入及二次改造思路分析

ruisui884个月前 (02-16)技术分析17

背景

OpenRASP 是百度安全推出的一款免费、开源的应用运行时自我保护产品,近期需要了解源码,对其进行二次开发,所以导入源码,分析了一下 Java Agent 端的工程,本文即为整理 OpenRASP Agent 源码导入的过程。

Agent 基本结构

百度开源的 OpenRASP 项目地址为 openrasp ,在 windows 系统下,下载该项目到本地。前面已经安装并验证过官方的一些案例了,从安装包的目录结构中,我们可以知道 Agent 端的几个模块:

导入 Agent

这里主要介绍 Java agent 的源码导入过程,定位到源码的 openrasp-master\agent\java 目录,将该目录下的 pom.xml 导入到 IDEA 中,它被 IDEA 识别为两个子模块:


rasp-boot 模块很简单,就是一个 Java Agent 的定义,打包文件名为 rasp.jar ,它将应用的启动引向 rasp-engine.jar。

rasp-engine 是核心引擎,真正提供应用的自我防护功能,其 finalName 为 rasp-engine.jar。刚导入该模块时,IDEA 会报错,因为它依赖另一个工程:


   com.baidu.openrasp
   v8
   1.0-SNAPSHOT

v8 是 Google 的 js 引擎,OpenRASP 使用了该引擎。接下来就需要编译这个 v8 模块,得到 v8-1.0-SNAPSHOT.jar 包,将其安装到本地仓库,以解决该依赖报错问题。

编译依赖模块 v8

这个模块有一些 native 实现,所以需要编译成 .so【Linux 环境】 或者 dll【Windows 环境】 文件,将其拷贝到源码的 resource 目录。Linux 上编译 openrasp-v8 模块,官方有详细的操作过程 编译 openrasp-v8 基础库。

官方的流程没有问题,但是由于是用公司测试部服务器,不想在上面安装 git ,想当然地在本地用 git 下载的源码进行编译,以为只是普通的下载而已。结果绕了一个弯路,中了 Linux 下的 git clone 命令和 windows 下 git clone 差异的坑,完全按装官方的步骤进行编译,其实是很容易的。

第一步,环境准备

  • gcc 5.3.1
  • cmake-3.15.0
  • git
  • apache-maven-3.5.3

如果没有这些命令,先用 yum install 安装,gcc 安装过程为:

  • yum install -y centos-release-scl
  • yum install -y devtoolset-4-gcc-c++
  • scl enable devtoolset-4 bash(进入编译环境)

第二步,下载源码

git clone https://github.com/baidu/openrasp.git

第三步,进入仓库根目录,执行如下命令

进入 openrasp 仓库目录,顺次执行以下命令集即可。

# 更新 git submodule,openrasp-v8 模块中是空的,需要执行该步骤得到最新的源码
git submodule update --init

# 编译 openrasp-v8,cmake 的最后是两个点,必须完全拷贝
mkdir -p openrasp-v8/build64 && cd openrasp-v8/build64
cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -DENABLE_LANGUAGES=java ..
make

# 复制动态链接库到 resources 目录
mkdir -p ../java/src/main/resources/natives/linux_64 && cp java/libopenrasp_v8_java.so $_

#打包,得到 v8-1.0-SNAPSHOT.jar
mvn package -Dmaven.test.skip=true

最后一步不能执行官方的 mvn install ,原因有二:

  1. v8 模块的测试用例包含中国菜刀门的恶意代码,所以下载时会被识别为病毒,未被下载,所以无法通过测试。
  2. mvn 仓库配置的是公司私服,无法安装该模块,执行命令会报异常:
    我们编译该模块就是为了得到 v8-1.0-SNAPSHOT.jar,所以直接用 mvn package 打包,且跳过测试即可。

本地仓库安装 v8

定位到 Linux 服务器上 v8 项目 target 目录下,将 v8-1.0-SNAPSHOT.jar 下载到 windows 本地,然后执行本地安装命令:

mvn install:install-file -DgroupId=com.baidu.openrasp -DartifactId=v8 -Dversion=1.0-SNAPSHOT -Dpackaging=jar -Dfile=E:/v8-1.0-SNAPSHOT.jar

再在 IDEA 中 reimport project ,刷新后,rasp-engine 中的依赖错误消失。现在就可以对源码进行修改,做二次开发了。

二次开发日志入库

只使用 agent 、不安装后台管理系统的情况下,希望将 agent 端的告警数据入库,有两种方式,一种是解析它的 alarm.log 日志文件,另一种是修改源码:告警发生时,不仅写日志、还要写入数据库。

如何定位到日志写入的地方呢?

我们已经知道日志文件名为 alarm.log,所以直接在项目中全局查找 “alarm.log ”字符串,找到了定义 Logger 的地方:


这个 AppenderMappedLogger 类定义了 Logger 名称和 appender 日志文件的映射关系,初始 logger4j
会据此来设置日志的 file appender 配置:


接着,查找这个 ALARM 日志实例引用的地方,最后定位到 Check 类中的一个日志对象

Logger ATTACK_ALARM_LOGGER = Logger.getLogger(AbstractChecker.class.getPackage().getName() + ".alarm");

这个 logger 的名称全称就是
com.baidu.openrasp.plugin.checker.alarm
,找到它被调用的地方,就可以在此处添加写入数据库的逻辑了。


这是写告警日志的地方,跟踪这个方法的调用过程,最终定位到请求阻断的逻辑:


至此,整个流程也就通畅了。这段代码说明,如果 check 结果为真,则记录一条告警日志,这个 EventInfo 类的 toString 方法会将对象序列化为 JSON 字符串,然后输入到日志文件中。

复盘编译失败的原因

第一,gcc 版本问题。


目标服务器上已经安装过 gcc ,版本过低,则脚本执行时会报权限错误。


第二,git clone 问题。

本地 Windows 下用 git clone 的项目,然后执行 git submodule 后得到的源码上传服务器后无法成功编译,根源是 clone 操作不完整,make 命令执行的头文件中缺少 v8 平台的文件。Linux 上 git clone 会有平台文件,而 windows 下相同操作却没有,最终导致 cmake 操作报错。


其实没有必要自己编译 so 文件,官方给出了编译好的库,只要拷贝到 resources 目录,执行 v8 项目打包即可,这里将 v8-1.0-SNAPSHOT.jar 包上传到资源库中了,可以直接下载后使用。

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/1982.html

标签: gitsubmodule
分享给朋友:

“OpenRASP Agent 源码导入及二次改造思路分析” 的相关文章

学会使用Vue JSX,一车老干妈都是你的

作者:子君转发链接:https://mp.weixin.qq.com/s/eAOivpHeowLShfwPfW8-BA?君自前端来,应知前端事。需求时时变,bug改不完。?连续几篇文章,每篇都有女神,被老铁给吐槽了,今天不提了女神了,反正女神都是别人的(扎心了)。这两天小编看了腾讯与老干妈的事情,晚...

分享15个基于Vue3.0全家桶的优秀开源项目

大家好,我是 Echa。今天来分享 15 个基于 Vue3.0 全家桶的优秀开源项目!1. Vue Admin Bettergithub : https://github.com/chuzhixin/vue-admin-bettervue admin better 对比其他来源 admin 框架有如...

vue 开发规范

项目运行指南(#项目运行指南)开发本地环境(#开发本地环境)开发相关插件/工具(#开发相关插件工具)开发规范(#开发规范)vue(#vue)【数据流向】(#数据流向)【慎用全局注册】(#慎用全局注册)【组件名称】(#组件名称)【组件中的 CSS】(#组件中的-css)【统一标签顺序】(#统一标签顺序...

甘肃省2023年普通高校毕业生基层服务项目考试成绩今日公布

甘肃省2023年普通高校毕业生基层服务项目考试成绩今日公布每日甘肃网7月12日讯据兰州日报报道 近日,记者从甘肃省人力资源考试中心了解到,甘肃省2023年普通高校毕业生基层服务项目(三支一扶、特岗计划、西部计划)考试成绩于7月12日9:00开通查询。考生可登录“甘肃人事考试网”,点击“成绩查询”栏目...

vue 如何实现跨域

跨域问题是因为浏览器的同源策略引起的,一种浏览器的安全机制,要求协议,域名,端口,都要一致!出于浏览器的同源策略限制,浏览器会拒绝跨域请求。什么叫跨域?非同源请求,均为跨域。名词解释:同源 —— 如果两个页面拥有相同的协议(protocol),端口(port)和主机(host),那么这两个页面就属于...

使用 Vue 脚手架,为什么要学 webpack?(一)

先问大家一个很简单的问题:vue init webpack prjectName 与 vue create projectName 有什么区别呢?它们是 Vue-cli 2 和 Vue-cli3 创建项目的两个命令,之所以两个命令不同,根本原因是 Vue-cli2 是基于webpack 3,而 vu...