基于C语言的程序安全性分析
2017-12-27刘莉
刘莉
辽宁锦州渤海大学信息科学与技术学院
基于C语言的程序安全性分析
刘莉
辽宁锦州渤海大学信息科学与技术学院
安全问题一直都是软件系统的最大难题,也是大部分系统软件中都存在的。我们在使用软件时,经常会出现无法预料的问题。漏洞是系统性语言,指的是系统安全问题,它包含的是大部分会造成计算机发生危险可能性的要素。本文以安全漏洞的涵义、类型和应用作为切入点,主要是对C语言中安全漏洞情况进行介绍。缓冲区溢出成为安全漏洞较为普遍的威胁手法,在C语言里大部分的缓冲区溢出的根源都在于规范的C库,最严重的问题是没有检查自变量的存在问题的字符串操作函数。同时,C语言里面的getenv()、getopt()等系统都不同程度上有着一样的不可靠因素。通过分析存在的不安全因素,能够在很大程度上降低发生错误的可能性,从而可以编写出安全性更高的程序。
缓冲区溢出 安全漏洞 系统调用 攻击
1 计算机安全的定义
有关计算机的安全性的研究,目前在研究领域已形成新的门类,即计算机安全学。对于计算机安全的概念,要怎么进行界定,国际标准化委员会认为,计算机安全主要是指通过采取定的手段和措施,来保证计算机在应用过程中不受或减少受到不安全因素影响的几率,其目的是为了维护数据处理系统的正常运行。根据对这个概念的界定我们可以得出计算机安全涉及的范围是综合性的、复杂性的,不只是简单的技术处理及管理,还是将各门学科的综合运用。根据概念的阐述,对其从四方面来理解,也就是实体、软件、数据及运行四个方面的安全性保障。以其涵盖的内容而言,它体现的范围更广,与计算机相关的一切技术、管理、产品、相关政策、法律等都为计算机安全的内容。
2 C语言的安全性问题
2.1 安全编程语言的定义
安全语言一直以来的概念的都没有形成,如果想确切了解这个概念,可以利用下面几个涵义来理解。程序在进行的过程里遇到的问题叫做执行错误。部分执行错误对于计算机的威胁是最直接的,当这些错误出现的时候,计算机系统当时便无法工作,所反馈的报告得出这个问题出现在哪里及属于什么问题。这样的错误也叫做可以获取的错误。另外还存在着部分错误是无法预料的,这样的错误发生时,系统的数据也受到损害,不过系统却没有发现,这样就不会马上产生反馈。
举个例子来说,在无越界检查的前提下访问超越数组边界的数据。还有一个实例为程序运行时未按原来地址运行,但是它到的新的地址的内存可以承载这个程序的运行,这样在一定时期内导致系统就无法发现程序运行出现了问题,像出现这样的错误就是不可捕获的错误。假设程序运行得好,是不会出现上面阐述的错误情况的。根据以上分析可以看出,C语言具有非安全性,这是因为在C程序运行的时候,也会出现那些不会被系统发现的错误。
确保语言安全采取最为普遍的措施是给语言有针对性的设计某个类型系统。它是由一组定型规则组成的,用这些规则来规范和约束语言结构。在这些规则中,定型主要指的是两个独立的整型,结合之后还是以整型的形式来体现。按照语言的类型体系,编译器和别的程序分析工具主要是借助各种检查的方式来规避类型错误程序,检查的方式没有限制,可以是静态的、动态的,也可以是两者的结合。
像含表达式3+true。假设是良类型程序(也就是所有类型的错误都没有的程序,还叫做合法程序),它就必须为良行为,那么就叫做这种语言为可靠的。类型的可靠语言从性质上来说它就属于安全语言的范围。
基于以上分析可以知道,C语言属于类型化,但它却是不安全的。它的不安全性体现在多个方面,还可以从联合体类型、含灵活数组结构体类型等类型都可以看出。
2.2 从别名角度设计安全C语言
编程语言里,从语法和语义的层面来说,符号名字在C语言里的名称为访问路径及变量。如果指针类型的变量那么就叫做指针变量,也叫做指针。假设它们同时应用于一个内存单元里,那么就叫做他们的另外的名字。在这个单元里,如果对一个变量的名称进行修改,那么相应的,与之对应的另一个变量的名字也会发生变化,一般情况下程序员都不愿意面对这样的问题。所以别名会给程序员带来一定的困扰,制约其进行理解与分析。一般我们说的别名分析就是利用已经产生的信息来判断这个变量的名字。通常情况下,对于同一类型的变量所对应的指针名称也是一致的,不过,根据已有信息对别名进行判断,一般都不会采用。
3 C语言的不安全因素
3.1 缓冲区溢出
近十年以来,缓冲区溢出成为了产生安全漏洞的最普遍存在的一种攻击类型。而且让人更为棘手的是,这种漏洞威胁在远程网络的攻击性中占有很大的比例。在发生这种攻击行为时,得到的结果是一名不记名的Internet用户可以轻松地掌控一台计算机。这种攻击性由于其获得控制权的人具有随意性,因此它也成为目前世界上最具攻击性的不安全因素。
我们之所以把缓冲区溢出作为最大的威胁因素,最关键的就是因为它具有普遍性,而且操作简单,很轻松就会造成威胁和攻击。同时,它在远程网络上具有很强的攻击性,是因为这种攻击能够让攻击者为所欲为,想得到什么就得到什么。缓冲区漏洞在进行程序攻击时,以植入代码的形式来行使对计算机的操纵权。他们控制计算机后,就可以进行完全操作。接下来将具体阐述缓冲区溢出相关概念。
3.2 缓冲区溢出的概念
缓冲区是计算机用来存储数据的,为程序运行过程中计算机里存储的数据,计算机的存储空间是一定的,当程序进行数据输入的过程中,假设计算机的空间已满,不能再存储新的数据,那么这些数据将会产生缓冲区溢出。攻击者想要进行攻击时,就可以在这个区域植入一定字符串,来修改程序。在这个溢出区如果植入字符串,会造成两样后果:其一是字符串太长旁边的存储单元也无法储存,造成程序终止;其二是借助这个漏洞能够执行所有指令,严重的情况下能够获得系统root特权。通常会出现缓冲区溢出最主要是由于程序里未认真查看客户录入参数导致的,其实质也是对于录入参数的一个错误判断和分析。
4 不安全的C语言库函数
4.1 典型字符串处理函数的安全性分析
4.1.1 什么是系统调用
系统调用是连接用户与核心层的一个层级。它用部分即定的模块,它们创造了路径,这个路径主要是满足用户与应用程序之间连接的需要。很多的数据操作系统里,普通用户与应用程序完全实现不了对硬件设备的访问,具备这个权限的就是操作系统,那是由于它掌握着系统的操作权限。因此如果要保证应用程序可以没有风险地访问硬件系统及别的也很关键的软件,一般操作系统在进行程序操作前,都会借助于系统调用这个功能。
4.2 C环境下系统调用的安全问题
编写C语言代码的过程中,针对于系统调用这点也尤其要关注,通常会涉及到2个安全问题,写程序的过程里要考虑到进去:
其一,保证你所新建的所有临时文件都没有保密的数据,假设有这样的数据,在文件设置上定性为限本人读/写,这样识别的文件只有本人能操作。
其二,明确对于运行的命令都是本人要进行的操作,(分别为system(),popen(),Systemout(),Systemin()),对于不识别的命令一律不能进行操作,特别是本人的程序要是匿名的Internet用户允许时一定要注意。
5 安全C语言的详细设计
在进行安全C语言设计时重点侧重两个问题:一方面是制约C程序本身,另一方面是利用程序标注进行程序属性的介绍,这样做的目的是用来提示程序验证系统,从而对程序进行正确的判定。本文为了使阐述更为明确,将各个概念进行了明确的界定,将变量根据其分配及函数动态、静态等区域的不同划分为巧变量、堆变量及静态区变量。静态区分为两个区域,一个区域是只读的,也就是对数据只能进行读,不能更改、删除。像程序里有的字符串常量。相对应的指针分别为找指针、堆指针及静态区指针。在相应的变量与指针进行对比时,都统称为巧变量。通常来说,将指向变量V指针叫做V指针。
5.1 对程序的约束
结合避免出现无法推断别名及限制可推断别名的原则,在对程序约束进行设计时考虑以下几方面:
其一,堆分配类型和指针不能同时出现在一个程序里,最好是不要在程序里有这两个的共有的类型或指针。
其二,堆区与别的数据区联系不大,最好不要有从堆区指向别的数据区里的指针,同时指针利用要科学合理,不能乱用。
其三,只能对在数组区内的数据及指针进行运算。
从本质上来说,编程都会按照这几点进行操作,像指针类型方面的,都是最为基本的。在实际操作中,还会呈现现以下特征:
①不能将堆变量和别的变量混乱连接形成易变数据结构。
②有时候会出现把堆变量当作静态区指针的情况。
③通常情况下,不可能出现在某个概念里包含本身引用的结构体类型(是类型与指针的类型都是同一种)构造多种类型的易变数据结构。
④用取地址算符&取巧变量、静态区变量及堆变量的地址通常用于下面目的。
结语:Internet对于人类发展的重要程度越来越高,应用程序连接越来越紧密,链条越来越长,安全问题也越来越复杂,相应地给网络带来的不安全隐患越来越大,程序问题是互联网健康发展的关键,需要高度重视。C语言在目前的应用性语言中应用最为广泛,它的安全性直接关系到大部分网络的安全性。所以,C语言的安全问题受到了广泛关注。由此可见,针对该程序安全漏洞的研究与探索,对于网络的健康发展至关重要。本文主要从C语言安全性分析展开,探讨了C语言的不安全因素,C语言的安全性问题,其中C语言安全性问题介绍了安全编程语言的定义以及安全C语言的设计。
[1]司华友,赵芸,罗显贵.基于C语言的程序设计能力培养探析[J].计算机时代,2008(3):68-69
[2]蔡志远,马石城,蔡志坚.基于C语言程序的简布法边坡稳定分析[J].长沙大学学报,2012,26(5):20-22
[3]王晓妍,苏爱玲,张蕾妮.基于C语言程序设计课程在CDIO模式下实践教学的探讨[J].当代教育实践与教学研究:电子刊,2016(5):23-25
[4]高雅侠,邹海荣.基于C语言程序设计的常见错误分析[J].电脑知识与技术:学术交流,2009,5(35):69-70