入侵的定义
我们可以给入侵下一个定义:就是黑客在未经授权的情况下,控制、使用我方资源(包括但不限于读写数据、执行命令、控制资源等)达到各种目的。从广义上讲,黑客利用SQL注入漏洞窃取数据,或者拿到了目标域名在ISP中的帐号密码,以篡改DNS指向一个黑页,又或者找到了目标的社交帐号,在微博/QQ/邮箱上,对虚拟资产进行非授权的控制,都属于入侵的范畴。

Web入侵
随着高危端口的加固,黑客知识库里的攻击手法很多都会失效了。但是Web服务是现代互联网公司的主要服务形式,不可能都关掉。于是,基于PHP、Java、ASP、ASP.NET、Node、C写的CGI等等动态的Web服务漏洞,就变成了黑客入侵的最主要入口。

比如,利用上传功能直接上传一个WebShell,利用文件包含功能,直接引用执行一个远程的WebShell(或者代码),然后利用代码执行的功能,直接当作Shell的入口执行任意命令,解析一些图片、视频的服务,上传一个恶意的样本,触发解析库的漏洞……

Web服务下的应用安全是一个专门的领域,具体的攻防场景和对抗已经发展得非常成熟了。当然,由于它们都是由Web服务做为入口,所以入侵行为也会存在某种意义上的共性。相对而言,我们比较容易能够找到黑客GetShell和正常业务行为的一些区别。

针对Web服务的入侵痕迹检测,可以考虑采集WAF日志、Access Log、Auditd记录的系统调用,或者Shell指令,以及网络层面Response相关的数据,提炼出被攻击成功的特征,建议我们将主要的精力放在这些方面。

星易网络小程序平台应用自我保护技术(RASP)
RASP(Runtime Application self-protection)是一种在运行时检测攻击并且进行自我保护的一种技术。

我的WAF世界观
为了表述方便,暂且把RASP归为WAF的一类。从WAF所在的拓扑结构,可以简单将WAF分为如下三类,如下图所示:
星易网络小程序平台应用自我保护技术
1 以阿里云为代表的云WAF以中间人的形式,在HTTP请求到达目标服务器之前进行检查拦截。
2 以ModSecurity为代表的传统WAF在HTTP请求到达HTTP服务器后,被Web后端容器解释/执行之前检查拦截HTTP请求。
3 RASP工作在Web后端解释器/编译器中,在漏洞代码执行前阻断执行流。

从上图中WAF所处的位置可以看出,云WAF和传统WAF的检查拦截HTTP请求的主要依据是HTTP Request,其实,如果站在一个非安全从业者的角度来看,这种检测方式是奇怪的。我们可以把Web服务看做是一个接受输入-处理-输出结果的程序,那么它的输入是HTTP请求,它的输出是HTTP响应。靠检测一个程序的输入和输出来判断这个程序的运行过程是否有害,这不奇怪吗?然而它又是可行且有效的,大多数的Web攻击都能从HTTP请求中找到蛛丝马迹。这种检测思路是云WAF和传统WAF能有效工作的原因,也是它们的缺点。

我认为,问题发生的地方是监控问题、解决问题的最好位置。Web攻击发生在Web后端代码执行时,最好的防护方法就是在Web后端代码执行之前推测可能发生的问题,然后阻断代码的执行。这里的推测并没有这么难,就好像云WAF在检查包含攻击payload的HTTP请求时推测它会危害Web服务一样。这就是RASP的设计思路。

设计思路
PHP RASP的设计思路很直接,安全圈有一句名言叫一切输入都是有害的,我们就跟踪这些有害变量,看它们是否对系统造成了危害。我们跟踪了HTTP请求中的所有参数、HTTP Header等一切client端可控的变量,随着这些变量被使用、被复制,信息随之流动,我们也跟踪了这些信息的流动。我们还选取了一些敏感函数,这些函数都是引发漏洞的函数,例如require函数能引发文件包含漏洞,mysqli->query方法能引发SQL注入漏洞。简单来说,这些函数都是大家在代码审计时关注的函数。我们利用某些方法为这些函数添加安全检查代码。当跟踪的信息流流入敏感函数时,触发安全检查代码,如果通过安全检查,开始执行敏感函数,如果没通过安全检查,阻断执行,通过SAPI向HTTP Server发送403 Forbidden信息。当然,这一切都在PHP代码运行过程中完成。

这里主要有两个技术问题,一个是如何跟踪信息流,另一个是如何安全检查到底是怎样实现的。

我们使用了两个技术思路来解决两个问题,第一个是动态污点跟踪,另一个是基于词法分析的漏洞检测。

RASP有哪些优点呢?作为纵深防御中的一层,它加深了纵深防御的维度,在Web请求发生时,从HTTP Server、Web解释器/编译器到数据库,甚至是操作系统,每一层都有自己的职责,每一层也都是防护攻击的阵地,每一层也都有对应的安全产品,每一层的防护侧重点也都不同。

RASP还有一些比较明显的优点,一是对规则依赖很低,如果使用词法分析做安全检测的话基本不需要维护规则。二是减少了HTTP Server这层攻击面,绕过比较困难,绝大多数基于HTTP Server特性的绕过对RASP无效。例如HPP、HPF、畸形HTTP请求、各种编码、拆分关键字降低评分等。三是误报率比较低。从比较理想的角度来说,如果我的后端代码写得非常安全,WAF看到一个包含攻击payload的请求就拦截,这也属于误报吧。