代码审计之浅谈RASP技术

前言:

想摆会烂,所以就落个笔吧。

其实本来是想写关于iast技术的,但是认真思考了下,感觉笔者自己本身也不太能讲清楚iast技术,怕误人子弟。

所以最后还是基于笔者的理解以及实际应用写一篇关于RASP技术的文章,笔者能力有限,如有错误,欢迎斧正。

正文:

聊到RASP技术就得从原理聊起,但是基于笔者的角度而言不太想把这篇文章写的太长。

所以会简单化的去讲,仅提涉及到的相关技术栈,其余的东西自己去研究。

且这里的rasp谈的皆是运行时的hook技术,其余如java基于反射等特性实现的没谈。

原理:

这里从主流的二门语言进行讨论(其余笔者没深入研究过,没办法,手动狗头)

JAVA:java目前主流技术还是用的字节码转换技术,即开发者使用 Instrumentation,实现hook,也就是常说的agent hook,常见的vagent内存马也就是利用的这个技术。

PHP:PHP的RASP核心是开发一个扩展在PHP模块初始化(MINIT)时,去进行替换opcode handler或用自定义函数替换全局函数进而实现rasp。

NET:NET采用的是 利用IHostingStartup接口进而去将外部程序集添加到应用中,与java的agent技术有点像? (这里只提一下,笔者没深入研究过)

具体实现:

JAVA:
具体技术栈:

1、最基础的:

在java.lang.instrument.Instrumentation里的premain进行定义

package com.goddemon;

import java.lang.instrument.Instrumentation;

public class Agent {

    public static void premain(String agentArgs, Instrumentation inst) {
        System.out.println("this is an agent.");
        System.out.println("args:" + agentArgs + "\n");
    }
}

然后打包生成jar包,而后利用jvm启动思路进行启动或attach方式进行启动

这里采用jvm方式进行启动,进而实现

2、进一步使用:

联动asm去进行实现动态分析类,方法

3、又如联动bytebuddy去进行分析每个方法以及拦截。

4、或者说联动management去进行分析内存?

上面的具体demo这里不写了,具体可以看看这个老哥的代码。
https://github.com/hawkingfoo/demo-agent

但是其实不局限于上面的:

5、其实还可以利用agent技术去动态修复漏洞,动态获取内存里解密的代码,实现绕过加密机制。

内存马注入等等。

6、动态的hook常见的sink点。

后面几种其实本质上还是字节码操作,只是说调用的字节码操作的api不大相同罢了。

所以其实最关键的还是字节码操作怎么写以及类如何解决agent隔离机制,和识别线程调用的问题。

PHP:
具体技术栈:

这里以train

php的rasp技术栈其实这里面比较关键的就是

1、如何开发一个扩展

本质上需要关注这三个点,具体可以参考fate0大佬写的xmark
https://github.com/fate0/xmark

其中config.m4文件进行配置如何编译与链接

.h文件进行声明扩展函数

.c文件进行具体实现拓展函数

而后打包为.so文件后采用文件运用即可

php -d "extension=xmark.so" test.php
2、开发扩展的具体思路

这里涉及到如何gdb调试以及如何查看opcode以及函数如何hook

gdb调试更改config.m4即可。

opcode利用安装vld进行查看。

函数hook方式的话,主要分为两种:

一种是hook opcode函数,前置需要利用vld进行定位具体函数的opcode,而后进行调用替换 zend_set_user_opcode_handler(ZEND_ECHO, fake_echo);

一种是hook 内部函数,获取php的全局函数体,而后替换handler为我们自己的。

应用:

OpenRasp:

开源比较成熟的项目落地,且可以进行深入研究。

这里的完全应用的话,且改规则的话,个人还是推荐openrasp,其余的iast或非单机的性能要求会很高,个人pc机不太友好。

openrasp:(产品相对成熟且可独立单机部署)
https://rasp.baidu.com/

改规则:

缺点与bypass:

缺点:

1、如何适配不同语言,如PHP,java,net等。

2、如果适配不同的框架。

3、部署如何更简单。

4、产品如何确定规则是稳定的以及自身是安全的以及稳定的。

bypass思路:

如PHP:

基于PHP的RASP,是去hook的函数,以及是基于hook的php文件。

①因为是去hook的常规函数,因此我们可以去对函数进行混淆进而绕过或者利用一些非常规函数。

如hook了如下的函数

system()
exec()

但是可以利用其他非敏感函数去进行hook

proc_open()
pcntl_exec()

②因为第二种的状况,因此我们可以去跳出PHP思路。

如利用下面这些思路去绕过

LD_PRELOAD

.htaccess

Foreign Function Interface

后言:

基于RASP的内容差不多就写到这里,有些东西可能写的比较浅,只能说将就看吧。

RASP和IAST的话其实部分东西是相通,本质在于处理追踪细节和埋点细节的问题,以后有空在细写吧。

相关推荐
我要学编程(ಥ_ಥ)1 小时前
滑动窗口算法专题(1)
java·数据结构·算法·leetcode
niceffking1 小时前
JVM 一个对象是否已经死亡?
java·jvm·算法
真的很上进1 小时前
【Git必看系列】—— Git巨好用的神器之git stash篇
java·前端·javascript·数据结构·git·react.js
科研小白_d.s1 小时前
intellij-idea创建html项目
java·html·intellij-idea
XXXJessie1 小时前
c++249多态
java·c++·servlet
喝旺仔la2 小时前
VSCode的使用
java·开发语言·javascript
骆晨学长2 小时前
基于Springboot的助学金管理系统设计与实现
java·spring boot·后端
尘浮生2 小时前
Java项目实战II基于Java+Spring Boot+MySQL的大型商场应急预案管理系统(源码+数据库+文档)
java·开发语言·数据库·spring boot·spring·maven·intellij-idea
dawn1912282 小时前
SpringMVC 中的域对象共享数据
java·前端·servlet
Xwzzz_2 小时前
Nginx配置负载均衡
java·nginx·负载均衡