代码调试

Java 版本

远程调试

本文以 Tomcat + IntelliJ 为例,介绍如何通过 JPDA - Java Platform Debugger Architecture 协议调试 OpenRASP 源代码。整个流程涉及如下两个步骤:

  • 修改 Tomcat 启动参数,开启远程调试
  • 配置IDE,连接Tomcat远程调试

    1. 配置 tomcat 服务器

可通过设置 JAVA_OPTS 开启远程调试,具体操作如下:

Linux,在 catalina.sh 中 OpenRASP 相关配置相中增加一行,如下:

  1. JAVA_OPTS="-javaagent:\"${CATALINA_HOME}/rasp/rasp.jar\" ${JAVA_OPTS}"
  2. JAVA_OPTS="-Dlog4j.rasp.configuration=\"file://${CATALINA_HOME}/rasp/conf/rasp-log4j.xml\" ${JAVA_OPTS}"
  3. JAVA_OPTS="-agentlib:jdwp=transport=dt_socket,address=1043,server=y,suspend=y ${JAVA_OPTS}"

Windows,在 catalina.bat 中 OpenRASP 相关配置相中增加一行,如下:

  1. if "%ACTION%" == "start" set JAVA_OPTS="-javaagent:%CATALINA_HOME%\rasp\rasp.jar" %JAVA_OPTS%
  2. if "%ACTION%" == "start" set JAVA_OPTS="-Dlog4j.rasp.configuration=file:%CATALINA_HOME%\rasp\conf\rasp-log4j.xml" %JAVA_OPTS%
  3. if "%ACTION%" == "start" set JAVA_OPTS=-agentlib:jdwp=transport=dt_socket,address=1043,server=y,suspend=y %JAVA_OPTS%

JDWP 配置参数说明

  • transport=dt_socket 指定通信协议
  • address=1043 指定调试端口
  • server=y 指是否支持在server模式的VM中
  • suspend=y 指是否在调试客户端建立起来后,再执行JVM(调试premain() 需要设置suspend=y)
    P.S 在 tomcat 下面直接使用 bin/catalina.sh jpda start 也能达到类似的效果,这样的端口默认是 8000

2. 配置 IDE

用Intellij导入OpenRASP源代码;点击 Run -> Edit Configuration

编辑配置

点击左上角加号,选择 Remote

新增tomcat server

Configuration 标签页中,配置 HostPort以及 源码路径,如下图所示:

server标签配置

确认保存,点击 Run -> Debug,如果调试信息出现 Connected to target VM 说明成功连接

启动后,需要等待 OpenRASP 初始化。大概等待3s左右,就可以看到堆栈信息了

断点调试

断点调试

性能调试

从 v0.22 开始,我们增加了性能调试开关,即 debug_level 选项。这个选项设置为 1时,我们会开启性能调试输出

每当服务器收到请求,我们就会在 rasp/logs/rasp/rasp.log 里打印这样的日志,

  1. 2018-01-18 20:06:37,075 INFO [http-bio-8080-exec-1][com.baidu.openrasp.HookHandler] request_id=27d98d7827f04892b31bb6fe7a0fa4f0 type=request time=0
  2. 2018-01-18 20:06:37,079 INFO [http-bio-8080-exec-1][com.baidu.openrasp.HookHandler] request_id=27d98d7827f04892b31bb6fe7a0fa4f0 type=readFile time=3
  3. 2018-01-18 20:06:37,553 INFO [http-bio-8080-exec-1][com.baidu.openrasp.HookHandler] request_id=754515705fd942708efafe7c66d955be type=request time=0
  4. 2018-01-18 20:06:38,843 INFO [http-bio-8080-exec-1][com.baidu.openrasp.HookHandler] request_id=2cc0377881cd42a09868d017a276c405 type=request time=0

日志里会记录hook点进入的次数、检测逻辑消耗的时间 - 毫秒。若 request_id 相同,则表示这些日志是同一个请求产生的。如果你需要调试性能,可以通过这种方式采集日志,并发给我们来分析

另外,一个比较快的方法是,通过禁用不同的 hook 点,并观察性能,最终找出消耗性能最多的检测点或者检测逻辑。具体有哪些 hook 点,请查看 其他配置选项

PHP 版本

与常规的PHP扩展调试方法一致,使用 gdb 启动 PHP 命令行服务器,下断点调试即可,e.g

  1. gdb php -ex "run -S 0.0.0.0:8123"

其他内容不再赘述

原文: https://rasp.baidu.com/doc/hacking/debug.html