应用实时防护(RASP)

应用实时防护(RASP)是一种现代的应用安全技术,它的原理是在应用程序运行时动态分析和监视应用程序的行为,以侦测和防止潜在的应用安全漏洞和攻击。RASP 技术通常被集成到应用程序代码中或应用程序服务器中,以实现实时的安全保护。以下是 RASP 技术的一般原理:

  1. 应用程序内嵌:RASP 技术通常以库或模块的形式嵌入到应用程序中,可以在应用程序的运行时启用和运行。这允许 RASP 技术深入了解应用程序的内部结构和行为。

  2. 实时监视:RASP 技术实时监视应用程序的执行。它跟踪应用程序的输入、输出、内部函数调用和数据流动等活动。

  3. 上下文感知:RASP 技术了解应用程序的上下文,包括用户、数据、环境和网络连接等。这有助于它更好地评估应用程序行为的合法性。

  4. 行为分析:RASP 技术对应用程序的行为进行分析,以检测不寻常的活动和潜在的攻击模式。它使用基于规则和机器学习等技术来进行分析。

  5. 攻击检测:RASP 技术识别和检测各种应用安全威胁,如 SQL 注入、跨站脚本(XSS)、跨站请求伪造(CSRF)等。

  6. 实时响应:当 RASP 技术检测到潜在的威胁时,它可以采取多种行动,包括拒绝请求、阻止攻击、记录事件、生成警报或采取其他安全响应措施。

  7. 自我保护:RASP 技术还可以自我保护,意味着它会尽力保护自身免受恶意攻击或尝试绕过它的行为。

  8. 安全策略配置:RASP 技术通常允许管理员配置安全策略,以适应不同的应用程序需求和威胁模式。这包括定义哪些行为是允许的,哪些是禁止的,以及如何响应各种威胁。

总的来说,RASP 技术通过深入了解应用程序的内部运行时行为,实时监视和分析应用程序活动,以检测和防止潜在的应用安全漏洞和攻击。这有助于应用程序更好地自我保护并提供实时的安全防护。但需要注意,RASP 技术通常不是独立的安全解决方案,而应与其他安全控制(如WAF、IDS/IPS等)一起使用,以建立更全面的安全防御体系。

测试环境搭建

实验环境

Ubuntu 16.04
tomcat 7

以java为例的,WAVSEP的漏洞靶场

1
https://github.com/sectooladdict/wavsep/releases/tag/wavsep-v1.5-war

首先安装Tomcat环境、mysql

1
apt install tomcat7 tomcat7-admin mysql-server

mysql可能需要修改root密码

1
2
3
mysql -u root
use mysql;
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';

编辑tomcat配置文件

1
2
root@ubuntu2004:/etc/tomcat7# vim tomcat-users.xml 
root@ubuntu2004:/etc/tomcat7# service tomcat9 restart

添加内容:

1
2
<role rolename="manager-gui"/>
<user username="tomcat" password="XXXX" roles="manager-gui"/>

创建数据库目录y

1
2
mkdir /var/lib/tomcat7/db
chown -R tomcat7:tomcat7 /var/lib/tomcat7/db

登录后台,上传war包部署

1
http://192.168.X.X:8080/manager/html

初始化

1
http://localhost:8080/wavsep/wavsep-install/install.jsp

OpenRASP安装

先看看最新版的能不能行

下载 rasp-java.tar.gz 或者 rasp-java.zip 并解压缩。之后进入到解压后的目录中执行RaspInstall.jar

1
2
3
4
5
wget https://github.com/baidu/openrasp/releases/download/v1.3.7/rasp-java.zip
unzip rasp-java.zip
cd rasp-2022-01-28/
# /usr/share/tomcat7是tomcat根目录,可以通过whereis tomcat7查看,一般是含有bin目录的
java -jar RaspInstall.jar -install /usr/share/tomcat7

下面就是安装成功了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
root@ubuntu:~/rasp-2022-01-28# java -jar RaspInstall.jar -install /usr/share/tomcat7
OpenRASP Installer for Java app servers - Copyright 2017-2021 Baidu Inc.
For more details visit: https://rasp.baidu.com/doc/install/software.html

Detected JDK version: 1.8.0_292
Detected application server type: Tomcat
Duplicating "rasp" directory
- /usr/share/tomcat7/rasp
Make "rasp" directory writable

Generating "openrasp.yml"
- /usr/share/tomcat7/rasp/conf/openrasp.yml
- Create /usr/share/tomcat7/rasp/conf/openrasp.yml
Updating startup script
- /usr/share/tomcat7/bin/catalina.sh

Installation completed without errors.
Please restart application server to take effect.

之后重启tomcat

1
2


下面目录是官方的插件,用的nodejs写的

1
2
root@ubuntu:/usr/share/tomcat7/rasp/plugins# ls
official.js

下面链接是官方规则可以检测的漏洞类型,但有些是仅IAST商业版支持

https://rasp.baidu.com/doc/usage/web.html

不过默认没有开启阻断,需要编辑official.js开启,之后重启tomcat7

1
2
// 若 all_log 开启,表示为观察模式,会将所有的 block 都改为 log
all_log: true,

访问以下sql注入

1
http://192.168.XXX.XXX:8080/wavsep/active/SQL-Injection/SInjection-Detection-Evaluation-GET-500Error/Case01-InjectionInLogin-String-LoginBypass-WithErrors.jsp?username=textvalue%27%20or%207=7--%20&password=textvalue2

就会跳转到百度的页面

开发插件

官方有文档

https://rasp.baidu.com/doc/dev/example.html

就是下nodejs

1
2
apt-get install -y nodejs npm
npm install -g openrasp

一个最小的SQL检测插件如下所示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
const plugin_version = '2018-1000-1000'
const plugin_name = 'test-plugin'

'use strict'
var plugin = new RASP(plugin_name)

const clean = {
action: 'ignore',
message: 'Looks fine to me',
confidence: 0
}

// BEGIN ALGORITHM CONFIG //

var algorithmConfig = {}

// END ALGORITHM CONFIG //

plugin.register('sql', function (params, context) {
plugin.log('SQL query: ' + params.query)
return clean
})

plugin.log('plugin-demo: plugin loaded')

主要就是调用 plugin.register 注册了SQL查询的检测函数,并将SQL语句打印到插件日志。

1
2
params 为检查点提供的参数,如SQL语句、要读取的文件等等
context 为请求信息,如请求参数,服务器信息等等

检测函数return clean,其实就是放行,clean的action是ignore

而除了注册sql之外,还可以注册检测什么,可以看下面的链接

https://rasp.baidu.com/doc/dev/data.html

下面我随便列出一点

读取目录: directory
请求参数:request
删除文件:deleteFile
文件包含操作:include
文件上传:fileUpload
命令执行:command
代码执行(目前支持 eval/function 两种函数):eval
响应检查:response

写好之后可以用上面装好的rasp库进行测试,可以参考这里:https://rasp.baidu.com/doc/dev/test/main.html

测试用例以 JSON 格式保存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[{
"id": "ssrf_userinput_intranet",
"name": "ssrf",
"action": "block",
"params": {
"hostname": "172.16.177.120",
"ip": ["172.16.177.120"],
"url": "http://172.16.177.120/hello.action?redirect=123"
},
"context": {
"parameter": {
"url": ["http://172.16.177.120/hello.action?redirect=123"]
}
},
"description": "SSRF userinput match test"
}]

其中,action 表示期望的结果,是拦截、日志还是放行;id 是测试用例编号。其他字段主要是对请求上下文的模拟。

运行单元测试,需要两个关键参数

  • 测试用例目录,-d指定目录
  • 检测插件路径,-p指定插件文件
1
rasp check -d ./unitCases -p myplugin.js

实例:

tests文件夹放的是sql.json,来源:https://raw.githubusercontent.com/baidu/openrasp/191aa2e5ed8b80f9a3580d3c64dccb0e425ef373/agent/java/engine/src/test/resources/pluginUnitTest/unitCases/sql.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 
root@ubuntu:~# cat sql.js
const plugin_version = '2018-1000-1000'
const plugin_name = 'test-plugin'

'use strict'
var plugin = new RASP(plugin_name)

const clean = {
action: 'log',
message: 'Looks fine to me',
confidence: 0
}

const attack = {
action: 'block',
message: 'sql注入攻击,阻断',
confidence: 0
}
// BEGIN ALGORITHM CONFIG //

var algorithmConfig = {}

// END ALGORITHM CONFIG //

plugin.register('sql', function (params, context) {
if(/(union.*select|sleep)/i.test(params.query))
return attack
})

plugin.log('plugin-demo: plugin loaded')
root@ubuntu:~# rasp check -d ./tests/ -p ./sql.js

OpenRASP plugin devtool - https://rasp.baidu.com
[test-plugin] plugin-demo: plugin loaded

✓ sql.json Simple userinput match test: 3ms
✓ sql.json SQL injection with hex values: 1ms
✓ sql.json SQL injection with datetime methods: 0ms

3 passing (11ms)

默认的规则好像检测不到Get参数的反射型xss,我写两个简单的,不过就检测一个script,大家可以完善,不过调试的时候,好像querystring是有url编码的,这个需要注意,不然<script是检测不到的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
const plugin_version = '2023-1015-1520'
const plugin_name = 'xss-plugin'

'use strict'
var plugin = new RASP(plugin_name)

var xssRegex = /script/i

const clean = {
action: 'log',
message: '无风险',
confidence: 0
}

const attack = {
action: 'block',
message: '有攻击,阻断',
confidence: 95
}
// BEGIN ALGORITHM CONFIG //

var algorithmConfig = {}

// END ALGORITHM CONFIG //

plugin.register('request', function (params, context) {
var querystring = context.querystring
var message = "";
plugin.log(querystring)
if (xssRegex.test(querystring)){
message = "XSS攻击:" + querystring
return attack
}

if (! message.length) {
return clean;
}
})
plugin.log('xss-plugin plugin loaded')

参考

《基于开源软件打造企业安全》

打赏专区