ToB企服应用市场:ToB评测及商务社交产业平台

标题: 暗码协议形式化分析与可证明安全实行1——使用proverif来分析暗码协议 [打印本页]

作者: 数据人与超自然意识    时间: 2024-6-19 21:32
标题: 暗码协议形式化分析与可证明安全实行1——使用proverif来分析暗码协议
配置ProVerif情况

实行情况: Windows 11 X64
根据ProVerif用户手册1.4.3节,Windows用户可以使用二进制发行版安装ProVerif。起首现在你想要的文件路径中新建一个proverif文件夹。
相关依靠组件安装

graphviz

graphviz是一种以图形方式显示ProVerif可能发现攻击的组件,可以通过官网链接进行下载。

我的操纵体系是64位体系,以是我选择64位的 EXE installer。
下载后将其解压到解压到proverif文件中。
接下来配置情况变量,配置路径:控制面板->体系->高级体系设置->情况变量。


在下令行窗口中输入dot -version查察是否已经安装成功,出现以下内容则已经安装成功。

GTK+2.24(可选)

如果要运行交互式模仿器proverif交互,则必要安装GTK+2.24,也可以通过官网链接进行下载。

同样下载适配我的电脑的版本。下载完之后是一个压缩包:gtk+-bundle_2.24.10-20120208_win32.zip,解压到proverif文件中,将解压文件改名为GTK。
同样对其进行情况配置,配置路径:控制面板->体系->高级体系设置->情况变量。

ProVerif安装

Windows二进制包proverifbin2.05.tar.gz从以下老的不行的官网链接进行下载。

下载之后将它放到之前建好的proverif文件夹中,我们使用以下下令行窗口来解压。
  1.         cd /d D:\proverif
  2.         tar -zxvf proverif2.05.tar.gz
复制代码
解压完成后,proverif文件夹就会出现一个名为proverif2.05的文件。

测试

在proverif2.05文件中新建一个txt文件,输入以下内容:
  1. free c:channel.
  2. free Cocks:bitstring[private].
  3. free RSA:bitstring[private].
  4. query attacker(RSA).
  5. query attacker(Cocks).
  6. process
  7.    out(c,RSA);
  8.    0
复制代码
命名为hello.pv(记得修改文件后缀名,否则会不成功)。
在下令行窗口中输入proverif hello.pv,出现以下内容即成功。

HandShake Protocol握手协议

  1. (* Symmetric key encryption *)
  2. type key.
  3. fun senc(bitstring, key): bitstring.
  4. reduc forall m: bitstring, k: key; sdec(senc(m,k),k) = m.
  5. (* Asymmetric key encryption *)
  6. type skey.
  7. type pkey.
  8. fun pk(skey): pkey.
  9. fun aenc(bitstring, pkey): bitstring.
  10. reduc forall m: bitstring, sk: skey; adec(aenc(m,pk(sk)),sk) = m.
  11. (* Digital signatures *)
  12. type sskey.
  13. type spkey.
  14. fun spk(sskey): spkey.
  15. fun sign(bitstring, sskey): bitstring.
  16. reduc forall m: bitstring, ssk: sskey; getmess(sign(m,ssk)) = m.
  17. reduc forall m: bitstring, ssk: sskey; checksign(sign(m,ssk),spk(ssk)) = m.
  18. free c:channel.
  19. free s:bitstring [private].
  20. query attacker(s).
  21. let clientA(pkA:pkey,skA:skey,pkB:spkey) =
  22.         out(c,pkA);
  23.         in(c,x:bitstring);
  24.         let y = adec(x,skA) in
  25.         let (=pkB,k:key) = checksign(y,pkB) in
  26.         out(c,senc(s,k)).
  27. let serverB(pkB:spkey,skB:sskey) =
  28.         in(c,pkX:pkey);
  29.         new k:key;
  30.         out(c,aenc(sign((pkB,k),skB),pkX));
  31.         in(c,x:bitstring);
  32.         let z = sdec(x,k) in
  33.         0.
  34. process
  35.         new skA:skey;
  36.         new skB:sskey;
  37.         let pkA = pk(skA) in out(c,pkA);
  38.         let pkB = spk(skB) in out(c,pkB);
  39.         ( (!clientA(pkA,skA,pkB)) | (!serverB(pkB,skB)) )
复制代码
协议分析

这里起首分析一下上面的代码的工作,proverif从process标志的主进程开始分析,以是这里看process后面的内容。
起首是为clientA生成了非对称加密私钥skA,同时为serverB生成了签名用的私钥skB,并分别为这两个私钥生成对应的公钥(pkA,pkB),并通过公开信道c将这两个公钥发送出去。
接下来调用两个进程宏clientA和serverB来实现两个进程的并发执行,这里用replication的方式让两个主体都以无穷数量会话并发执行(clientA和serverB前面的感叹号表示重复无穷多个会话并发)。
然后关注clientA和serverB这两个模块,这里要把两个模块联合起来看,起首是A把自己公钥pkA发出去,B会接收到这个公钥pkX,同时创建一个对称密钥k(k这里起到临时会话密钥的作用)。
然后B将这个临时密钥k和自己的公钥pkB一起打包成元组,先用自己的私钥skB签名(sign部分),再用收到的公钥pkX加密,并通过公共信道发出去(aenc部分,这里aenc表示非对称加密)。
A通过信道接收到这个发来的bitstring,然后用自己私钥解密,解密成功之后得到y,之后用B的公钥pkB验证签名,如果验证通过了就会得到元组(m,k),第一项就是pkB(这里用=pkB来匹配),第二项就是对称密钥kA再用这个k给消息s进行对称加密然后发出去,B接收到发来的bitstring之后,用自己刚刚创建的对称密钥k解密就得到了内容z,这应该和s是一样的内容
不丢脸出,这段代码很简单,以是也不难想到中央人攻击。
proverif协议分析

将上述代码生存为ex_handshake.pv文件,然后执行以下下令,可以得到proverif分析上述握手协议的结果。
  1. proverif ex_handshake.pv
复制代码
ProVerif会输出其考虑过程的内部表示,然后一次处置处罚逻辑中的查询(由query关键字表示),查询攻击者的输出可以分为三个部分:

这里分部分来看,起首是abbreviations的部分:



然后看detailed output的部分


那么我们对该协议进行改进,在协议中参加对认证性的验证:
  1. (* 客户端认为自己在使用key对称密钥和服务器进行协议交互 *)
  2. event acceptsClient(key).
  3. (* 服务器认为自己在使用key对称密钥和pkey公钥标识的客户端进行协议交互 *)
  4. event acceptsServer(key,pkey).
  5. (* pkey标识的客户端认为自己使用key和服务器进行协议交互结束 *)
  6. event termClient(key,pkey).
  7. (* 服务器认为自己使用key对称密钥和客户端进行协议交互结束 *)
  8. event termServer(key).
  9. (* 对于每个以对称密钥x和服务器交互结束的客户端y前面总是存在认定以对称密钥x和客户端y交互的服务器 *)
  10. query x:key,y:pkey; event(termClient(x,y))==>event(acceptsServer(x,y)).
  11. (* 对于每个以对称密钥x交互结束的服务器前面总是存在一个区别于其它的“以对称密钥x和服务器交互的客户端”即单射关系 *)
  12. query x:key; inj-event(termServer(x))==>inj-event(acceptsClient(x)).
复制代码
完整的协议如下:
  1. (* Symmetric key encryption *)
  2. type key.
  3. fun senc(bitstring, key): bitstring.
  4. reduc forall m: bitstring, k: key; sdec(senc(m,k),k) = m.
  5. (* Asymmetric key encryption *)
  6. type skey.
  7. type pkey.
  8. fun pk(skey): pkey.
  9. fun aenc(bitstring, pkey): bitstring.
  10. reduc forall m: bitstring, sk: skey; adec(aenc(m,pk(sk)),sk) = m.
  11. (* Digital signatures *)
  12. type sskey.
  13. type spkey.
  14. fun spk(sskey): spkey.
  15. fun sign(bitstring, sskey): bitstring.
  16. reduc forall m: bitstring, ssk: sskey; getmess(sign(m,ssk)) = m.
  17. reduc forall m: bitstring, ssk: sskey; checksign(sign(m,ssk),spk(ssk)) = m.
  18. free c:channel.
  19. free s:bitstring [private].
  20. query attacker(s).
  21. event acceptsClient(key).
  22. event acceptsServer(key,pkey).
  23. event termClient(key,pkey).
  24. event termServer(key).
  25. query x:key,y:pkey; event(termClient(x,y))==>event(acceptsServer(x,y)).
  26. query x:key; inj-event(termServer(x))==>inj-event(acceptsClient(x)).
  27. let clientA(pkA:pkey,skA:skey,pkB:spkey) =
  28.         out(c,pkA);
  29.         in(c,x:bitstring);
  30.         let y = adec(x,skA) in
  31.         let (=pkB,k:key) = checksign(y,pkB) in
  32.         (* 客户端解密成功+验证成功后即认为接受了使用密钥k通信 *)
  33.         event acceptsClient(k);
  34.         out(c,senc(s,k));
  35.         (* 客户端运行结束,本次是使用k通信,自己的公钥是pkA *)
  36.         event termClient(k,pkA).
  37. let serverB(pkB:spkey,skB:sskey,pkA:pkey) =
  38.         in(c,pkX:pkey);
  39.         new k:key;
  40.         (* 服务器收到客户端公钥pkX,并创建了密钥k,即认为接受了使用密钥k和客户端pkX通信 *)
  41.         event acceptsServer(k,pkX);
  42.         out(c,aenc(sign((pkB,k),skB),pkX));
  43.         in(c,x:bitstring);
  44.         let z = sdec(x,k) in
  45.         (* 如果接收到的pkX确实是pkA,即认为服务器使用对称密钥k运行结束 *)
  46.         if pkX = pkA then event termServer(k).
  47. process
  48.         new skA:skey;
  49.         new skB:sskey;
  50.         let pkA = pk(skA) in out(c,pkA);
  51.         let pkB = spk(skB) in out(c,pkB);
  52.         ( (!clientA(pkA,skA,pkB)) | (!serverB(pkB,skB,pkA)) )
复制代码
这一版只是加了认证性质的验证,但是照旧没有解决中央人攻击问题。

结果第一条表明,对消息s照旧不满意安全性的。
结果第二条表明,从B(服务器)到A(客户端)的认证是不满意的,也就是说如果客户端觉得自己和服务器完成了协议流程,不一定真的有这个服务器在和客户端走协议,这个也是由于中央人可以假冒服务器来和客户端通信。
结果第三条表明,从A(客户端)到B(服务器)的认证是满意的,也就是说如果服务器觉得自己走完了协议流程,一定至少有一个客户端是在和自己走协议的。
以是我们必要进步以改进这个协议,让服务器回传的信息中包含客户端的标识来防止中央人攻击的发生。
  1. type key.
  2. fun senc(bitstring, key): bitstring.
  3. reduc forall m: bitstring, k: key; sdec(senc(m,k),k) = m.
  4. type skey.
  5. type pkey.
  6. fun pk(skey): pkey.
  7. fun aenc(bitstring, pkey): bitstring.
  8. reduc forall m: bitstring, sk: skey; adec(aenc(m,pk(sk)),sk) = m.
  9. type sskey.
  10. type spkey.
  11. fun spk(sskey): spkey.
  12. fun sign(bitstring, sskey): bitstring.
  13. reduc forall m: bitstring, ssk: sskey; getmess(sign(m,ssk)) = m.
  14. reduc forall m: bitstring, ssk: sskey; checksign(sign(m,ssk),spk(ssk)) = m.
  15. free c:channel.
  16. free s:bitstring [private].
  17. query attacker(s).
  18. event acceptsClient(key).
  19. event acceptsServer(key,pkey).
  20. event termClient(key,pkey).
  21. event termServer(key).
  22. query x:key,y:pkey; event(termClient(x,y))==>event(acceptsServer(x,y)).
  23. query x:key; inj-event(termServer(x))==>inj-event(acceptsClient(x)).
  24. let clientA(pkA:pkey,skA:skey,pkB:spkey) =
  25.         out(c,pkA);
  26.         in(c,x:bitstring);
  27.         let y = adec(x,skA) in
  28.         (* 这里检查一下这个包确实是要发给自己pkA的 *)
  29.         let (=pkA,=pkB,k:key) = checksign(y,pkB) in
  30.         event acceptsClient(k);
  31.         out(c,senc(s,k));
  32.         event termClient(k,pkA).
  33. let serverB(pkB:spkey,skB:sskey,pkA:pkey) =
  34.         in(c,pkX:pkey);
  35.         new k:key;
  36.         event acceptsServer(k,pkX);
  37.         (* 这里把要通信的客户端标识pkX放进去 *)
  38.         out(c,aenc(sign((pkX,pkB,k),skB),pkX));
  39.         in(c,x:bitstring);
  40.         let z = sdec(x,k) in
  41.         if pkX = pkA then event termServer(k).
  42. process
  43.         new skA:skey;
  44.         new skB:sskey;
  45.         let pkA = pk(skA) in out(c,pkA);
  46.         let pkB = spk(skB) in out(c,pkB);
  47.         ( (!clientA(pkA,skA,pkB)) | (!serverB(pkB,skB,pkA)) )
复制代码
现在三条性质都能验证通过。

Needham-Schroeder Protocol

Needham-Schroeder认证协议,是一种多次提问——响应协议,可以对付重放攻击。每一个会话回合都有一个新的随机数在起作用。

下面给出Needham-Schroeder 密钥共享协议的三个变体,阐明各个协议变体存在的缺陷,尝试给出攻击方式。
NeedhamSchroederPK-var1.pv

  1. free c: channel.
  2. (* Public key encryption *)
  3. type pkey.
  4. type skey.
  5. fun pk(skey): pkey.
  6. fun aenc(bitstring, pkey): bitstring.
  7. reduc forall x: bitstring, y: skey; adec(aenc(x, pk(y)),y) = x.
  8. (* Signatures *)
  9. type spkey.
  10. type sskey.
  11. fun spk(sskey): spkey.
  12. fun sign(bitstring, sskey): bitstring.
  13. reduc forall x: bitstring, y: sskey; getmess(sign(x,y)) = x.
  14. reduc forall x: bitstring, y: sskey; checksign(sign(x,y), spk(y)) = x.
  15. (* Shared key encryption *)
  16. fun senc(bitstring,bitstring): bitstring.
  17. reduc forall x: bitstring, y: bitstring; sdec(senc(x,y),y) = x.
  18. (* Authentication queries *)
  19. event beginBparam(pkey).
  20. event endBparam(pkey).
  21. event beginAparam(pkey).
  22. event endAparam(pkey).
  23. query x: pkey; inj-event(endBparam(x)) ==> inj-event(beginBparam(x)).
  24. query x: pkey; inj-event(endAparam(x)) ==> inj-event(beginAparam(x)).
  25. (* Secrecy queries *)
  26. free secretANa, secretANb, secretBNa, secretBNb: bitstring [private].
  27. query attacker(secretANa);
  28.       attacker(secretANb);
  29.       attacker(secretBNa);
  30.       attacker(secretBNb).
  31. (* Alice *)
  32. let processA(pkB: pkey, skA: skey) =
  33.         in(c, pkX: pkey);
  34.         event beginBparam(pkX);
  35.         new Na: bitstring;
  36.         out(c, aenc((Na, pk(skA)), pkX));
  37.         in(c, m: bitstring);
  38.         let (=Na, NX: bitstring) = adec(m, skA) in
  39.         out(c, aenc(NX, pkX));
  40.         if pkX = pkB  then
  41.         event endAparam(pk(skA));
  42.         out(c, senc(secretANa, Na));
  43.         out(c, senc(secretANb, NX)).
  44. (* Bob *)
  45. let processB(pkA: pkey, skB: skey) =
  46.         in(c, m: bitstring);
  47.         let (NY: bitstring, pkY: pkey) = adec(m, skB) in
  48.         event beginAparam(pkY);
  49.         new Nb: bitstring;
  50.         out(c, aenc((NY, Nb), pkY));
  51.         in(c, m3: bitstring);
  52.         if Nb = adec(m3, skB) then
  53.         if pkY = pkA then
  54.         event endBparam(pk(skB));
  55.         out(c, senc(secretBNa, NY));
  56.         out(c, senc(secretBNb, Nb)).
  57. (* Main *)
  58. process
  59.         new skA: skey; let pkA = pk(skA) in out(c, pkA);
  60.         new skB: skey; let pkB = pk(skB) in out(c, pkB);
  61.         ( (!processA(pkB, skA)) | (!processB(pkA, skB)) )
复制代码
使用proverif分析结果


毛病分析

注入攻击检测不完善

查询 inj-event(endBparam(x)) ==> inj-event(beginBparam(x)) is false 表明体系在B参数结束时未能检测到注入攻击。这可能意味着体系对于某些情况下的注入攻击检测不敷强盛,必要进一步改进。
密钥泄漏问题

查询 not attacker(secretBNa[]) is false 和 not attacker(secretBNb[]) is false 表明攻击者可以或许获取B的某些密钥。这可能是体系中的一个庞大毛病,必要增强密钥管理和保护机制,以防止攻击者获取关键信息。
部分成功的注入攻击

查询 inj-event(endAparam(x)) ==> inj-event(beginAparam(x)) is true 表明体系在A参数结束时检测到了注入攻击。这可能表示在某些情况下体系可以或许成功地检测到攻击,但在其他情况下可能会失败。必要深入研究体系在各种场景下的注入攻击检测本领。
部分密钥保护

查询 not attacker(secretANa[]) is true 和 not attacker(secretANb[]) is true 表明攻击者无法获取A的某些密钥。这是体系的一个积极方面,但仍然必要确保所有关键密钥都得到足够的保护。
NeedhamSchroederPK-var2.pv

  1. free c: channel.
  2. (* Public key encryption *)
  3. type pkey.
  4. type skey.
  5. fun pk(skey): pkey.
  6. fun aenc(bitstring, pkey): bitstring.
  7. reduc forall x: bitstring, y: skey; adec(aenc(x, pk(y)),y) = x.
  8. (* Signatures *)
  9. type spkey.
  10. type sskey.
  11. fun spk(sskey): spkey.
  12. fun sign(bitstring, sskey): bitstring.
  13. reduc forall x: bitstring, y: sskey; getmess(sign(x,y)) = x.
  14. reduc forall x: bitstring, y: sskey; checksign(sign(x,y), spk(y)) = x.
  15. (* Shared key encryption *)
  16. type nonce.
  17. fun senc(bitstring,nonce): bitstring.
  18. reduc forall x: bitstring, y: nonce; sdec(senc(x,y),y) = x.
  19. (* Type converter *)
  20. fun nonce_to_bitstring(nonce): bitstring [data,typeConverter].
  21. (* Two honest host names A and B *)
  22. type host.
  23. free A, B: host.
  24. (* Key table *)
  25. table keys(host, pkey).
  26. (* Authentication queries *)
  27. event beginBparam(host).
  28. event endBparam(host).
  29. event beginAparam(host).
  30. event endAparam(host).
  31. query x: host; inj-event(endBparam(x)) ==> inj-event(beginBparam(x)).
  32. query x: host; inj-event(endAparam(x)) ==> inj-event(beginAparam(x)).
  33. (* Secrecy queries *)
  34. free secretANa, secretANb, secretBNa, secretBNb: bitstring [private].
  35. query attacker(secretANa);
  36.       attacker(secretANb);
  37.       attacker(secretBNa);
  38.       attacker(secretBNb).
  39. (* Alice *)
  40. let processA(pkS: spkey, skA: skey) =
  41.         in(c, hostX: host);
  42.         event beginBparam(hostX);                
  43.         out(c, (A, hostX));                              (* msg 1 *)
  44.         in(c, ms: bitstring);                            (* msg 2 *)
  45.         let (pkX: pkey, =hostX) = checksign(ms, pkS) in
  46.         new Na: nonce;
  47.         out(c, aenc((Na, A), pkX));                      (* msg 3 *)
  48.         in(c, m: bitstring);                             (* msg 6 *)
  49.         let (=Na, NX: nonce) = adec(m, skA) in
  50.         out(c, aenc(nonce_to_bitstring(NX), pkX));       (* msg 7 *)
  51.         if hostX = B then
  52.         event endAparam(A);
  53.         out(c, senc(secretANa, Na));
  54.         out(c, senc(secretANb, NX)).
  55. (* Bob *)
  56. let processB(pkS: spkey, skB: skey) =
  57.         in(c, m: bitstring);                             (* msg 3 *)
  58.         let (NY: nonce, hostY: host) = adec(m, skB) in
  59.         event beginAparam(hostY);
  60.         out(c, (B, hostY));                              (* msg 4 *)
  61.         in(c,ms: bitstring);                             (* msg 5 *)
  62.         let (pkY: pkey,=hostY) = checksign(ms, pkS) in
  63.         new Nb: nonce;
  64.         out(c, aenc((NY, Nb), pkY));                     (* msg 6 *)
  65.         in(c, m3: bitstring);                            (* msg 7 *)
  66.         if nonce_to_bitstring(Nb) = adec(m3, skB) then
  67.         if hostY = A then
  68.         event endBparam(B);
  69.         out(c, senc(secretBNa, NY));
  70.         out(c, senc(secretBNb, Nb)).
  71. (* Trusted key server *)
  72. let processS(skS: sskey) =  
  73.         in(c,(a: host, b: host));
  74.         get keys(=b, sb) in
  75.         out(c,sign((sb,b), skS)).
  76. (* Key registration *)
  77. let processK =
  78.         in(c, (h: host, k: pkey));
  79.         if h <> A && h <> B then insert keys(h,k).
  80. (* Main *)
  81. process
  82.         new skA: skey; let pkA = pk(skA) in out(c, pkA); insert keys(A, pkA);
  83.         new skB: skey; let pkB = pk(skB) in out(c, pkB); insert keys(B, pkB);
  84.         new skS: sskey; let pkS = spk(skS) in out(c, pkS);
  85.         ( (!processA(pkS, skA)) | (!processB(pkS, skB)) |
  86.           (!processS(skS)) | (!processK) )
复制代码
使用proverif分析结果


毛病分析

同NeedhamSchroederPK-var1.pv
NeedhamSchroederPK-var3.pv

  1. (* Loops if types are ignored *)
  2. set ignoreTypes = false.
  3. free c: channel.
  4. type host.
  5. type nonce.
  6. type pkey.
  7. type skey.
  8. type spkey.
  9. type sskey.
  10. fun nonce_to_bitstring(nonce): bitstring [data,typeConverter].
  11. (* Public key encryption *)
  12. fun pk(skey): pkey.
  13. fun encrypt(bitstring, pkey): bitstring.
  14. reduc forall x: bitstring, y: skey; decrypt(encrypt(x,pk(y)),y) = x.
  15. (* Signatures *)
  16. fun spk(sskey): spkey.
  17. fun sign(bitstring, sskey): bitstring.
  18. reduc forall m: bitstring, k: sskey; getmess(sign(m,k)) = m.
  19. reduc forall m: bitstring, k: sskey; checksign(sign(m,k), spk(k)) = m.
  20. (* Shared key encryption *)
  21. fun sencrypt(bitstring,nonce): bitstring.
  22. reduc forall x: bitstring, y: nonce; sdecrypt(sencrypt(x,y),y) = x.
  23. (* Secrecy assumptions *)
  24. not attacker(new skA).
  25. not attacker(new skB).
  26. not attacker(new skS).
  27. (* 2 honest host names A and B *)
  28. free A, B: host.
  29. table keys(host, pkey).
  30. (* Queries *)
  31. free secretANa, secretANb, secretBNa, secretBNb: bitstring [private].
  32. query attacker(secretANa);
  33.       attacker(secretANb);
  34.       attacker(secretBNa);
  35.       attacker(secretBNb).
  36. event beginBparam(host, host).
  37. event endBparam(host, host).
  38. event beginAparam(host, host).
  39. event endAparam(host, host).
  40. event beginBfull(host, host, pkey, pkey, nonce, nonce).
  41. event endBfull(host, host, pkey, pkey, nonce, nonce).
  42. event beginAfull(host, host, pkey, pkey, nonce, nonce).
  43. event endAfull(host, host, pkey, pkey, nonce, nonce).
  44. query x: host, y: host;
  45.         inj-event(endBparam(x,y)) ==> inj-event(beginBparam(x,y)).
  46. query x1: host, x2: host, x3: pkey, x4: pkey, x5: nonce, x6: nonce;
  47.         inj-event(endBfull(x1,x2,x3,x4,x5,x6))  
  48.                         ==> inj-event(beginBfull(x1,x2,x3,x4,x5,x6)).
  49. query x: host, y: host;
  50.         inj-event(endAparam(x,y)) ==> inj-event(beginAparam(x,y)).
  51. query x1: host, x2: host, x3: pkey, x4: pkey, x5: nonce, x6: nonce;
  52.         inj-event(endAfull(x1,x2,x3,x4,x5,x6))
  53.                         ==> inj-event(beginAfull(x1,x2,x3,x4,x5,x6)).
  54. (* Role of the initiator with identity xA and secret key skxA *)
  55. let processInitiator(pkS: spkey, skA: skey, skB: skey) =
  56.         (* The attacker starts the initiator by choosing identity xA,
  57.            and its interlocutor xB0.
  58.            We check that xA is honest (i.e. is A or B)
  59.            and get its corresponding key. *)
  60.         in(c, (xA: host, hostX: host));
  61.         if xA = A || xA = B then
  62.         let skxA = if xA = A then skA else skB in
  63.         let pkxA = pk(skxA) in
  64.         (* Real start of the role *)
  65.         event beginBparam(xA, hostX);
  66.         (* Message 1: Get the public key certificate for the other host *)
  67.         out(c, (xA, hostX));
  68.         (* Message 2 *)
  69.         in(c, ms: bitstring);
  70.         let (pkX: pkey, =hostX) = checksign(ms,pkS) in
  71.         (* Message 3 *)
  72.         new Na: nonce;
  73.         out(c, encrypt((Na, xA), pkX));
  74.         (* Message 6 *)
  75.         in(c, m: bitstring);
  76.         let (=Na, NX2: nonce) = decrypt(m, skxA) in
  77.         event beginBfull(xA, hostX, pkX, pkxA, Na, NX2);
  78.         (* Message 7 *)
  79.         out(c, encrypt(nonce_to_bitstring(NX2), pkX));
  80.         (* OK *)
  81.         if hostX = B || hostX = A then
  82.         event endAparam(xA, hostX);
  83.         event endAfull(xA, hostX, pkX, pkxA, Na, NX2);
  84.         out(c, sencrypt(secretANa, Na));
  85.         out(c, sencrypt(secretANb, NX2)).
  86. (* Role of the responder with identity xB and secret key skxB *)
  87. let processResponder(pkS: spkey, skA: skey, skB: skey) =
  88.         (* The attacker starts the responder by choosing identity xB.
  89.            We check that xB is honest (i.e. is A or B). *)
  90.         in(c, xB: host);
  91.         if xB = A || xB = B then
  92.         let skxB = if xB = A then skA else skB in
  93.         let pkxB = pk(skxB) in
  94.         (* Real start of the role *)
  95.         (* Message 3 *)
  96.         in(c, m: bitstring);
  97.         let (NY: nonce, hostY: host) = decrypt(m, skxB) in
  98.         event beginAparam(hostY, xB);
  99.         (* Message 4: Get the public key certificate for the other host *)
  100.         out(c, (xB, hostY));
  101.         (* Message 5 *)
  102.         in(c,ms: bitstring);
  103.         let (pkY: pkey,=hostY) = checksign(ms,pkS) in
  104.         (* Message 6 *)
  105.         new Nb: nonce;
  106.         event beginAfull(hostY, xB, pkxB, pkY, NY, Nb);
  107.         out(c, encrypt((NY, Nb), pkY));
  108.         (* Message 7 *)
  109.         in(c, m3: bitstring);
  110.         if nonce_to_bitstring(Nb) = decrypt(m3, skB) then
  111.         (* OK *)
  112.         if hostY = A || hostY = B then
  113.         event endBparam(hostY, xB);
  114.         event endBfull(hostY, xB, pkxB, pkY, NY, Nb);
  115.         out(c, sencrypt(secretBNa, NY));
  116.         out(c, sencrypt(secretBNb, Nb)).
  117. (* Server *)
  118. let processS(skS: sskey) =  
  119.         in(c,(a: host, b: host));
  120.         get keys(=b, sb) in
  121.         out(c,sign((sb,b),skS)).
  122. (* Key registration *)
  123. let processK =
  124.         in(c, (h: host, k: pkey));
  125.         if h <> A && h <> B then insert keys(h,k).
  126. (* Main *)
  127. process
  128.         new skA: skey; let pkA = pk(skA) in        out(c, pkA); insert keys(A, pkA);
  129.         new skB: skey; let pkB = pk(skB) in out(c, pkB); insert keys(B, pkB);
  130.         new skS: sskey; let pkS = spk(skS) in out(c, pkS);
  131.         (
  132.                 (* Launch an unbounded number of sessions of the initiator *)
  133.                 (!processInitiator(pkS, skA, skB)) |
  134.                 (* Launch an unbounded number of sessions of the responder *)
  135.                 (!processResponder(pkS, skA, skB)) |
  136.                 (* Launch an unbounded number of sessions of the server *)
  137.                 (!processS(skS)) |
  138.                 (* Key registration process *)
  139.                 (!processK)
  140.         )
复制代码
使用proverif分析结果


毛病分析

A参数注入毛病

毛病分析: 可能存在未颠末充分验证和过滤的A参数输入,导致在A参数结束时的注入事件影响了A参数的开始。
攻击方法: 攻击者可能会尝试通过在A参数结束时注入恶意代码或数据,来影响A参数的开始,执行未授权的操纵或者篡改体系状态。
B参数比特串保护不足

毛病分析: 暗示攻击者可以或许获取B参数的某些比特串,可能意味着存在对B参数比特串的不充分保护。
攻击方法: 攻击者可能会尝试通过拦截或者篡改B参数的比特串,来绕过安全控制,获取敏感信息或者执行未授权的操纵。
A完整数据注入毛病

毛病分析: 暗示在A的完整数据结束时的注入事件可能影响A的完整数据的开始,表明存在对A完整数据注入的不足防护。
攻击方法: 攻击者可能会试图通过在A完整数据结束时注入恶意数据,来影响A完整数据的开始,导致数据不一致或者执行不当操纵。
B完整数据注入毛病

毛病分析: 表明在B的完整数据结束时的注入事件无法有效防止在B的完整数据开始时的注入事件,存在B完整数据注入毛病。
攻击方法: 攻击者可能会尝试通过在B完整数据结束时注入恶意数据,来绕过防护,影响B完整数据的开始,导致数据不一致或者执行不当操纵。
引用参考

https://blog.csdn.net/JingYan_Chan/article/details/133149371
https://lauzyhou.blog.csdn.net/article/details/116376508
https://blog.csdn.net/LiLiLiZuoBuKai/article/details/126676169?ops_request_misc=&request_id=&biz_id=102&utm_term=needham-schroeder%20%E5%8D%8F%E8%AE%AE%E5%88%86%E6%9E%90&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-6-126676169.142v99control&spm=1018.2226.3001.4187

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4