代码审计之浅谈RASP技术

2024-05-05 08:12
文章标签 代码 技术 浅谈 审计 rasp

本文主要是介绍代码审计之浅谈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方式进行启动,进而实现
image.png
2、进一步使用:
联动asm去进行实现动态分析类,方法
image.png
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
image.png
其中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的话其实部分东西是相通,本质在于处理追踪细节和埋点细节的问题,以后有空在细写吧。
1714751960685.png

这篇关于代码审计之浅谈RASP技术的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/961210

相关文章

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (

Python实现PDF按页分割的技术指南

《Python实现PDF按页分割的技术指南》PDF文件处理是日常工作中的常见需求,特别是当我们需要将大型PDF文档拆分为多个部分时,下面我们就来看看如何使用Python创建一个灵活的PDF分割工具吧... 目录需求分析技术方案工具选择安装依赖完整代码实现使用说明基本用法示例命令输出示例技术亮点实际应用场景扩

Python实现MQTT通信的示例代码

《Python实现MQTT通信的示例代码》本文主要介绍了Python实现MQTT通信的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 安装paho-mqtt库‌2. 搭建MQTT代理服务器(Broker)‌‌3. pytho

MySQL进行数据库审计的详细步骤和示例代码

《MySQL进行数据库审计的详细步骤和示例代码》数据库审计通过触发器、内置功能及第三方工具记录和监控数据库活动,确保安全、完整与合规,Java代码实现自动化日志记录,整合分析系统提升监控效率,本文给大... 目录一、数据库审计的基本概念二、使用触发器进行数据库审计1. 创建审计表2. 创建触发器三、Java

浅谈mysql的not exists走不走索引

《浅谈mysql的notexists走不走索引》在MySQL中,​NOTEXISTS子句是否使用索引取决于子查询中关联字段是否建立了合适的索引,下面就来介绍一下mysql的notexists走不走索... 在mysql中,​NOT EXISTS子句是否使用索引取决于子查询中关联字段是否建立了合适的索引。以下

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

Java实现自定义table宽高的示例代码

《Java实现自定义table宽高的示例代码》在桌面应用、管理系统乃至报表工具中,表格(JTable)作为最常用的数据展示组件,不仅承载对数据的增删改查,还需要配合布局与视觉需求,而JavaSwing... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

Go语言代码格式化的技巧分享

《Go语言代码格式化的技巧分享》在Go语言的开发过程中,代码格式化是一个看似细微却至关重要的环节,良好的代码格式化不仅能提升代码的可读性,还能促进团队协作,减少因代码风格差异引发的问题,Go在代码格式... 目录一、Go 语言代码格式化的重要性二、Go 语言代码格式化工具:gofmt 与 go fmt(一)