RASP初识

需要了解的东西.

  • 是什么

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

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

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

看这图就知道了RASP的两个功能:告警+拦截
RASP初识_第1张图片

有什么作用

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

传统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怎么说的
RASP初识_第2张图片

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文件,这一个过程比较难写。

你可能感兴趣的:(rasp,网络,安全威胁分析,web安全)