使用动态分析和属性图检测CSRF漏洞

本次分享一篇2017年CCS论文,题目是《Deemon: Detecting CSRF with Dynamic Analysis and Property Graphs》,其DOI链接点击这里

这篇文章主要针对Web应用中经常出现的CSRF漏洞,使用动态分析和属性图,设计了一个自动化的检测工具。下面进行介绍。

概述

CSRF(跨站请求伪造,Cross-Site Request Forgery)漏洞是一种非常严重的Web漏洞。虽然针对XSS(跨站脚本攻击, Cross Site Scripting)与SQLi(SQL注入,SQL injection)的对策与检测手段已经有大量的研究,但针对CSRF的检测仍主要靠人工。

本文介绍了由作者开发的工具Deemon,且据目前所知是第一个检测CSRF漏洞的安全自动检测框架。其方法基于一种新的、捕捉Web应用多个特征的模型范式,其中包括执行轨迹、数据流,与结构分层、统一的、全面的属性图。文中展示了这个范式,并演示如何使用动态跟踪的方法自动化地建立一个具体的模型。之后,对图进行遍历,可以挖掘出可能含有漏洞的操作。通过使用模型捕捉到的信息,可以自动生成、进行安全测试,来实际验证发现的CSRF问题。

简介

没有比CSRF更能体现Web平台基本功能缺失的漏洞了。即使对不受信任网站的一个简单的访问,就可以导致受害浏览器对一个完全无关的、具有漏洞的Web应用,进行一个经过验证的、安全敏感的操作,而不引起受害者的注意或允许。为实现CSRF攻击,攻击者的网页上创建一个跨源的(cross-origin)HTTP请求就足够了。使用HTTP的img标签很容易实现。

从2001年被发现以来,CSRF一直是Web应用安全风险的前三位,另两位是XSS与SQL注入攻击。但与它们相比,CSRF引起的注意可谓微不足道。大部分研究集中在主动或被动的防御机制,几乎没有为开发者与从业人员针对这类漏洞提出的高效检测技术。

本文提出了Deemon,一个基于模型的安全测试框架,以检测CSRF漏洞。据作者所知,这是第一个针对CSRF漏洞的自动测试技术。Deemon自动增加web应用的执行环境,以使动态执行轨迹(dynamic execution trace)无监督地生成,例如,网络转移、服务器端执行或数据库操作。使用这些轨迹,Deemon推断出web应用的一个基于属性图的模型,模型捕获不同部分的统一表达,例如状态转移与数据流模型。通过图的遍历,Deemon识别出导致安全相关状态变化的HTTP请求,这些可能存在CSRF漏洞。最后,对增加的web应用运行时施加影响,Deemon针对真实的环境对可能的漏洞进行验证。

跨站请求伪造(CSRF)

在CSRF攻击中,攻击者欺骗受害者的浏览器,去向一个存在漏洞的良性网站发送请求,以使一个期望的操作发生而不被受害者察觉或允许。这里“期望的操作”可以是:非法的财产转账、修改账户用户名,或者在服务器端执行特定代码。CSRF攻击主要可以分为两类:认证CSRF与登录CSRF。在认证CSRF(authenticated CSRF, aCSRF)中,一个事先建立好的用户认证会话(session)存在于受害者浏览器与目标web应用中。在注册CSRF中,上述关系不存在,但攻击者的目标是通过受害者的认证信息,使受害者登入。文章的剩余部分着重于aCSRF,因为它明显更加广泛。

文中对aCSRF给出了正式的定义:

定义 一个web应用(如bank.com)易受到aCSRF攻击,如果它按照下面的属性接受HTTP请求:

  • (P1)传入的请求导致web应用的安全状态更改。
  • (P2)请求可以由攻击者可靠地创建。也就是说,攻击者知道请求的所有必需的参数和值。
  • (P3)请求是在一个有效的用户身份验证上下文内处理的。

在其它类型的攻击中,跨源攻击的使用可以不导致服务器端的状态发生变化,例如获取用户在目标网站上存储的信息。这些攻击由同源策略(same-origin policy)解决。然而同源策略并不阻止浏览器发送HTTP请求。服务器可以检查HTTP请求头部的Origin字段,以抵抗存在攻击嫌疑的跨源请求。但是这个字段不一定会在请求中出现。目前防范aCSRF的最佳方法叫做反CSRF记号(anti-CSRF token),它是由服务器生成、被客户端明确地添加进请求中的一个伪随机数。由多种方法可实现反CSRF记号,如表单中的隐藏字段、定制HTTP头等。

检测aCSRF的难点

用于检测aCSRF脆弱性的安全测试方法面临两种截然不同的难点:检测难点与操作困难。它们都没有在安全测试中达到目前的最高水平。

检测难点

检测aCSRF需要根据应用状态、角色、请求参数状态与观测到的状态转移序列做出推论。这导致了一组特定的检测难点,它们直接来自于脆弱性的独特特性。

  • C1:状态转移。服务器端程序实现了若干个功能,它们不全部影响应用的状态,例如在线购物的搜索商品功能。但是,其它操作会改变程序状态。例如用户修改密码的操作,服务器端使用新密码更新数据库,从此之后不再接受旧密码,也就是说状态改变了。
  • C2:安全有关状态的变化。状态变化可能由事件日志或记录用户活动轨迹导致,但它们对于安全而言是不必要的。人可以明确区分这两种情况,但没有明确指明应用逻辑的自动化工具很难区分。
  • C3:请求参数与状态转移之间的关系。对它的鉴定与aCSRF漏洞相关。例如,考虑一个携带随机安全记号(token)的请求,攻击者不能猜出这个参数的值,因此不能重新发出一个类似的请求。

操作难点

  • C4:在大型应用工作流之间的转移。动态分析技术,例如无监督的web扫描器使用深度优先或广度优先算法扫描HTML网页,但是这些方法对于现代web应用复杂的工作流来说过于简单。同样地,静态分析方法检测源代码中的模式,但没有对工作流的准确描述,静态分析方法在大型应用面前显得无力。
  • C5:无副作用测试。动态分析方法集中于迭代地检测使状态改变的HTTP请求(难点C1与C2)。但是,因为这类请求确会改变应用状态,进一步的测试往往会在一个无效状态上进行操作。例如网上购物应用,当测试提交购物车支付请求后,针对这一状态的测试就不能进行了,因为购物车已经不存在了。因此,测试方法应在无副作用环境下进行操作。
  • C6:全面、可重用的应用功能。最后一个难点是以上所有难点导致的。为检测安全相关的状态变化,我们需要结合应用的各个部分。一方面,我们有描述服务器端程序状态演进的过渡;另一方面,我们有说明数据项在层与状态之间传播的数据流。这些可以被模型(model)代替。

Deemon概览

特性

Deemon解决上述问题的特性有:

  • Deemon使用模型描述程序执行中捕获的状态过渡与数据流信息(难点C1、C3)。
  • Deemon使用属性图代表上述模型。这样提供了一个统一可重用的代表方式,并可以使用带标签的边(labeld edge)精确描述模型间的关系(难点C6)。
  • Deemon通过图遍历的方式访问属性图,来识别安全相关的状态更改(难点C2)。
  • Deemon增大web应用的运行环境,之后复制一系列的用户操作,以观察服务器端程序的执行(难点C4)。
  • Deemon使用虚拟化环境测试web应用。这使得为web应用制作、重现快照(snapshot)成为可能。

测量

给定一个应用容器,Deemon自动安装检查程序执行的传感器。例如,对基于PHP的web应用,Deemon添加PHP解释器的Xdebug模块。进一步地,Deemon安装一个本地的HTTP代理,以拦截服务器与浏览器交换的HTTP信息。

结语

这篇文章示范了如何介绍一个程序作为论文主体内容。文章内容丰富,限于时间没有完全介绍,但我认为这篇文章能够根据现有问题,分点加以阐述,并针对每一点解释自己的工作是如何解决问题的,这样使得文章更加具有说服力。