APP下载

基于双序列函数的重放攻击防御方案

2020-09-18李向丽

计算机工程 2020年9期
关键词:服务端攻击者校验

赵 梁,李 磊,李向丽

(郑州大学 信息工程学院,郑州 450000)

0 概述

在Web应用的安全保障措施中,通常使用各类权限框架来保证整个系统的安全性以及数据的完整性。虽然权限框架能够实现客户端请求的合法性校验,但是攻击者仍可以通过拦截合法的请求报文来获取交互过程中的请求信息,从而对Web应用程序执行重放攻击,入侵系统获取用户的数据信息。

针对重放攻击防御的问题,现有基于权限认证框架的方案多为每一次请求设置一个新鲜性标识来确定此次请求是否为新请求,从而过滤重放攻击。设置消息新鲜性标识的方法可以使用基于时间戳[1-2]、序列号[3]、版本号[4]和计数器[5]等。然而服务端权限框架针对每次请求的新鲜性检测能力较弱,使得服务端应用程序在重放攻击方面的防御能力有限。

文献[1]提出一种利用传递消息时系统的时间戳进行消息新鲜性标识的方法,当攻击者执行重放攻击时,通过将报文的时间戳与已缓存时间戳进行比较判断消息的新鲜性,从而过滤重放攻击报文。该方法能有效地防御重放攻击,但存放时间戳信息会耗费大量的存储空间,从而影响服务端程序运行效率。文献[2]提出一种基于时间戳比较的请求过滤方案,即当消息时间戳超出服务端预定的范围时即拒绝消息请求。该方案在一定的请求时延内可有效防御重放攻击,但是如果服务端的时钟与客户端的时钟不同步,就会导致服务端拒绝客户端的请求。文献[3]提出一种通过设置无重复请求序列号进行消息新鲜性标识的方法,将每个到达服务端的请求信息序列号与已存储的序列号进行比较,如果不存在,存储该序列号,否则就认为是重放攻击。该方法解决了使用时间戳比较时的时钟同步问题,但是由于服务端需要存储每次请求的序列号,因此会造成服务端存储开销较大,影响运行效率。文献[4]提出一种基于版本号的消息新鲜性标识方案,通过在双端定义请求版本号来维持新鲜性标识。该方案解决了依赖于服务端存储的重放攻击防御问题,同时保证了双端的请求的可靠性,但是当攻击者在抓取大量的请求信息后,可以猜解出请求版本号的更新模式,从而伪造请求执行新的重放攻击。

为解决基于时间戳方案的时钟同步问题以及基于请求版本号方案服务器存储空间开销较大的问题,文献[5]提出一种基于计数器与动态交验子的请求校验方案。该方案可以在一定网络延时内抵御重放攻击,同时又能够解决双端的时钟同步问题,但是由于其中的动态校验子是基于服务器端的时间戳生成的,当网络延迟过大时会造成校验失败,因此对于大部分Web应用的权限框架攻击防御方案不适用。

基于时间戳的重放攻击防御方案对于服务器的时效性要求较高,Web应用系统经常会因访问量过大而导致延迟,基于时间戳的方法在此种情况下会失效;而基于版本号的方案除了服务器本身的存储开销以外还需要对每一次请求进行版本号存储,服务器的存储开销过大。为此,本文通过引入双序列函数,提出不依赖于时间戳与存储版本的的请求校验方案对请求进行合法校验,并使其能够适用于多数Web权限框架进行重放攻击的防御。

1 基于双序列函数的Web服务端防御方案

1.1 相关定义

在本文方案中,请求过程分为身份校验过程和会话保持过程。身份校验过程是指在登录过程中通过比较序列函数值对两端身份进行双向认证。会话保持过程是指在客户端与服务端相互认证之后在保持会话的过程中通过双端周期函数值比对进行会话的合法性校验。在会话保持过程中使用周期校验因子对周期函数的周期进行变换,周期校验因子是指周期函数中影响函数周期变化的参数,周期值则是变化后的结果。例如,f(x)=cos(x/n),则n就是f(x)的周期校验因子,x/n为周期函数的周期值。请求过程中所用到的符号及其定义如表1所示。

表1 符号定义Table 1 Symbol definition

1.2 方案描述

本文方案采用双序列函数对请求过程进行新鲜性验证。客户端与服务端具有相同的非周期函数,在身份校验过程中,客户端使用非周期函数生成身份校验的随机数,并根据身份校验的随机数生成加密校验因子[6],服务端通过比较请求与自身通过运算(使用相同的随机数在相同的周期函数下运算)所得的加密校验因子是否一致来判断服务端请求的新鲜性[7]。在每一次请求之后,两个非周期函数都按同一步长[8]计算下一次的加密校验因子。在身份校验通过之后,生成随机数作为下一次请求的周期函数参数,以保证每次校验完成之后的周期函数新鲜性,并利用双端的周期函数生成加密校验因子,服务端通过同样的方式生成加密校验因子进行比对,在每次请求过后按统一步长向下运行,在运算一个周期后,利用周期校验因子改变周期,利用同样的步长重新开始运算,以保证每个周期的随机数新鲜性[9]。

1.3 方案实现

按照上述方案,客户端与服务端均拥有相同的序列函数(即初值相同、序列函数的系数均相同且含有2个以上的系数[10])和周期校验函数(初值相同且周期校验因子相同),服务端与客户端具有相同的运算参数P,在序列函数系数改变后使用P作为双端序列函数运算的初值,而服务端拥有一个随机数作为服务端的请求校验参数Key的初值(初值的位数少于请求过程中md5运算加密值的位数)。为便于说明,此处假设客户端与服务端发送失败之后会执行重发操作以保证序列信息不发生位偏[11]现象。身份校验过程如下:

步骤1首先客户端生成随机数X,并使用初始的序列函数执行F(X)函数运算得到运算结果Realmc,之后执行单向哈希算法md5(Realmc,A),得到加密参数Rc,然后向服务端发送Rc作为校验参数、随机数X,并将X作为服务端的序列函数初值[12]:X=Random(x),Realmc=F(X),Rc=md5(Realmc,A),C→S:REQUEST(Rc,X)。

步骤2服务端接收到X,首先判断得到的请求参数Rc是否与Key相等。如果相等,则判断请求为重放攻击,拒绝会话;如果不相等,运算F(X)得到函数值Realms,再执行单向哈希算法md5(Realms,A)得到加密结果Rs,并将Rs与客户端传来的加密结果Rc进行比较。如果相同,则执行Key=Rc,否则拒绝通信。判断完毕后,生成一个随机数M,将原有的序列函数系数A的值替换为M,通过计算F(P)得到新的函数运算值[13]Realmres,执行单向哈希算法md5(Realmres,P)得到加密结果Ra,然后执行P=P+StepA,并将加密结果与新的F(X)系数A发送给客户端。算法代码如下:

If Rc==Key Then {Restart Protocol;}

Else Realms=F(X);

Rs=md5(Realm,A);

If Rs==Rc Then{M=Random(x);

A=M;

Realmres=F(P);

Ra=md5(Realmres,P);

P=P+StepA;

Key=Rc;

S→C:RESPONSE(Ra,M);}

Else Restart Protocol;

步骤3客户端收到响应后,首先使用新的系数值M替换客户端自身序列函数的系数A,计算F(P)得到Realmreq,执行单向哈希算法md5(Realmreq,P)得到加密结果Rac,然后将加密结果与服务器响应中的Ra做比较。如果相同,则承认此服务端合法并执行P=P+StepA,生成随机数J,将周期函数的周期值改为J,否则拒绝通信。判断完成后,计算新的F(P)得到函数值Realmcs,执行单向哈希算法md5(Realmcs,P)得到请求参数Rb,并将Rb和J作为请求参数发送到服务端。算法代码如下:

A=M;

Realmreq=F(P);

Rac=md5(Realmreq,P);

If Rac==Ra Then{

P=P+StepA;

J=Random(x);

f(;J);

Realmcs=F(P);

Rb=md5(Realmcs,P);

C→S:REQUEST(Rb,J);}

Else Restart Protocol;

步骤4服务端接收到请求参数Rb之后,对Rb与Key做比较,如果相同则为重放攻击拒绝会话,否则执行Key=Rb。再通过计算F(P)得到函数值Realmsc,执行md5(Realmsc,P)得到加密参数Rbs,判断Rbs与Rb是否相等。如果相等,则承认客户端合法并且运算P=P+StepA,将周期校验函数的周期值置为J,否则拒绝客户端会话。算法代码如下:

If Rb==Key Then {Restart Protocol;}

Else Key=Rb;

Realmsc=F(P);

Rbs=md5(Realmsc,P);

If Rbs==Rb Then {

P=P+StepA;

f(;J);}

Else Restart Protocol;

客户端与服务端相互认证身份后,客户端与服务端进入会话保持过程。会话保持过程如下:

步骤1客户端调用周期函数f(X),使用客户端与服务端共享的初值X0运算得到周期函数初始值YGc,将X0/N结果作为加密参数Kxc,执行运算md5(Yc,Kxc)得到请求参数[14]Tc。然后执行X=X0+StepN更新X值作为下一次运算参数,并将请求参数Tc发送到服务端。算法代码如下:

Yc=f(X0);

Kxc=X0/N;

Rc=md5(Yc,Kxc);

X=X0+StepN;

C→S:REQUEST(Tc);

步骤2服务端收到客户端的请求参数Tc后,将Tc与Key做比较。如果相等,则判断此次请求为重放攻击,拒绝会话,否则执行key=Tc。再通过计算f(X0)得到函数值Ys,将X0/N作为加密参数[15]Kxs,执行md5(Ys,Kxs)得到加密值Tse。判断Tse与Tc是否相等[16],如果相等,则此次会话是合法的,否则就终止会话。在确认此次会话合法之后,服务端计算X=X0+StepN并执行f(X)得到周期函数值Ysc,判断Ysc是否大于等于U。如果Ysc≥U的话,则对周期函数执行周期校验运算f(X;N),并将X置为初始值X0,重新运算f(X)得到新的周期函数值Ysc。然后运算X×N得到响应加密参数[17]Kxsc,执行md5(Ysc,Kxsc)得到响应参数Tsc,将响应参数Tsc响应给客户端。算法代码如下:

If Tc==Key ThenRestart Protocol;

Else Key=Tc;

Ys=f(X0);

Kxs=X0/N;

Tse=md5(Ys,Kxs);

If Tse==Tc Then X=X0+StepN;

Ysc=f(X);

If Ysc>=U Then{f(X)=f(X;N);

X=X0;

Ysc=f(X);}

Kxsc=X*N;

Tsc=md5(Ysc,Kxsc);

S→C:RESPONSE(Tsc);

Else Restart Protocol;

步骤3客户端收到服务端的响应参数Tsc后,计算f(X)函数值Ycs,判断Ycs是否大于等于U,如果Ycs≥U则周期函数执行周期校验运算f(X;N),并将X置为初始值X0,重新运算f(X)得到新的函数值Ycs,计算X×N得到md5加密参数Kxcs,执行md5(Ycs,Kxcs)得到加密值Tcs,判断Tcs与Tsc是否相等。如果相等,则判断不是重放攻击,允许会话,否则就终止会话。判断完毕后,计算f(X)得到函数值Yc1,计算X/N得到加密参数[18]Kxc1,执行md5(Yc1,Kxc1)得到请求参数Tc1,在请求时发送Tc1作为服务端的加密校验参数。每次请求都会执行以上步骤来保证消息的可靠性。算法代码如下:

Ycs=f(X);

If Ycs>=U Then {f(X)=f(X;N);

X=X0;

Ycs=f(X);}

Kxcs=X*N;

Tcs=md5(Ycs,Kxcs);

If Tcs==Tsc Then {Yc1=f(X);

Kxc1=X/N;

Tc1=md5(Yc1,Kxc1);

C→S:REQUEST(Tc1);}

Else Restart Protocol;

2 安全性分析

2.1 防重放攻击分析

为便于说明,本文假设攻击者可以获取所有的请求与响应信息,并利用请求信息对服务端执行重放攻击。

如果在双端认证阶段步骤1执行重放攻击,那么由于服务端会直接校验Key值是否与加密校验参数相等,相等的话就说明此次请求与上一次请求重复是重放攻击,而Key值是由客户端初次请求得到的Key,步骤2重复请求的话Key值必定会与加密校验参数相等所以会拒绝此次请求。如果在步骤2执行重放攻击,那么由于客户端会比对响应中的加密校验参数是否与自身生成的加密校验参数相等,相等的话说明此次响应是服务端的响应并改变序列函数的运算值,由于该加密校验参数的值是基于序列函数的值生成的,重放上一次请求会导致加密校验参数比对失败,因此会拒绝重放攻击的请求。同理,在步骤3执行重放攻击,由于序列函数值的变化以及Key值的变化,重放攻击的请求无法通过Key值校验。而在步骤4执行重放攻击,由于客户端序列函数值的变化,重放攻击的响应无法通过加密校验参数的校验。

会话保持阶段与身份校验阶段类似,服务端在每次收到请求时会校验对应的Key值,由于周期函数值变化以及每次请求改变Key值,因此重放攻击无法通过服务端的校验。而客户端每次收到响应都会与自身生成的加密校验参数作比对,由于周期函数值的变化以及每经过一周期函数系数的变化,客户端所运算出来的加密校验参数也会改变,因此重放攻击无法通过客户端的校验。

2.2 防信息篡改攻击分析

信息篡改攻击指攻击者拦截用户请求报文,篡改其中的重要信息,并发送新的请求到服务端获取用户数据。假设攻击者具有破解单向哈希加密算法的能力,并且可以获取通信过程中的报文信息。由于每次请求的加密校验参数的加密盐值信息变化导致攻击者无法破译加密校验参数,并且Key值与加密校验参数每次请求生成的值都不同,因此信息篡改的请求无法通过服务端校验。

2.3 防密码猜解攻击分析

密码猜解攻击是指攻击者通过发送大量的请求到服务器穷举出用户密码[19]。假设攻击者可以发送大量的密码尝试报文。由于每次请求都需要经过双重校验,而校验参数又随请求次数不断变化,所以攻击者的猜解尝试报文无法通过服务端的校验。

线下密码猜解攻击是指利用线上抓取的报文信息在线下进行密码的破解工作之后再构造报文请求。假设攻击者可以线下破解单向哈希算法,由于每经过一个周期,函数的系数都会变化,而加密校验参数又是基于系数生成的,因此每个周期的请求加密方式都不相同,无法破解。

2.4 防中间人攻击分析

中间人攻击是指攻击者大量窃听双端的通信,从中获取双端的通信规律,并用此伪造请求信息。假设攻击者可以获取双端所有的通信报文信息,由于函数的初始系数都是随机生成的,并且每个周期过后都会更新系数,因此每次请求的加密校验参数生成策略是基于随机数的、无规律的,攻击者无法利用请求信息猜解出规律。

2.5 防伪造服务端的攻击分析

伪造服务端的攻击是指攻击者伪装成服务端接收客户端的请求信息并回送响应,从而获取客户端所发送到服务端的信息[20]。假设攻击者可以伪造通信的服务端。由于客户端每次收到响应都会校验对应的加密校验参数,因此如果伪造服务端,则在没有服务端函数的情况下无法伪造响应到客户端。

2.6 防Session窃取攻击分析

Session窃取攻击是指攻击者通过窃取合法用户的Session,伪造合法用户的会话请求来获取用户数据。假设攻击者可以窃取合法用户的Session信息。由于本文方案在Session校验机制之外增加了新的校验方案,即使攻击者窃取了Session信息,在没有序列函数与周期函数的情况下也无法生成加密校验参数,因此无法通过服务端的校验。

2.7 抵御网络延迟分析

假设Web服务端网络延迟较大。在身份验证阶段与会话阶段均保证了两种函数运算值的统一更新模式,即仅在此次请求正确之后才会更新函数运算值,请求报文丢失的情况下,在此次加密校验参数未重发并收到回送请求之前,是不会更新函数的运算值的,由此可保证双端的函数运算值不会出现位偏情况。基于以上分析可知,此方案可以抵御较高的网络延迟。

3 方案性能比较

上文从8个方面分析了本文方案的安全防御能力,为了便于说明,本节使用R1~R8分别表示这8种安全情况,并通过表2给出本文方案与文献[1-5]方案在Web应用的权限框架中的安全性能比较。可以看出,本文方案在安全性表现上比单纯基于时间戳的方案和单纯基于序列号的方案的安全性更高。由于文献[5]方案无法应对网络延迟较大的情况,相对而言,本文方案在没有接收到请求信息的时候不会更新序列函数值,即使网络延迟较大也不会影响整个序列函数的运行。

表2 6种方案在Web应用中的安全性能Table 2 Security performance of six schemes in Web applications

表3给出了本文方案与文献[1-5]中方案时间性能的比较,其中,Tt为时间戳运算时间,Ts为序列号运算时间,Ty是加密序列号运算时间,H为单向哈希运算时间,n为从数据库取出之前请求的数据所需要的时间。由于不同运算之间具有一定的时间差距,从运算角度分析有如下运算时间差距:Tt

表3 8种方案客户端与服务端的时间性能Table 3 Time performance of eight schemes inclient and server

4 结束语

针对Web应用层易受重放攻击的问题,本文提出一种基于双序列函数Web权限框架的重放攻击防御方案。分析结果表明,该方案可以有效防御常见的Web应用层攻击,并且适用于多数Web权限框架。下一步将从简化运算和减少服务端运算量等方面改进本文方案,并使其能防御更多种类的Web应用层攻击。此外,还将解决第三方授权机制中的重放攻击防御问题。

猜你喜欢

服务端攻击者校验
使用Excel朗读功能校验工作表中的数据
机动能力受限的目标-攻击-防御定性微分对策
正面迎接批判
新时期《移动Web服务端开发》课程教学改革的研究
炉温均匀性校验在铸锻企业的应用
电子式互感器校验方式研究
有限次重复博弈下的网络攻击行为研究
浅谈微电子故障校验
摸清黑客套路防范木马侵入