应用实时防护(RASP)是一种现代的应用安全技术,它的原理是在应用程序运行时动态分析和监视应用程序的行为,以侦测和防止潜在的应用安全漏洞和攻击。RASP 技术通常被集成到应用程序代码中或应用程序服务器中,以实现实时的安全保护。以下是 RASP 技术的一般原理:
应用程序内嵌:RASP 技术通常以库或模块的形式嵌入到应用程序中,可以在应用程序的运行时启用和运行。这允许 RASP 技术深入了解应用程序的内部结构和行为。
实时监视:RASP 技术实时监视应用程序的执行。它跟踪应用程序的输入、输出、内部函数调用和数据流动等活动。
上下文感知:RASP 技术了解应用程序的上下文,包括用户、数据、环境和网络连接等。这有助于它更好地评估应用程序行为的合法性。
行为分析:RASP 技术对应用程序的行为进行分析,以检测不寻常的活动和潜在的攻击模式。它使用基于规则和机器学习等技术来进行分析。
攻击检测:RASP 技术识别和检测各种应用安全威胁,如 SQL 注入、跨站脚本(XSS)、跨站请求伪造(CSRF)等。
实时响应:当 RASP 技术检测到潜在的威胁时,它可以采取多种行动,包括拒绝请求、阻止攻击、记录事件、生成警报或采取其他安全响应措施。
自我保护:RASP 技术还可以自我保护,意味着它会尽力保护自身免受恶意攻击或尝试绕过它的行为。
安全策略配置: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 | mysql -u root |
编辑tomcat配置文件
1 | root@ubuntu2004:/etc/tomcat7# vim tomcat-users.xml |
添加内容:
1 | <role rolename="manager-gui"/> |
创建数据库目录y
1 | mkdir /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 | wget https://github.com/baidu/openrasp/releases/download/v1.3.7/rasp-java.zip |
下面就是安装成功了
1 | root@ubuntu:~/rasp-2022-01-28# java -jar RaspInstall.jar -install /usr/share/tomcat7 |
之后重启tomcat
1 |
下面目录是官方的插件,用的nodejs写的
1 | root@ubuntu:/usr/share/tomcat7/rasp/plugins# ls |
下面链接是官方规则可以检测的漏洞类型,但有些是仅IAST商业版支持
https://rasp.baidu.com/doc/usage/web.html
不过默认没有开启阻断,需要编辑official.js开启,之后重启tomcat7
1 | // 若 all_log 开启,表示为观察模式,会将所有的 block 都改为 log |
访问以下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 | apt-get install -y nodejs npm |
一个最小的SQL检测插件如下所示
1 | const plugin_version = '2018-1000-1000' |
主要就是调用 plugin.register 注册了SQL查询的检测函数,并将SQL语句打印到插件日志。
1 | params 为检查点提供的参数,如SQL语句、要读取的文件等等 |
检测函数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 | [{ |
其中,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 | # |
默认的规则好像检测不到Get参数的反射型xss,我写两个简单的,不过就检测一个script,大家可以完善,不过调试的时候,好像querystring是有url编码的,这个需要注意,不然<script
是检测不到的
1 | const plugin_version = '2023-1015-1520' |
参考
《基于开源软件打造企业安全》