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

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

ruisui883个月前 (02-16)技术分析12

背景

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 源码导入及二次改造思路分析” 的相关文章

继Yuzu后,任天堂要求移除多个Switch模拟器项目

IT之家 7 月 11 日消息,任天堂美国分公司 (Nintendo of America) 已要求移除多个用于模拟 Nintendo Switch 游戏的开源模拟器项目,其中包括 Suyu、Nzu、Uzuy、Torzu、Sudachi 和 Yuzu-vanced 等。这些模拟器均被指控包含绕过任天...

Solid State Logic 发布低保真数字失真插件 Digicrush

Solid State Logic 宣布推出低保真数字失真插件 Digicrush ,他们最新的创意工具具有经典数字失真的粗糙、低保真特性,完美模拟早期数字音频的衰减和伪影。Digicrush 充满怀旧气息,深受经典数字采样器和效果器的影响,具有内置抖动、可调比特深度和采样率降低功能,是为音轨添加复...

多项修正 尼康D4s发布最新1.10版固件

尼康公司与2014年8月27日发布了D4s的最新固件,固件版本号为C:1.10。这次固件升级,主要解决了一些BUG,并且对拍摄菜单与相机操作做了一定调整。下面是本次新固件的具体信息:尼康发布D4s最新C固件 1.10版对C固件升级到1.10版所作的修改:当选定运动VR模式并换上 AF-S 尼克尔 4...

Vue实战篇|使用路由管理用户权限(动态路由)

权限控制是后台管理系统比较常见的需求,如果我们需要对某些页面的添加权限控制的话,那我们可以在路由管理中的权限做一些校验,没有通过权限校验的给出相应的提示或者直接跳转到报错页面。跟着我一起来学vue实战篇路由管理权限吧!权限校验函数getCurrentAuthority()函数用于获取当前用户权限,一...

VUE3+JAVA商城源码小程序APP商城

三勾小程序商城基于springboot+element-ui+uniapp打造的面向开发的小程序商城,方便二次开发或直接使用,可发布到多端,包括微信小程序、微信公众号、QQ小程序、支付宝小程序、字节跳动小程序、百度小程序、android端、ios端。软件架构后端: springboot2.3.12管...

嵌入式实操——基于RT1170 使能SEMC配置SDRAM功能(八)

本文主要是通过迁移的思维,记录本人初次使用NXP MCUXpresso SDK API进行BSP开发MCUXpresso SDK SEMC API 接口链接  在MCUXpresso SDK 框架下提供了对SEMC DDR进行操作的接口。学习链接:https://community.nxp.com/...