Page 8 - 《软件学报》2021年第6期
P. 8

1582                                     Journal of Software  软件学报 Vol.32, No.6,  June 2021

                                                                                             [1]
             为了发现协议实现中的语义逻辑错误,研究人员提出了对协议实现代码同样进行形式化验证的思路 .程
         序设计语言本身在语法语义上复杂表达能力丰富,难以直接在其上进行形式化的验证推演,因而对协议代码的
         形式化分析都是遵循先抽象再验证的工作思路开展.通常做法是:将协议源码抽象为某种形式化语言模型,再基
         于该抽象模型进行协议安全属性的形式化验证.不同语言实现的协议在分析时存在较大差异性,多数文献都是
         针对协议的某种具体的编程语言实现提出相应的形式化方法                        [2−4] .近些年,协议代码形式化验证方面的研究工
                                          [7]
                                   [6]
         作目前以对 JavaScript  [5,6] ,Python 和 Java 这类高级语言编写的协议代码分析为主,而针对较偏底层的 C 语言
         协议实现形式化工作相对较少,且在实用性上存在一定限制,例如不支持 C 的指针语法                            [1,8] 、对条件分支和函数
         调用无法自动化抽象        [9,10] 等.而安全协议开发中 C 语言的所占比重,对协议 C 代码的形式化验证工作更具现实安
         全需求.
             本文的研究对象是 C 语言实现的协议代码的逻辑语义检测,忽略一般的代码级问题如内存类 bug,旨在设
         计并实现对协议 C 源码自动地形式化验证方法.根据 C 语言面向过程的编程特点,按照函数调用-函数体语句-
         表达式的顺序将协议 C 程序逐步抽象为 Pi 演算模型,利用成熟的协议自动验证工具 ProVerif                        [11] 对代码的抽象
         模型进行验证.ProVerif 是一个在 Dolev-Yao 敌手模型下自动化分析协议安全属性的工具,能够自动化证明可达
         性属性和观察等价性.这些能力允许对机密性和认证属性进行分析,此外,还可以用于刻画诸如匿名性、可追溯
         性等,并且可以在无限数量的会话和无限的消息空间下进行推理.该工具还能够进行攻击路径重构.这些针对协
         议的成熟的解决方案是一般的代码验证工作所不具备的.根据抽象方案实现了自动化抽象工具 C2P(https://
         github.com/85lx/C2P),并将其开源.在对协议实现代码中的密码与通信原语及相关标准库函数处理时,采用当前
         这一方向的通用处理方式,将其视为黑盒,不探索这些库函数的细节;提出了获取静态函数调用关系序列的算
         法,并在静态执行下函数调用关系序列基础上,给出了函数调用关系在 Pi 演算逻辑语言中的表达方法;提出了基
         于函数上下文的表达式归约算法,对 C 语言中涉及到的基本代数和逻辑运算进行规约,降低了抽象模型的逻辑
         复杂度.
             本文的主要贡献如下:
             (1)  提出一种对协议实现的 C 源码形式化验证的方法.该方法可以将协议 C 代码转换为 Pi 演算抽象模型,
                 进一步在 Dolve-Yao 敌手模型下验证相关的安全属性是否满足;
             (2)  提出了函数调用时序图(function call sequence  graph,简称 FCSG)结构和静态执行下函数调用序列获
                 取算法,并基于静态执行下的函数调用序列,给出了 C 程序中函数调用在 Pi 演算模型中的抽象方法,
                 给出了其合理性证明;
             (3)  依据方案实现了协议 C 代码的自动化抽象工具 C2P 并将其开源,通过 Kerberos 协议代码,验证分析说
                 明了方法和工具的有效性.
             本文第 1 节介绍相关工作.第 2 节简介协议源码验证及 Pi 演算基础知识.第 3 节阐述协议 C 源码到 Pi 演算
         模型的抽象方法.第 4 节介绍 C2P 工具实现和方法合理性证明以及代码实例上的实验.最后,第 5 节总结全文.

         1    相关工作

             对于协议代码的形式化验证,与之前的协议标准的形式化分析工作有着很大区别.程序设计语言本身在语
         法语义上复杂表达能力丰富,难以直接在其上进行形式化的验证推演,因而对现有协议代码的形式化分析都是
         遵循的先抽象再验证的逻辑思路开展.文献[11]是对协议实现安全性分析最早的工作之一,通过程序开发人员
         在代码中的注释建立信任断言模型,将协议的 C 语言程序抽象成霍恩子句,基于霍恩子句的逻辑理论,在信任断
         言模型中进行协议机密性验证.文献[8]是第 1 个将软件模型检测与标准协议安全模型相结合、自动分析 C 语
         言中实现协议中的认证性和机密性的框架.文章中用谓词抽象技术将具体的协议程序翻译成更为抽象的
         ASPIER 模型,并采用 ASPIER 分析并发现了 SSL 握手协议的 OpenSSL0.9.6c 源代码中存在的“版本回滚”漏洞.
         不足之处在于:该项工作没有很好地处理 C 语言的主要特性是指针和内存操作这两大特性,因而需要大量人工
         参与,实用性受限;另一方面的不足是,文中采用自定义的 ASPIER 抽象模型相对较复杂,研究人员得熟练掌握
   3   4   5   6   7   8   9   10   11   12   13