一种针对浏览器缓存投毒的防御方法及系统与流程

文档序号:15683631发布日期:2018-10-16 20:49阅读:707来源:国知局

本发明涉及计算机网络安全领域,用于对抗利用浏览器缓存机制实施的缓存投毒攻击,更具体地,是一种针对浏览器缓存投毒的检测方法及系统。



背景技术:

浏览器缓存投毒是指攻击者利用中间人等攻击手段将恶意javascript脚本植入到客户端浏览器缓存中,在缓存不被清除的前提下,用户每次访问网页,将会加载恶意javascript脚本,进而达到窃取用户账号密码、浏览记录,劫持、篡改流量等目的,严重威胁到用户个人信息安全。

浏览器缓存机制的设计初衷是让浏览器将一些静态资源(如:图片、ccs、javascript文件等)存储在本地,从而减少网络延迟,降低web服务器的负载,提升用户体验。其主要实现方式是通过http协议与服务器进行缓存资源的协商与校验,服务器可在http响应头中设置expires、cache-control属性的值来控制资源的有效时间,设置last-modified、etag属性的值来判断资源的版本。在有效时间内,浏览器可以直接从本地缓存中获取该资源,而不需要再向服务器发送请求。然而,浏览器缓存机制也为攻击者提供了机会,通过中间人等手段,攻击者可以用恶意的javascript脚本替换原始资源,并设置长久的缓存时间,使得恶意javascript脚本能驻留在浏览器缓存之中。

javascript主要作为客户端脚本语言在客户端的浏览器上运行,能为网页添加各式各样的动态功能,增加交互性,为用户提供更流畅美观的浏览效果。随着浏览器技术的不断完善,以及ajax、html5等web技术的迅速发展,javascript得到了广泛应用,并可以调用许多系统功能,比如操作本地文件、操作图片、调用摄像头和麦克风等等,甚至可以用来进行服务器端的开发(例如node.js)。javascript脚本可以直接嵌入到html页面里,也可以通过外部引用的方式,将已存在的javascript脚本路径写入到页面,在访问页面的同时向服务器请求加载这些脚本资源。通常,为了提升服务器响应速度,这些外部引用的javascript脚本会在一定时效内缓存到本地。因此,当缓存的javascript脚本被攻击者替换为恶意代码,甚至实现了跨站点共享,并在每次访问网页的时候被加载执行时,用户的个人信息安全将变得荡然无存。

目前,浏览器缓存投毒的防御方法主要基于客户端和服务器。对于客户端来说,一方面,可以通过浏览器的相关设置来定时清除浏览器缓存;另一方面,如果同一网页进行再次访问时,可以进行刷新或者强制刷新。当客户端进行f5刷新时,缓存有效时间将不再生效,服务器会重新验证资源的完整性,并判断是否需要重新加载资源;当客户端进行强制刷新时,浏览器不会使用缓存资源,而会向服务器重新请求资源。基于客户端的防御方法需要用户具有较高的安全意识,并且影响到用户体验。对于服务器来说,可以采取隔离缓存文件、url随机化的方法,来防止客户端直接从缓存中读取页面信息,但这又势必会影响到响应速度,违背了浏览器缓存的初衷。现有的防御方法都不同程度的存在问题,尤其是无法在保护用户个人信息的同时,兼顾用户体验。



技术实现要素:

为解决上述问题,本发明提出的一种针对浏览器缓存投毒的防御方法及系统,通过客户端和服务器的交互验证来实现,可以在不影响用户体验的同时,有效防御浏览器缓存投毒攻击,保护用户个人信息安全。

为达到上述目的,本发明采用具体技术方案是:

一种针对浏览器缓存投毒的防御方法,包括以下步骤:

当通过检测发现浏览器向服务器发送请求页面,并调用本地的缓存控制关键函数时,拦截该缓存控制关键函数;

根据缓存控制关键函数获取该请求页面中所有未缓存过期的javascript文件,并对javascript文件进行哈希值计算;根据计算结果校验javascript文件是否被篡改,如是,则将其缓存时间调整至早于当前时间。

进一步地,根据计算结果校验javascript文件是否被篡改包括:

将javascript文件名与其哈希值组成的json数据;

查找与javascript文件名对应的存储在本地的哈希值,将json数据中的哈希值与本地的哈希值进行比对,并生成校验值对,表示文件是否被篡改。

进一步地,所述哈希值计算选用常用hash算法,比如md5、sha等,但不限于此。

进一步地,如json数据中的哈希值与本地的哈希值不一致,则生成{“文件名”:“fail”}校验值对;若两者一致,则生成{“文件名”:“success”}。

一种针对浏览器缓存投毒的防御系统,包括:

部署在客户端浏览器上的hook模块,散列值生成模块及缓存更新模块;用以实现客户端与服务器数据传输的数据传输模块,部署在服务器上缓存校验模块;其中,

所述hook模块用以当通过检测发现浏览器向服务器发送请求页面,并调用本地的缓存控制关键函数时,拦截该缓存控制关键函数;

所述散列值生成模块用以根据缓存控制关键函数获取该请求页面中所有未缓存过期的javascript文件,并对javascript文件进行哈希值计算;

所述缓存校验模块根据计算结果校验javascript文件是否被篡改;

如文件被篡改,所述缓存更新模块用以将javascript文件的缓存时间调整至早于当前时间。

进一步地,所述缓存校验模块根据计算结果校验javascript文件是否被篡改包括:

将javascript文件名与其哈希值组成的json数据;

查找与javascript文件名对应的存储在本地的哈希值,将json数据中的哈希值与本地的哈希值进行比对,并生成校验值对,表示文件是否被篡改。

进一步地,如json数据中的哈希值与本地的哈希值不一致,则所述缓存校验模块生成并向服务器发送{“文件名”:“fail”}校验值对;若两者一致,则所述缓存校验模块生成并向服务器发送{“文件名”:“success”}。

进一步地,所述散列值生成模块进行哈希值计算选用常用hash算法,比如md5、sha等,但不限于此。

通过采取上述技术方案,与现有技术相比,本发明具有以下几点优势:

首先,缓存校验过程中使用哈希值校验所消耗的时间单位为ms级,在网络环境良好的情况下,缓存校验过程不会让客户端察觉,可以在不影响客户端体验的同时,有效的防御浏览器缓存投毒攻击。

并且,利用文件哈希值,能够快速并可靠的验证缓存文件的真实性。

综上,本发明通过采用了客户端与服务器交互验证的方法,通过计算并比对缓存文件哈希值来判断缓存文件的真实性,同时根据校验结果,对可疑缓存文件进行强制刷新,从而保护客户端的个人信息安全。

附图说明

图1是本发明一实施例中针对浏览器缓存投毒防御系统的总括流程示意图。

图2是本发明一实施例中缓存探针构成示意图。

图3是本发明一实施例中缓存校验插件构成示意图。

图4是本发明一实施例中系统建立和总括流程图。

图5是本发明一实施例中散列值生成模块示意图。

图6是本发明一实施例中缓存校验模块示意图。

图7是本发明一实施例中缓存更新模块示意图。

具体实施方式

为了使本技术领域的人员更好地理解本发明实施例中的技术方案,并使本发明的目的、特征和优点能够更加明显易懂,下面结合附图和事例对本发明中技术核心作进一步详细的说明。

在本发明中,设计了一套可靠而有效的浏览器缓存投毒防御系统,能够有效解决上述所存在的问题,所述系统包括如下:

如图1所示,针对浏览器缓存投毒防御系统的总括流程示意图。系统分为客户端与服务器两个部分,对于客户端,需要在浏览器中嵌入缓存探针;对于服务器,需要在服务器中安装缓存校验插件。当客户端在客户端使用浏览器访问网页时,缓存探针开始工作,与服务器进行缓存校验,校验完毕后,浏览器开始加载、解析并渲染页面。

如图2所示,缓存探针包括hook(钩子)模块、校验值生成模块、数据传输模块、缓存更新模块。

如图3所示,缓存校验插件包括缓存校验模块、数据传输模块。

其中,在客户端和服务器分别部署的数据传输模块用以数据传输,应视为一个整体的通讯系统。

如图4所示,浏览器缓存投毒防御系统建立和总括流程图,包括:

步骤100,当客户端通过浏览器访问页面时,例如访问example.com,浏览器发出请求后,将通过缓存控制关键函数来获取该页面的缓存文件。此时,若检测到浏览器调用缓存控制关键函数时,则挂载hook模块拦截该行为,并拦截该缓存控制关键函数,使其暂不执行,首先通过后续的步骤进行验证。

步骤200,缓存探针读取浏览器缓存列表,通过缓存控制关键函数来获取该页面的缓存文件,进而获取该页面缓存时间未过期的javascript文件,例如example.com页面中含有缓存未过期文件a.js和b.js,调用散列值生成模块中md5生成函数,计算缓存文件的哈希值,该哈希值具有唯一性,长度为32位,可用来标识文件。即:

md5(a.js)=95f0a310f289230d56c3a4949c17963e

md5(b.js)=656ad21ad877025a82411b49aa0f8b88

将javascript文件名与对应的哈希值组成为json格式的数值对:

{“a.js”:“95f0a310f289230d56c3a4949c17963e”

“b.js”:“656ad21ad877025a82411b49aa0f8b88”

}

也可以理解为将javascript文件名与该文件的哈希值组成的json(javascriptobjectnotationjs对象标记)数据发送到服务器。其中,采用的md5算法是公知的,此例中可封装成函数放在散列值生成模块中,直接调用即可。

步骤300,客户端的数据传输模块将步骤200中生成的数值对传送到服务器,服务器接收该数值对。

步骤400,服务器中缓存校验模块根据获取的数值对中的文件名,读取该文件名在服务器存储的哈希值,并与数值对中的哈希值进行比对。如果不一致,则标记校验结果为“fail”,否则,标记校验结果为“success”。将文件名与对应的校验结果组成为json格式的校验值对:

{“a.js”:“fail”

“b.js”:“success”

}

步骤500,服务器的数据传输模块将步骤400中生成的校验值对传送到客户端,客户端端接收该校验值对。

步骤600,客户端中缓存更新模块接收到校验值对,获取客户端系统当前时间,将标记为“fail”的缓存文件缓存过期时间(缓存过期时间一般在缓存响应头expires字段中)修改为客户端当前时间的前一天。如果为success,则不做处理。当处理完所有校验值后,释放hook模块,停止拦截,浏览器可以正常调用函数,加载页面。缓存更新模块根据接收的校验值对来决定是否更新缓存时间。

如图5所示,散列值生成模块示意图,包括:

步骤210,读取javascript缓存文件的缓存过期时间。一般来说,在网页被第一次访问时,http响应头中会规定该文件的缓存过期时间,主要是expires策略和cache-control策略。expires是响应消息头字段,记录的是缓存文件过期时间。cache-control与expires的作用一致,都是指明当前资源的有效期,但cache-control的选择更多,设置更细致,如果同时设置的话,其优先级高于expires。cache-control中的max-age值指该缓存文件的生存期不大于指定时间(以秒为单位),需要与date字段配合,计算出缓存过期时间,date字段存储了本次请求的时间,则缓存过期时间expires=date+max-age。缓存文件的响应头会在第一次访问时存储到本地,本发明在读取缓存过期时间时,需严格遵守http协议定义的缓存机制。

根据浏览器缓存机制,若文件的缓存时间未过期,则直接使用缓存,而不再向服务器发送请求,这就使得恶意javascript文件有了可执行的条件。因此,可以通过文件的哈希值来进行文件完整性校验。文件的哈希值是通过hash函数计算得到,不管文件长度如何,它的hash函数计算结果是一个固定长度的数字。与加密算法不同,hash算法是一个不可逆的单向函数。采用安全性高的hash算法,如md5、sha时,两个不同的文件几乎不可能得到相同的hash结果。因此,一旦文件被篡改,就可检测出来。本系统使用md5算法,它是目前被大量广泛使用的散列算法之一,主要用于密码加密和文件校验等。也可采用其他hash算法,例如sha-1、sha-256、sha-512等。

步骤220,获取当前客户端时间,并与缓存过期时间比较,判断缓存文件是否过期。

步骤230,缓存文件未过期,则利用md5生成函数,逐一对缓存文件进行哈希值计算。例:md5(a.js)=95f0a310f289230d56c3a4949c17963e。

步骤240,将所有未过期的缓存文件名及其哈希值,组合成json格式的数值对。例:

{“a.js”:“95f0a310f289230d56c3a4949c17963e”

“b.js”:“656ad21ad877025a82411b49aa0f8b88”

}。

步骤250,将json数据传递到数据传输模块。

如图6所示,缓存校验模块示意图,起部署于服务器,用以校验javascript文件的真实性。缓存校验模块在接受到来自客户端的数值对时,将读取对应文件存储在本地的哈希值,通过比对两个哈希数值,来判断该文件是否被篡改。如果两值不一致,说明该文件不可信,很可能被攻击者篡改,标记校验结果为“fail”。如果一致,则标记校验结果为“success”。校验过程具体包括:

步骤410,获取到客户端传输的数值对。

步骤420,解析数值对,并获取缓存文件名,根据缓存文件名,查找本地存储的对应文件名的哈希值。

步骤430,解析数值对,获取缓存文件名对应的哈希值,并与本地存储的哈希值进行比对。

步骤440,如果两个值相同,则生成json格式的校验值对:{“文件名”:“success”};如果两个值不相同则生成json格式的校验值对:{“文件名”:“fail”};

步骤450,将所有的未过期缓存文件逐一进行校验,最终形成一组校验值对,并传递到数据传输模块。

如图7所示,缓存更新模块示意图,部署在客户端浏览器上,用以更改javascript文件的缓存时间,使其在浏览器加载页面时重新向服务器发送请求。具体包括:

步骤510,获取服务器传输的校验值对。

步骤520,解析校验值对,判断文件校验值为“success”,还是“fail”。

步骤530,若文件校验值为“fail”,则修改缓存文件过期时间。修改规则为替换缓存过期时间为当前客户端时间的前一天。例:expires:wed,19dec201808:12:43gmt,当前时间为wed,19january201808:12:00gmt,则修改后为expires:wed,18january201808:12:00gmt。

步骤540,浏览器开始加载、解析、渲染页面。

上述示例中,是将校验失败的文件的缓存时间修改为例如客户端当前时间的前一天,当浏览器解析页面时,会判定该文件的缓存时间已过期,从而达到向服务器强制发送请求的目的。当然,修改的时间是可调的,只要将缓存时间改为早于当前时间即可实现技术目的。

针对上述实施例描述的方案,进行实验比较如下:

客户端使用浏览器chrome64.0.3282.186版本,服务器使用apache2.0版本,部署域名为www.arkteam.net的网站。在没有使用任何缓存投毒防御模块下,连续访问网站www.arkteam.net,网页加载所需时间开销为847ms。然后对页面进行强制刷新ctrl+f5,即不使用任何缓存文件,页面所有资源重新向服务器请求,则网页加载所需时间开销为2.24s。使用本方法,在客户端和服务器加入缓存投毒防御模块,再次访问,则网页加载所需时间开销为2.30s。通过强制刷新,可以在不使用缓存技术的情况下避免缓存投毒,但该方法需要客户端的配合,有意识的对页面进行强制刷新,客户端体验感较差。相对于现有技术而言,上述实施例描述的方案所提供的方法可以在无需客户端配合下,完成缓存文件的检验,同时页面加载的时间开销可以保证在可接受范围内,兼顾正常浏览和客户端体验,具有很大的优势。

最后所应说明的是,以上实施案例仅用以说明本发明的技术方案而非限制,尽管使用事例对本发明进行了详细说明,本领域的普通技术人员应当理解,可对本发明的技术方案进行修改或者等价替换,而不脱离本发明技术方案的精神和范围,其均应涵盖在本发明的权利要求范围当中。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1