当前位置:安全企业动态 → 正文

Checked C —— 微软发布让C/C++更加安全的库

责任编辑:editor006 作者:Abel Avram |来源:企业网D1Net  2016-06-22 22:02:45 本文摘自:INFOQ

微软开源了Checked C,一个旨在对C和C++增加边界检查的研究项目。

C和C++语言上最大的漏洞之一可能就是越界的内存访问。根据美国国家标准技术研究所的国家漏洞数据库数据,从2010年至2015年,缓冲区溢出占所有安全漏洞的10-16%。由于大部分系统软件(操作系统、数据库、编译器、解释器、浏览器等)都使用C和C++两种语言之一编写,许多系统都面临内存冲突问题,这使得它们面临故障或者受到攻击,导致隐私信息泄露和系统被控制。来自微软和马里兰大学的一群研究者正在尝试解决这些问题,实现了Checked C,它是一个C语言的扩展和C++语言的子集,为这些语言增加边界检查。

不像现代语言(如Java、C#)这些自带自动边界检测,将该功能加入到C语言非常困难,项目参与者、微软研究员David Tarditi解释道:

为C语言增加边界检查有两个障碍。第一是运行时边界信息的存放位置,第二是如何高效的进行边界检查。在实践中发现,改变所有C语言指针类型和数组,以携带边界信息不是一个有效的方案。C语言可能被用于系统基础,一些硬件和标准指定了数据布局,且数据布局无法改变。同时C程序还与现存的操作系统交互,这些软件都需要特定的数据布局。

Checked C允许程序员在C/C++中编写“确保边界检查”的代码。为了实现这个功能Checked C增加了新的指针和数组类型,它们可以在编译期和运行时进行边界检查:

ptr:指向类型T且无须边界检查的指针。这种类型的指针不允许参与算数运算。当访问内存时,该类型指针不能为null。大部分指针应该用此类型。 array_ptr:指向包含类型T数组的指针。该指针可以进行算数运算。当读写内存时它不能为null。程序员需要检查这类指针的边界。 span:包含边界信息的指针。塔支持算数运算。当进行内存读写的时候不能为null。 T array_var checked[100]:声明类型为T、大小为100的数组并且包含边界检查。当进行C语言类型转换时,包含边界检查的数组将被转换成array_ptr类型。

该规范确定了变量操作行为,包括指针类型的间接寻址、数组引用、赋值、指针加法、比较、取址(&)、含边界检查数组类型和指针类型的转换等。

现存的C程序可以继续工作,很明显C*仍然未检查,且指针的算数运算会破坏当前代码。但是编译器可以通过增加参数在指针非正常使用时发出警告或者错误。

Checked C在GitHub上开源,包含规范、一个clang的实现和一个LLVM的实现。对此项目感兴趣的开发者被邀请参与项目,即可以改进规范、提出新的功能例如类型转换或者内存管理、增加测试,也可以扩展其他编译器对Checked C的支持。

过去也有其他尝试对C语言增加边界检查,包括使用静态分析、增强编译器或者运行时以避免修改语言本身、程序验证或者创造基于C的新语言。规范的第九章“相关工作”包含了这些其他实现的细节,并且解释了为什么作者选择了扩展语言。

查看英文原文:Checked C - A Safer C/C++ from Microsoft

关键字:Checked指针边界

本文摘自:INFOQ

x Checked C —— 微软发布让C/C++更加安全的库 扫一扫
分享本文到朋友圈
当前位置:安全企业动态 → 正文

Checked C —— 微软发布让C/C++更加安全的库

责任编辑:editor006 作者:Abel Avram |来源:企业网D1Net  2016-06-22 22:02:45 本文摘自:INFOQ

微软开源了Checked C,一个旨在对C和C++增加边界检查的研究项目。

C和C++语言上最大的漏洞之一可能就是越界的内存访问。根据美国国家标准技术研究所的国家漏洞数据库数据,从2010年至2015年,缓冲区溢出占所有安全漏洞的10-16%。由于大部分系统软件(操作系统、数据库、编译器、解释器、浏览器等)都使用C和C++两种语言之一编写,许多系统都面临内存冲突问题,这使得它们面临故障或者受到攻击,导致隐私信息泄露和系统被控制。来自微软和马里兰大学的一群研究者正在尝试解决这些问题,实现了Checked C,它是一个C语言的扩展和C++语言的子集,为这些语言增加边界检查。

不像现代语言(如Java、C#)这些自带自动边界检测,将该功能加入到C语言非常困难,项目参与者、微软研究员David Tarditi解释道:

为C语言增加边界检查有两个障碍。第一是运行时边界信息的存放位置,第二是如何高效的进行边界检查。在实践中发现,改变所有C语言指针类型和数组,以携带边界信息不是一个有效的方案。C语言可能被用于系统基础,一些硬件和标准指定了数据布局,且数据布局无法改变。同时C程序还与现存的操作系统交互,这些软件都需要特定的数据布局。

Checked C允许程序员在C/C++中编写“确保边界检查”的代码。为了实现这个功能Checked C增加了新的指针和数组类型,它们可以在编译期和运行时进行边界检查:

ptr:指向类型T且无须边界检查的指针。这种类型的指针不允许参与算数运算。当访问内存时,该类型指针不能为null。大部分指针应该用此类型。 array_ptr:指向包含类型T数组的指针。该指针可以进行算数运算。当读写内存时它不能为null。程序员需要检查这类指针的边界。 span:包含边界信息的指针。塔支持算数运算。当进行内存读写的时候不能为null。 T array_var checked[100]:声明类型为T、大小为100的数组并且包含边界检查。当进行C语言类型转换时,包含边界检查的数组将被转换成array_ptr类型。

该规范确定了变量操作行为,包括指针类型的间接寻址、数组引用、赋值、指针加法、比较、取址(&)、含边界检查数组类型和指针类型的转换等。

现存的C程序可以继续工作,很明显C*仍然未检查,且指针的算数运算会破坏当前代码。但是编译器可以通过增加参数在指针非正常使用时发出警告或者错误。

Checked C在GitHub上开源,包含规范、一个clang的实现和一个LLVM的实现。对此项目感兴趣的开发者被邀请参与项目,即可以改进规范、提出新的功能例如类型转换或者内存管理、增加测试,也可以扩展其他编译器对Checked C的支持。

过去也有其他尝试对C语言增加边界检查,包括使用静态分析、增强编译器或者运行时以避免修改语言本身、程序验证或者创造基于C的新语言。规范的第九章“相关工作”包含了这些其他实现的细节,并且解释了为什么作者选择了扩展语言。

查看英文原文:Checked C - A Safer C/C++ from Microsoft

关键字:Checked指针边界

本文摘自:INFOQ

电子周刊
回到顶部

关于我们联系我们版权声明隐私条款广告服务友情链接投稿中心招贤纳士

企业网版权所有 ©2010-2024 京ICP备09108050号-6 京公网安备 11010502049343号

^