RASP初识

需要了解的东西.

  • 是什么

拦截日志:rasp/logs/alarm/alarm.log

RASP(Runtime application self-protection)运行时应用自我保护。

官方英译
应用程序不应将大部分运行时保护委托给外部设备。应用程序应该能够自我保护(即,在应用程序运行时环境中内置保护功能)
真正的RASP技术运行在应用层,具有用户、应用逻辑和域信息的完整上下文。
RASP需要一系列不可改变的规则,这些规则靠上下文洞悉何时引入了新漏洞,并据此采取相应的措施。这种不可改变性是可以达到的,只要规则内置进应用层代码库中,且部署后无需任何变更。
无论该应用程序在哪个服务器上。它监测从应用程序到系统的所有请求,确保他们是安全的,并在应用程序中直接验证数据请求。

看这图就知道了RASP的两个功能:告警+拦截
image.png

有什么作用

  • 基本安全防护、日志采集
  • 做拦截
  • 打补丁

传统WAF有什么不足

传统的 WAF 主要通过分析流量中的特征过滤攻击请求,并拦截携带有攻击特征的请求。WAF 虽然可以有效个过滤出绝大多数恶意请求,但是不知道应用运行时的上下文,必然会造成一定程度的误报。并且 WAF 严重依赖于特征库,各种花式绕过,导致特征编写很难以不变应万变

应用运行时的上下文是指什么?它在编程中的具体起什么作用?

上下文代表了程序当下所运行的环境,是一个整体的环境,联系你整个app的生命周期与资源调用,是程序可以访问到的所有资源的总和,资源可以是一个变量,也可以是一个对象的引用
在应用程序中某个特定时间段内,程序运行时所处的环境或状态,包括应用程序当前的配置、变量、对象和方法等。
作用于整个应用的上下文,如果运行时只有一个应用,那么可以把它视为是「全局」的上下文;倘若运行时中存在多个应用,那就是每个应用对应一个应用上下文。
在一个应用程序中,不同的代码模块或函数可能会使用不同的变量、配置和对象等,这些东西都与应用程序的上下文有关。
应用上下文中维护的是单一应用范围内共享的状态,如路由、主题、国际化等配置信息,和用户的基本信息与权限等。

举个例子,说说应用程序上下文的作用

如果用户在浏览商品时,价格发生变化,应用可以根据上下文信息展示最新的价格。
在这里,上下文信息就是商品价格这个变量了
应用程序状态:例如正在执行的代码路径、函数调用堆栈、变量值等。
用户会话信息:包括用户身份、权限和活动历史。
输入和输出数据:应用程序接收的请求、参数、数据流和响应。
系统和网络状态:操作系统和网络连接的状态信息。

为什么通过上下文感知就可以更精准地检测攻击

通过上下文感知,可以更精准地监控应用中的变量、函数、程序状态的变化,能够基于应用程序的实际运行情况作出决策,可以检测到对敏感函数的未经授权调用或对数据库的异常查询。

相对于WAF,RASP最突出的功能是什么?

RASP 的不同就在于运行在应用之中,与应用融为一体,可以获取到应用运行时的上下文,根据运行时上下文或者敏感操作,对攻击进行精准的识别或拦截。
题外话
waf是依靠特征检测攻击,存在一定的误报,而RASP审查的是最终需要执行的代码
所以,RASP插桩到代码层面上,可以分析栈堆跟踪信息。
避免漏报!

与RASP有关的一些名词

  • DAST(Dynamic Application Security Testing):动态应用程序安全测试,它模拟黑客行为对应用程序进行动态攻击;
  • SAST(Static application security testing):静态应用程序安全测试,通过检查代码以发现软件缺陷和安全漏洞
  • IAST(Interactive Application Security Testing):交互式应用程序安全测试,通过代理、VPN或者在服务端部署Agent程序,收集、监控Web应用程序运行时函数执行、数据传输,并与扫描器端进行实时交互,高效、准确的识别安全缺陷及漏洞

IAST相当于是DAST和SAST结合的一种互相关联运行时安全检测技术

IAST和RASP又又什么不同?

一个是交互式应用程序安全测试,一个是运行时应用程序自我保护,都是在程序运行过程中,寻找问题的,而IAST更偏向找漏洞,RASP更偏向保护应用程序、检测生产环境中攻击。

RASP与HIDS有什么区别

RASP是插桩到代码程序上的,形成一个自我保护的框架,主要是守护某个应用不被攻击;
HIDS是主机入侵检测,只有检测功能,并没有实际的拦截功能,而且HIDS主要对象是主机IP,而RASP是应用程序。

  • 功能不同
  • 主要对象不同
  • 作用不同

java Rasp可以从哪几个层面来实现

  • 编译期
  • 字节码加载前
  • 字节码加载后

为什么选择了字节码加载前,就将代码注入进去

在编译期进行 AOP 织入,一般需要编写静态代理,导致灵活性差,对原有的应用代码有修改。
至于为什么不在字节码加载后,进行aop植入,看看chatgpt怎么说的
image.png

javarasp在字节码加载前,怎么把代码写入

有两种方式,一种是Classloader,但是会对现有代码进行修改,另一种是Instrumentation
JDK5版本中提供了Instrumentation功能, 它的最大作用就是可以动态改变和操作字节码

如何利用java Instrumentation在class加载前插入修改代码

“java.lang.instrument”包的具体实现依赖于 JVMTI 。JVMTI(Java Virtual Machine Tool Interface)是一套由 Java 虚拟机提供的。
在这里我们就需要在插入对象的main函数执行前,就插入进去,需要借助premain函数,
然后添加自定义好的类转换器,每当关注的java代码转换成字节码,并执行时,就会走向我们ClassTransformer函数;
这样子,就可以将我们的过滤代码无痕植入了

premain是程序在运行main()之前执行的逻辑, 可以在这部分逻辑中做字节码的修改等操作

除了 ognl.Ognl 类中的 parseExpression 方法加探针外,还有哪些地方可以加探针

比如:java/io/ObjectInputStream、java/lang/ProcessBuilder、com/mysql/jdbc/StatementImpl 等等。重点关注数据的关键流转节点加入 Rasp 探针,进行安全过滤。

OpenRASP

有关 RASP 的理念,早在2014年就已经被提出,并且被世界顶级咨询公司 Gartner列为应⽤安全领域的“关键趋势”。为什么四年以来,RASP 仍然没能取代 WAF 的江湖地位?

CPU 性能损耗 20%
一个安全进程消耗了 CPU 20% 的性能,团队采用了之前没人在这类产品上使用的 JavaScript(JS)语言编写了所有的检测逻辑。
解决办法:用火狐最新版的 Rhino 引擎替代之前的谷歌 V8 引擎来编写代码,JS+Rhino 组合,把 CPU 的性能损耗迅速降到了1%-5% 的可用水平。

参考文献:

  1. https://www.secrss.com/articles/54496
  2. https://developer.aliyun.com/article/1193185
  3. 应用程序上下文什么意思-掘金
  4. 聊聊中后台前端应用:上下文的那些事儿
  5. Rasp 技术介绍与实现

个人使用感受

RASP的缺点是什么?

  • 针对性:这个是缺点,同样也是有点,RASP针对每一种编程语言,都有针对性的编写格式,并不能相互通用,目前可以实现RASP的语言有java、php、python、go,其他未发现。
  • 性能消耗:一个RASP的性能消耗是远大于waf,他需要针对每一个关注类进行插桩,这样无疑会增大服务器负担,性能消耗可承受范围5%-10%
  • 不易维护:无论是javassist插桩,还是ASM插桩,没有比较深的java基础,是很难进行修改的,通过字节码修改classs文件,这一个过程比较难写。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/140950.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

如何进行销售漏斗管理?

本文将为大家讲解:如何进行销售漏斗管理? 销售漏斗管理是现代销售管理的核心概念之一。它将销售过程分解为一系列阶段,从而帮助销售团队更有效地跟踪和管理潜在客户。本文将深入探讨销售漏斗管理的方法,并结合简道云CRM的实际应用…

LeetCode 494.目标和 (动态规划 + 性能优化)二维数组 压缩成 一维数组

494. 目标和 - 力扣(LeetCode) 给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 或 - ,然后串联起所有整数,可以构造一个 表达式 : 例如,nums [2, 1] ,可以在 2…

Java中如何将String类型的2023年09月21日这个值变成DATE相关的类型

Java中如何将String类型的2023年09月21日这个值变成DATE 可以通过使用Java中的SimpleDateFormat类完成。以下是一个例子: import java.text.SimpleDateFormat; import java.text.ParseException; import java.util.Date;public class Main {public static void ma…

Linux动态库

定义:动态函数库,是在程序执行时动态(临时)由目标程序去调用 优点: 调用时不复制,程序运行时动态加载到内存,供程序调用,系统只加载一次,多个程序可以共用,…

大厂面试之算法篇

目录 前言 算法对于前端来说重要吗? 期待你的答案 算法 如何学习算法 算法基础知识 时间复杂度 空间复杂度 前端 数据结构 数组 最长递增子序列 买卖股票问题 买卖股票之交易明细 硬币找零问题 数组拼接最小值 奇偶排序 两数之和 三数之和 四数之…

9.19号作业

2> 完成文本编辑器的保存工作 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QFontDialog> #include <QFont> #include <QMessageBox> #include <QDebug> #include <QColorDialog> #include <QColor&g…

Python 打印素数

"""打印素数介绍&#xff1a;素数是指只有两个正因数&#xff08;1和它本身&#xff09;的自然数&#xff0c;而且必须大于1。例如&#xff1a;2、3、5、7、11、13、17、19、23、29等等都是素数。小于2的数不是素数&#xff0c;因为它没有两个正因数。例如&…

对话ChatGPT:AIGC时代下,分布式存储的应用与前景

随着科技的飞速发展&#xff0c;我们正步入一个被称为AIGC时代的全新阶段&#xff0c;人工智能、物联网、大数据、云计算成为这个信息爆炸时代的主要特征。自2022年11月以来&#xff0c;ChatGPT的知名度迅速攀升&#xff0c;引发了全球科技爱好者的极大关注&#xff0c;其高超的…

java框架-Springboot3-web开发

文章目录 自动配置默认效果WebMvcAutoConfigurationWebMvcConfigurer接口静态资源访问首页Favicon缓存 自定义静态资源路径1、配置方式2、代码方式 路径匹配规则内容协商默认支持json配置支持xml内容协商原理自定义支持ymal 模板引擎模板引擎Thymeleaf整合基础语法遍历判断属性…

静态资源的动态引入

有常用的2种方式&#xff1a; 1、css中的静态路径 2、img中的src静态路径 运行的环境是打包后的图片路径&#xff0c;而打包后的图片通常会生成一个文件指纹&#xff0c;而我们在写代码时&#xff0c;写的是源码中的路径和文件名&#xff0c;如果是静态路径&#xff0c;则会自动…

升级iOS17后可以降级吗?iOS17退回iOS16方法教程分享

iOS 17已上线几天&#xff0c;从网上用户的反馈和媒体机构的报告来看&#xff0c;iOS17系统对旧机型来说并不友好&#xff0c;除了电池续航下降以外&#xff0c;占用大量储存空间&#xff0c;BUG也不少。 苹果于 9 月 7 日发布了 iOS 16.6.1 版本&#xff0c;如果升级iOS17后发…

What is the difference between Parseval‘s theorem and Plancherel Theorem

Plancherel定理是调和分析里的一个结论, 最早由Michel Plancherel证明, 其可表述为 对同时属于 L 1 ( R ) L^{1}(R) L1(R) 和 L 2 ( R ) L^{2}(R) L2(R) 的函数f来说,其傅立叶变换F属于 L 2 ( R ) L^{2}(R) L2(R) ,且傅立叶变换是等距变换.数学表述为&#xff1a; ∥ f ^ ∥ 2…

正确生成hashCode和equals方法,以及联合Map,set集合达到去重目的

Idea自动生成HashCode和equals视频链接 https://live.csdn.net/v/330419实体类 对name和age两个属性重写hashCode&#xff0c;equals方法 package TestEqualsHashCode; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok…

使用命令行快速创建Vite项目

一、构建项目 在终端中使用如下命令行&#xff1a; npm create vite 二、定义项目名称 三、选择项目类型 Vanilla是我们常用的JavaScript&#xff0c;Vue和React是常用前端框架&#xff0c;可以根据自己的需要进行选择 通过上下键进行选择&#xff0c;按下回车进行确认 创建…

Python中使用EMD(经验模态分解)

在Python中使用EMD&#xff08;经验模态分解&#xff09;进行信号分解时&#xff0c;通常可以设置信号分解的数目。EMD算法的目标是将信号分解成多个称为“本征模态函数”&#xff08;Intrinsic Mode Functions&#xff0c;简称IMF&#xff09;的成分&#xff0c;每个IMF都代表…

2023/09/20 day4 qt

做一个动态指针钟表 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPainter> //绘制事件类 #include <QPaintEvent> //画家类 #include <QTime> #include <QTimer> #include <QTimerEvent> QT_BEGIN…

简单而经典:Java中的冒泡排序算法详解

当谈到简单的排序算法时&#xff0c;冒泡排序&#xff08;Bubble Sort&#xff09;通常是其中之一。虽然它不是最高效的排序算法之一&#xff0c;但它的简单性和易于理解使它成为学习排序算法的良好起点。在本文中&#xff0c;我们将详细介绍Java中的冒泡排序。 冒泡排序的基本…

linux安装配置 flume

目录 一 解压安装包 二 配置部署 &#xff08;1&#xff09;修改配置 &#xff08;2&#xff09;下载工具 &#xff08;3&#xff09;创建配置文件 &#xff08;4&#xff09;启动监听测试 &#xff08;5&#xff09;flume监控文件 一 解压安装包 这里提供了网盘资源 链…

js中的数据结构:栈,队列,链表,字典哈希表,树

栈&#xff1a;先进后出 队列&#xff1a;先进先出 链表&#xff1a; 单链表&#xff1a; 双链表&#xff1a; 环形链表&#xff1a;最后一个数据的next指针不是指向null&#xff0c;指向的是任意之间的一个数据&#xff0c;形成一个环 数组和链表的区别&#xff1a; 字典和哈…

HT for Web (Hightopo) 使用心得(2)- 2D 图纸、节点、连线 与基本动画

概括来说&#xff0c;用 HT for Web 做可视化主要分为两部分&#xff0c;也就是 2D 和 3D。这两部分需要单独创建。在它们被创建完成后&#xff0c;我们再把它们集成到一起。 HT for Web 的 2D 部分主要是指 ht.graph.GraphView (简称 GraphView&#xff0c;也就是 2D 图纸)。…