赞
踩
在linux系统上安装好ocaml和graphviz组件依赖,然后在官网(http://proverif.inria.fr/)下载proverif2.05.tar.gz和proverifdoc2.05.tar.gz压缩包,并解压安装安装成功后如图:
对hello.pv进行验证:
Process 0 为初始进程:
初始进程为客户A和服务器B分别生成了非对称加密私钥skA和签名用的私钥skB,分别为这两个私钥生成对应的公钥(pkA,pkB),并通过公开信道c将这两个公钥发送出去。
两个进程宏(分别对应clientA和serverB)来实现两个进程的并发执行,这里的感叹号表示重复无限多个会话并发。
结合对应serverB的模块来看第一个对应clientA的模块:A把自己公钥pkA发出去 ,B会接收到这个公钥pkX(Line 16),同时创建一个对称密钥k(Line 17,k这里起到临时会话密钥的作用),然后B将这个临时密钥k和自己的公钥pkB一起打包成元组,先用自己的私钥skB签名,再用收到的公钥pkX加密,并通过公共信道发出去(Line 18的aenc表示非对称加密) ,A通过信道接收到这个发来的bitstring(Line 10),然后用自己私钥解密,解密成功之后得到y,再用B的公钥pkB验证签名,如果验证通过了就会得到元组(m,k),第一项就是pkB(用=pkB来匹配),第二项就是对称密钥k 。A再用这个k给消息s进行对称加密然后发出去,B接收到发来的bitstring之后,用自己刚刚创建的对称密钥k解密就得到了内容z,z和s应该是一样的内容 。
这个过程很容易受到中间人攻击,我们来看Proverif接下来的分析:
这部分描述了可能发生攻击的具体流程,attacker用一个已知的私钥sk(假设为 k_3 )生成对应的公钥 pk(k_3) (对应abbreviations的前两步,这里的 k_3 可以是attacker自己生成的,或者通过其他方式已知的) 。然后这里标记了代码的{16}位置,该位置表示可以从信道中收到攻击者发出的公钥 pk(k_3) ,同时在{18}位置会将消息 aenc(sign((spk(skB[]),k_2),skB[]),pk(k_3)) 消息通过信道发出,此时 attacker可以接收到这条消息(也即attacker获取到了这个知识),然后attacker可以从信道中获得这条加密的消息( aenc ),attacker利用私钥 k_3 对其解密,可以得到 sign((spk(skB[],k_2),skB[])) ,并通过 getmess 获取签名的内容(也即(spk(skB[]),k_2) ),这里意味着attacker可以获得 k_2 ;之后attacker获取A的公钥 pkA ,并用该公钥对 sign((spk(skB[]),k_2),skB[]) 进行加密并发送出去,这条消息会在{10}被client收到,client验证签名政确之后,会在{13}将消息 senc(s[],k_2) 发送出去,attacker会收到这条消息 ,之后attacker就可以用 k_2 解密得到 s[]。
接下来detailed到trace has been found描述了上述攻击的轨迹:
前两行对应的是公钥密钥对和签名密钥对的创建过程
然后是三个out,前两个out表示attacker将加密公钥和签名公钥分别保存在 ~M 和 ~M_1 中,第三个 out表示client在{9}处的输出,attacker将其保存为 ~M_2
从Line 9开始,之后的每一行后面都跟了一个 in copy a 或者 in copy a_2 ,相同的标识表示相同的会话, copy a 表示当前attacker正在与client进行通信, copy a_2 表示当前attacker正在和server通信。
Line 11-15,表示attacker向server发送了一个公钥,同时server返回了一个用server私钥 签名并加密的消息,这里attacker将这条消息保存为 ~M_3 (Line 15) 。
Line 17-19,这里表示attacker在{10}这里,用 a_1 这个私钥解密 ~M_3 ,再用client的公钥加密(这里的 ~M 就是client的公钥),将加密后的消息发送出去,当client在{13}返回加密的消息时,attacker可以利用 k_4 解密并获得 s 。
中间人攻击时,攻击者需要同时维护两个会话(对应于上面的两个会话),将从与 server会话接收到的内容选择性的篡改(也可以不改,上面的协议需要解密,所以修改了),然后发送到与client的会话中,由于没有额外的方式完成鉴权(上述过程只有一个server的签名和认证),所以client和server都认为它们与对方建立了加密会话,而实际上这个加密会话所使用的密钥已经被attacker获取到了。
result表示最终结论,true表示不存在攻击,false表示存在攻击者获取相关信息:
ProVerif对该协议的最终分析结果为false,即存在攻击,是不安全的。
中间人攻击主要是利用了客户与服务器之间并没有进行相互认证,只保证了机密性,所以要加入认证性的验证来改进该协议
ex_handshake_annotated.pv文件对握手协议进行了改进:
可以观察到比最初的协议多了五行,分别在Line 13、15、20、24、25,分别表示:客户端认为自己在使用key对称密钥和服务器进行协议交互、pkey标识的客户端认为自己使用key和服务器进行协议交互结束、服务器认为自己在使用key对称密钥和pkey公钥标识的客户端进行协议交互、如果收到的pkX确实是客户A的公钥,那么服务器认为自己使用key对称密钥和客户端进行协议交互结束。
协议验证结果如下:
结果第一条表明,对消息s还是不安全的。
结果第二条表明,从B(服务器)到A(客户端)的认证是不满足的,也就是说如果客户端觉得自己和服务器完成了协议流程,不一定真的有这个服务器在和客户端走协议,这个也是因为中间人可以冒充服务器来和客户端通信。
结果第三条表明,从A(客户端)到B(服务器)的认证是满足的,也就是说如果服务器觉得自己走完了协议流程,一定至少有一个客户端是在和自己走协议的。
ex_handshake_annotated_fixed.pv加入了从B(服务器)到A(客户端)的认证:
再次改进的版本中,服务器回传的信息中包含目标客户端的标识,不仅对临时密钥k和自己的公钥pkB签名,也对目标客户的公钥进行签名,以防止中间人攻击。
Needham-Schroeder是一个提供了两个主体Alice A和Bob B的相互认证的协议,为参与者之间共享秘密会话密钥。除了这两个参与者之外,还存在一个可信的密钥服务器S。
该协议的执行步骤:
Alice向密钥服务器S发送自身A与Bob的身份标识B,并请求Bob的公钥。密钥服务器用与Bob的身份配对的公钥pk(skB)响应,使用服务器与Alice的私钥进行身份验证。Alice继续生成一个一次性随机数Na,将它与她的身份A配对,并发送用Bob的公钥加密的信息。收到后,Bob解密消息以恢复Na和他的对话者A的身份。然后通过向密钥服务器s请求获取Alice的公钥pk(skA)。然后Bob生成他的一次Nb,并发送为Alice加密的信息(Na,Nb)。最后,Alice回复信息aenc(Nb,pk(skB))。
该协议背后的基本原理是,由于只有Bob可以恢复Na,因此只有他可以发送消息6;因此,对Bob的身份验证应该成立。类似地,只有Alice能够恢复Nb;因此,在收到消息7时,需要对Alice进行身份验证。此外,Alice和Bob已经建立了共享的秘密Na和Nb,它们随后可以用作会话密钥。
该协议应该满足以下要求:A到B的身份验证,即如果B到达协议的结尾,并且他相信他已经与A完成了,那么A已经与B进行了一个会话;从B到A的身份验证;A的保密性,如果A到达B协议的末尾,那么A的非Na和Nb是秘密的;特别地,它们适合作为会话密钥,在对称加密senc(M,K)中保持任意项M的保密性,其中K∈{Na,Nb};对B的保密性。
分析以上协议,存在中间人攻击,攻击者让Alice参与协议的合法会话;同时,攻击者能够在与Bob的会话中模拟Alice。
该协议的主要目标是对主体Alice和Bob的相互身份验证。因此,当A到达协议的结尾时,相信她和B完成了,那么B确实和A进行了一次会议;反之亦然。
使用ProVerif对该协议的三个变体进行验证分析:
NeedhamSchroederPK-var1.pv:
1-6:产生A和B的公私钥对,
接下来的event beginBparam(pkX)表明A相信收到的pkX就是B的公钥参数,并用这个公钥对A自己产生的公钥pk(skA_1)和随机数Na进行加密并发送出去,B收到后就认为有了A的公钥,并用该公钥加密自己产生的随机数Nb和收到的随机数Na发出去,A解密该消息得到Nb和NA,然后用之前收到的pkB对Nb加密发送出去,如果之前收到的pkX就是B的公钥参数,那么event endAparam(pk(skA_1))记录了A相信已经成功地完成了与Bob的协议。只有当A相信她使用B的参数运行协议时,即当pkX = pkB时,才会执行此事件。A提供了她的公钥pk(skA_1)作为参数。
这意味着B对A的认证和A持有的保密;而A到B的认证和B的保密是有漏洞的。也就是说,B可能会结束协议,认为和A对话,而A从未和B运行过协议。
NeedhamSchroederPK-var2.pv:
此过程使用一个key表来将主机名及其公钥联系起来。key表由(主机、pkey)声明,插入在主进程(对于诚实的主机A和B,通过插入密钥(A、pkA)和插入(B、pkB)中),以及在不诚实主机的密钥注册进程中K中。密钥服务器进程通过获取密钥(=b,sb)来查找与主机b对应的密钥,从而建立相应的证书。由于Alice愿意与任何其他参与者运行协议,并且她会从密钥服务器请求对话者的公钥,我们必须允许攻击者向信任的密钥服务器注册密钥(即将密钥插入密钥表中)。此行为由密钥注册进程过程K捕获。注意条件如果h <> A && h <> B然后阻止攻击者改变属于Alice和Bob的密钥。
和第一版本的安全性相同。
NeedhamSchroederPK-var3.pv:
允许Alice和Bob同时扮演发起者和响应者的角色。密钥服务器会对任何一个诚实的请求者生成其私钥与对应公钥。
ProVerif能够证明响应者的身份验证和启动者的保密性;而启动者的身份验证和响应者的保密性都失败了。
https://lauzyhou.blog.csdn.net/article/details/116376508
bblanche.gitlabpages.inria.fr/proverif/manual.pdf Chapter 3
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。