PHP 中的 RASP 实现流程分析

2022-04-17 00:47:31

一、什么是 RASP

RASP 全称是 Runtime Application self-protection,即运行时应用自我保护,这是一种嵌入到应用程序内部,实http://www.easck.com时检测来自外部的请求、输入的技术。php 的 RASP 是通过 PHP 拓展的形式嵌入到PHP 的解释器中。

RASP(Runtime Application self-protection)是一种在运行时检测攻击并且进行自我保护的一种技术。早在2012年,Gartner就开始关注RASP,惠普、WhiteHat Security等多家国外安全公司陆续推出RASP产品,时至今日,惠普企业的软件部门出售给了Micro Focus,RASP产品Application Defender随之易主。而在国内,去年知道创宇KCon大会兵器谱展示了javaRASP,前一段时间,百度开源了OpenRASP,去年年底,360的0kee团队开始测试Skywolf,虽然没有看到源码和文档,但它的设计思路或许跟RASP类似。而商业化的RASP产品有OneAPM的OneRASP和青藤云的自适应安全产品。在国内,这两家做商 GET_OP2_ZVAL_PTR(BP_VAR_R) TSRMLS_CC); FREE_OP1(); FREE_OP2(); CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE();}

函数后两个参数分别代表 op1 和 op2 可接受的操作数类型。

处理工具会根据这个函数的定义,对 op1 和 op2 进行类型组合,生成16个处理特定类型的 handler函数。这些 handler 函数命名如下:

static int ZEND_FASTCALL  ZEND_ADD_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { /* handler code */ }static int ZEND_FASTCALL  ZEND_ADD_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { /* handler code */ }static int ZEND_FASTCALL  ZEND_ADD_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { /* handler code */ }static www.easck.comint ZEND_FASTCALL  ZEND_ADD_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { /* handler code */ }static int ZEND_FASTCALL  ZEND_ADD_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { /* handler code */ }static int ZEND_FASTCALL  ZEND_ADD_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)  { /* handler code */ }......

规律为:static int ZEND_FASTCALL OPCode_SPEC_{OP1-TYPE}_{OP2-TYPE}_HANDLER

所以最终执行哪个 handler 是根据需要两个操作数的类型决定的。

所以我们可以替换OPCode的handler,刚好源码中有对应的接口zend_set_user_opcode_handler(zend_uchar opcode, user_opcode_handler_t handler)可供使用。

除了 OPCode 外,PHP 还有很多内置函数,比如 sprintf、 system、usort 等等,这些函数是没有OPcode 的,但是这些函数都被保存在了全局函数表里,可以通过 CG(function_table) 获取,这些函数也有对应的handler函数指针,所以我们可以直接备份原先的 handler 后使用 function->internal_function.handler = new_handler 替换即可。

相关文章 大家在看