1、一种安全语言的设计及形式证明,华保健 中国科学技术大学计算机系合作者:陈意云 李兆鹏 王志芳 葛 琳,TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: A,软件安全的挑战,软件系统应用越来越广泛,其安全问题也愈发突出来源:CNCERT/CC 2006年度报告 2007年上半年的统计数据已经超过了06全年的统计数据 程序设计语言本身的安全性对高安全需求软件起着基础作用,现有研究方法及其问题(1),程序分析的方法 基于这些方法的工具:LC-Lint、Purify和PREFix等 相对简
2、单;可扩展性好;代价相对较低 分析结果一般不具备完备性 类型系统技术 成功用于Java、C#和ML等广泛使用的语言 轻量级语法方法;模块性良好 表达能力有限;不允许显式存储管理,现有研究方法及其问题(2),类型细化 依赖类型、应用类型和单元素类型等 从不同层面一步增强了类型系统的表达能力 受表达能力限制,仅在不多的论域取得了结果 程序验证和公理语义 携带证明的代码(PCC)、ESC/Java和Spec#等 更通用的框架;表达能力更强 程序员负担重;受限于定理证明器的证明能力,我们的研究目标,安全语言设计和实现 安全语言面向系统程序设计 研究内容 语言设计;公理语义系统;出具证明编译器;语言和公
3、理系统的性质证明等 把携带证明的代码技术(PCC)推向实用 面向系统程序设计语言;更丰富的安全策略 对高安全需求软件的设计和实现技术进行探索 依靠程序设计语言设计和实现技术,本文主要工作和贡献,研究了类型系统和逻辑系统相结合的安全机制 应用到所设计的类C的命令式语言PointerC上 主要特色是定型规则中包含显式副条件 副条件表达更丰富的安全策略 提出了指针逻辑 Hoare逻辑的扩展 证明了语言的安全性和指针逻辑的可靠性 用机械化方法 证明在Coq中完成,源语言PointerC,源语言PointerC是类C的命令式语言 选取了C语言核心的表达式和控制结构 包含malloc,free操作 为什么
4、选择C? C是最重要的系统程序设计语言之一,但不安全 出于效率考虑 使用类型系统和逻辑系统相结合的静态机制 研究重点是指针操作的安全问题,类型系统、副条件,PointerC定型规则包含显式的副条件 典型示例:断言语言 扩展的一阶逻辑 必须证明这些副条件 成立 保证程序的安全性,指针逻辑的设计目的,证明副条件成立是困难的 副条件和值相关 传统上依赖运行时动态检查 不成立则抛出异常 Java/C#等 试图静态证明副条件 以Hoare逻辑推理的方式 困难部分是指针操作的安全性 对Hoare逻辑做了扩展,提出指针逻辑,指针逻辑(1),基本思想 在每个程序点表达指针值的信息 有效、空或者悬空, p =
5、malloc (); ,指针逻辑(2),基本思想 在每个程序点表达指针值的信息 有效、空或者悬空, p, q / p-next p = malloc (); ,指针逻辑(3),基本思想 以推理规则表达语句给指针信息带来的变化 最强后条件演算,指针逻辑(4),基本思想 以推理规则表达语句给指针信息带来的变化 最强后条件演算, p, q / p-next p = malloc (); p / q / q-next / p-nextD ,前条件,操作语义,操作语义的定义基于抽象机器模型 包括全局变量区、栈、堆等 操作语义由一系列归约规则组成 语句 在机器模型 上的执行在机器模型上形式描述安全策略:
6、无下标越界 无空(悬空)指针引用 无内存泄漏,语言安全性定理及其证明,经过类型系统和指针逻辑检查的程序是安全的 不违反安全策略 证明步骤: 机器模型上形式化安全策略 无数组越界,无空(悬空)指针引用;无内存泄漏 证明安全策略对操作语义是不变式(Invariant)证明在Coq中完成,机械化证明,安全性 证明,机械化的元逻辑 (CiC),指针逻辑可靠性定理及其证明,证明指针逻辑(公理语义系统)对PointerC的操作语义可靠。主要步骤: 给出指针逻辑断言在机器模型上的语义解释 特别考虑了推理规则中的副条件 在基础逻辑中形式化指针逻辑的推理规则 包括断言 证明指针逻辑对操作语义可靠 如果一个断言在
7、语法系统中可证,则它语义有效 证明在Coq中完成,机械化证明,安全性 证明,机械化的元逻辑 (CiC),可靠性 证明,出具证明编译器PLCC,源程序 + 源级规范标注,验证条件生成器,定理证明器,验证条件,代码和规范 的生成,证明生成,验证条件的证明,汇编代码 + 规范,汇编代码 + 规范 + 证明,出具证明的编译器,证明检查器,相关工作,程序性质证明 ESC,ATS等 面向系统编程的安全语言 Cyclone,CCured等 出具证明的编译器 Flint/SML, TouchStone, Special J, TIL/TAL等 语言定义和实现的机械化 SML(Twelf),CMinor(Coq
8、),CAP(Coq)等,进一步的工作,扩展源语言 支持部分指针算术 calloc操作 扩展指针逻辑系统 支持不规则数据结构的推理,如图等 设计和实现出具证明编译器原型系统 研究编译器和定理证明器交互 程序验证和程序优化等,结论,研究了类型系统和逻辑系统相结合的安全机制 应用到所设计的类C的命令式语言PointerC上 主要特色是定型规则中包含显式副条件 副条件表达更丰富的安全策略 提出了指针逻辑 Hoare逻辑的扩展 证明了语言的安全性和指针逻辑的可靠性 用机械化方法 证明在Coq中完成,了解更多,欢迎访问软件安全实验室主页,了解更多信息 http:/ 基于Hoare逻辑的公理语义系统核心思想
9、 以逻辑命题精确表达在每个程序点的有效指针、空指针和悬空指针的信息 设计推理规则来推理程序语句给这些指针信息带来的变化 断言语言基于一阶逻辑 演算规则类似于Hoare逻辑系统的最强后条件演算,指针逻辑可靠性定理及其证明,证明指针逻辑(公理语义系统)对PointerC的操作语义可靠。主要步骤: 给出断言 在机器模型上的语义解释特别考虑了推理规则中的副条件 指针逻辑对操作语义可靠证明在Coq中完成,语言安全性定理及其证明,经过类型系统和指针逻辑检查的程序是安全的 不违反安全策略 证明步骤: 在机器模型上形式化安全策略 无数组越界,无空(悬空)指针引用;无内存泄漏 证明安全策略对操作语义是不变式(I
10、nvariant)证明在Coq中完成,和PCC相比较的优势?,从可生成携带证明的代码的角度来说,本工作进一步把PCC技术推向实用 但至少在以下几点,存在显著不同 源语言的灵活性 安全策略的丰富程度 出具证明编译器所能支持 Hoare逻辑风格推理的支持程度,PointerC对Java或者ML等类型安全 的语言的优势?,Java或ML仅提供了类型安全的保证,在很大高安全需求的场合,这相对较弱 如:需要部分正确性要求的软件系统中 C的很多特性,如显式存储管理,是实现一些关键系统所必须的 如:高风险设备的实时或者嵌入式系统 用Java或ML重新实现现有的C遗留代码,无论从精力和可行性上,都是不实际的 代码规模以数百万行级计,