c语言源代码静态检测工具设计与实现毕业论文内容摘要:
认这些代码的安全性。 词法扫描 词法扫描是 一种以词法分析为基础的静态代码安全检测方法。 在通过对源代码的静态的扫描过程中,找出可能存在的安全漏洞。 它的基本原理是,首先, 将一个或多个源代码文件作为输入 , 并将文件中的源代码转换为相应的词法符号流。 然后使词法符号流与预先设定好的安全漏洞字典相比对。 如果发现比对命中 ,则报告漏洞。 例如 :一旦发现 c 源程序中存在 strcpy, strcat 等 函数即认为 可能 存在缓冲区溢出这种安全性漏洞。 这种方法易于操作,但是 采用词法分析的扫描工具容易出现误报。 简单语义分析 基于简单语义分析的的检查工具采用了类似于编译器的设计原理。 结合了语法分析和语义分析技术。 同时也加入了数据流分析和控制流分析。 因此,这种方法具有较高的准确性, 较低的错报 率 和误报率。 同时具有较强的可扩展性且 可适用于对大规模程序的分析。 沈阳航空航天大学毕业设计(论文) 9 软件代码风险介绍与原理 我们调研了现今最常出现的代码安全漏洞风险。 他们是 网络安全问题的罪魁祸首,我们应采取各种方法尽量避免他们的出现。 以下我们来做详细介绍。 他们分别是内存访问错,缓冲区溢出,竞争条件,随机数的滥用,异常控制,空指针的使用。 内存访问错 C 语言程序中引发安全漏洞的问题,绝大多数属于内存访问错误,因为 C 语言并没有提供完善的内存保护策略。 内存访问错误可能由数组、指针或内存管理造成。 对指针和数组缺乏边界检查是造成内存访问错误的根源。 据统计 , 超过 50%的软件安全漏洞都 是由指针和数组 访问造成的。 被列为攻击手段之首的“缓冲区溢出攻击”就是利用此类安全漏洞。 首先, 我们要 仔细分析 一下 C 语言程序能够使用的内存是怎样分配的: (1) 从静态存储区域分配,这块内存在程序的整个运行期间都存在,例如全局变量、 static 变量。 (2) 在栈上创建,函数内的局部变量的存储单元都可以在栈上创建。 (3) 从堆上分配,亦称动态内存分配。 程序在运行的时候用 malloc或 new申请任意多少的内存,程序员自己负责在何时用 free或 delete释放内存。 动态内存的生存期由程序决定,使用非常灵活,但问题也最多。 针对内存从分配、使用到释放的整个过程,可能发生如 : (1) 内存未成功分配,却在后续代码中使用。 典型的情况就是在堆中动态的申请一部分内存空间,许多有安全漏洞的代码总是假设内存是分配成功的,继续其他操作。 但是,在实际程序运行的过程中,内存的空间可能被占满,造成内存分配不成功,所以程序必须在使用内存空间之前检查内存是否成功分配,以预防出错。 (2) 内存空间虽然分配成功,但是使用前没用进行初始化。 在 C语言中, 内存的缺省初值没有统一的标准,尽管有些时候为零值。 如果变量的引用处和其定义处相隔比较远,变量的初始化很容易被忘记。 如果引用了未被初始化的变量,可能会导致程序错误。 (3) 内存分配成功并且已经初始化, 但操作越过了内存的边界。 这类错误在 C语言中又称为空间访问故障,即通过指针或数组访问合法范围外的空间。 C语言缺乏数组边界检查,数组下标越界是一种典型的空间访问故障。 如在使用数组时经常发生下沈阳航空航天大学毕业设计(论文) 10 标“多 1”或者“少 1”的操作,特别是在 for循环语句中,循环次数很容易搞错,导致数组操作越界 ,致使整个程序崩溃。 (4) 忘记了释放内存,造成内存泄露。 C语言中并没有强行的限制程序员要在使用完内存后释放内存空间。 所以经常回有不安全的代码致使许多内存空间泄露。 内存泄露时黑客常用的一种攻击手段,其根本原因就是某个内存泄露安全漏洞 ,忘记释放内存空间, 导致每被调用一次就丢失一块内存。 刚开始时系统的内存充足,你看不到错误,因而调试阶段不能发现错误,当终于一天内存耗尽程序突然死掉,系统将提示:内存耗尽。 (5) 释放了内存却继续使用它。 这类故障也称为时间访问故障,即在其生存期之外访问内存空间,一个典型的时间访问故障是访问一个已经释放的堆分配单元,由于释放的单元归还系统后可以重新分配,因此再次访问时具有不确定的值。 内存访问错误很难检测和修改,因为: 编译器一般不能自动发现这些错误,通常是在程序运行时才能捕捉到。 内存访问错误一般没有 明显症状,除非在异常的情况下。 导致内存访问错误的异常条件可能不能再现,增加了差错纠错的困难; 一旦错误再现,也可能很难把程序错误与内存访问错误联系 缓冲区溢出 1988年大规模蠕虫传染了成千上万台联网主机,罪魁祸首就是缓冲区溢出漏洞。 在过去 10年里,尽管已经意识到缓冲区溢出的危害,但缓冲区溢出攻击仍在增长,据CERT/CC统计,在过去 10年里,在所有的脆弱性中缓冲区溢出漏洞占据了 50%,而且这个数据随时间的流逝还在增长,作为一类内存访问错误,由于它的重要性,因此在此进一步分析缓冲区溢出的根源。 缓冲区溢 出就是越过了数组边界进行读写。 标准 C库提供的许多字符串操作,如 gets、 strcpy、 strcat、 sprinf,它们本质上是不安全。 程序员有责任检查这些操作能否溢出缓冲区。 例如:程序执行 gets(str)指令, str是内存一个连续的存储区的首地址, gets从程序的标准输入读取文本,把第一个字符放在这个存储区的首地址,后续的字符依次存放,直到从标准输入读到新行或文件结束符,在对应的存储区放上空字符 /0。 程序员没法指出一个缓冲区有多大。 因此,如果读 入的文本长度超过给定的存储区长度,那么,读入的字符将覆盖 str所代表的存储区的后续空间。 这就是缓冲区溢出。 缓冲区溢出可能造成两个风险: 1)与该缓冲区相邻的内存空间很容易被覆盖,如果该空间存储的信息非常关键,那么可能造成非常严重的安全隐患; 2)通过覆盖运沈阳航空航天大学毕业设计(论文) 11 行栈中函数返回地址,攻击者可以引诱程序执行任意代码,这类栈溢出是目前最常见的安全缺陷。 在 C库函数中,每个这样的字符 (函数都有相应的安全函数对应: strncpy,strncat, snprintf等,在使用这些函数时,可以由程序员指出实际缓冲区大小,避免发生缓冲区溢出。 例如, strncpy(dst,src,10)指明,从 src向 dst拷贝不多于 10个字符。 然而,这些替代函数也有不足:一方面用起来不太方便,有些系统不支持这些函数;另一方面,跟踪缓冲区实际大小的任务仍由程序员来完成。 竞争条件 所有操作系统都有一些陷入 (trapdoor),允许特权用户完全控制系统,竞争条件是在多进程环境里,特权程序或与特权程序并发运行的程序中可能被利用的一类缺点。 例如:一个超级用户为一个普通用户创建一个文件 (Createfile),并把该文件的所有者更改为该普通用户 (chown),但在更改所有权之前,该用户把此文件删除,并建立了此文件到系统 关键文件,如 /etc/password的链接,这样,所有权的更改致使系统文件被这个普通用户拥有。 这个例子说明,在多进程的环境里,创建 (create)和更改 (change) 必须是原子,其完整性不可破坏。 进程访问文件的方式有两种:一种即通过完整的文件路径访问文件;另一种是通过文件描述符访问文件。 在系统内部,文件系统在概念上讲是一棵树,内部结点代表目录,叶结点代表文件,路径名指出了从树根到要访问的文件或目录所经过的各结点。 每个结点记录了它的下层结点的地址,因此通过路径访问文件类似于间接指针访问。 文件描述符是在每 个进程的基础上,为每个文件赋予的一个标志,它直接与目标绑定,当访问文件时,直接通过文件描述符,而不需要 通过文件系统一步一步查找,因此它的使用方式类似于直接指针。 现假设有两个系统调用要访问文件,如果两次访问都使用文件描述符,他们本质上是原子的。 因为文件描述符是以进程为基础的,其它进程不能改变文件描述符与目标的绑定。 但如果一个访问以路径形式进行,那么其它的进程可以更改路径与具体目标文件的绑定,这就可能发生竞争条件。 具体地 ,如果相邻的两个系统调用都使用路径访问同一个文件,那么可能存在竞争条件,如果一个使用路径 ,一个使用文件描述符,那么,如果第一个系统调用是把文件描述符与路径相关,则不会发生竞争条件,否则可能发生竞争条件。 如果两个系统调用都使用文件描述符,那么这两个系统调用间不会发生竞争条件。 沈阳航空航天大学毕业设计(论文) 12 随机数滥用 C程序中涉及许多随机数的选取,例如,创建一个临时文件,用于存取一些临时数据,创建一个挑战号、创建密钥,出于安全性考虑,临时文件名和挑战号等使用由系统函数 rand产生的随机数,以防攻击者猜测。 但是,系统提供的 rand是一个伪随机数,其内部的实现根据给定的种子能够产生可重复的输出值。 因此,需要程序员选定一个安全的种 子。 如果不精心选择安全的种子,对精明的攻击者来说,使用随机数同使用固定数一样可以猜测。 异常处理 C语言没有异常处理机制,所有的异常检测和处理都必须由程序员主动完成,如果程序员没有明确处理异常情况,那么异常发生时系统将出现不可预测的错误。 例如: FILE *fp。 char buffer[128] fp=fopen(“ /etc/password” ,“ r” )。 fgets(buffer,sizeof(buffer),fp)。 这个程序假设系统一定有“ /etc/password”这个系统文件,并且打开总能成功, 如果这个文件被恶意地删除,或者程序运行的权限不够,或者其他程序正在独占使用该文件,致使打开不成功,那么,后续的读操作将发生核心错 (coredump)。 因此 C程序员有义务增加异常检测和处理代码 , 进行主动防错设计。 从 C发展而来的 Java语言提供了非常强大的异常处理机制,强制程序员对“可检测异常”进行处理。 空指针引用 空指针即 指向没有分配的内存区域 ,例如: typedef char *FileContent。 Filecontent file1。 Filecontent file2。 ⋯ strcpy(file2,file1)。 该程序本意是让 file1指向源,让 file2指向目标,通过 strcpy(file2, file1)把 file1指向的内容拷贝到 file2中。 一般情况下,这种拷贝不会有问题,但是当 file1没有指向任何合法的静态、局部或动态分配的空间时,程序运行出错。 为此程序在使用指针时,不仅要沈阳航空航天大学毕业设计(论文) 13 关心指针本身是否定义,还要关心指针是否已经指向了合法的内存空间。 应该检查从file1定义到其引用的每条可能路径,检查 file1是否一定指向了合法的内存空间。 技术简介 本系统主要使用 python 开发后台程序, PyQt 库设计界面, SQLite 作为后台数据库。 基于 linux 操作系统下进行开发。 Python 语言简介 Python 是一种解释型、 面向对象 、动态数据类型的高级程序设计语言。 自从 20世纪 90 年代初 Python 语言诞生至今,它逐渐被广泛应用于处理系统管理任务和 Web编程。 Python 已经成为最受欢迎的程序设计语言之一。 2020 年 1 月,它被 TIOBE 编程语言排行榜评为 2020 年度语言。 自从 2020 年以后, python 的使用率是呈线性增长。 众多开源的科学计算软件包都提供了 Python 的调用 接口 ,例如著名的计算机视觉 OpenCV、三维可视化库 VTK、医学图像处理库 ITK。 而 Python 专用的科学计算扩展库就更多了,例如如下 3 个十分经典的科学计算扩展库: NumPy、 SciPy 和matplotlib,它们分别为 Python 提供了快速数组处理、数值运算以及绘图功能。 因此Python 语言及其众多的扩展库所构成的开发环境十分适合工程技术、科研人员处理实验数据、制作图表,甚至开发科学计算应用程序。 PyQt 图形类库简介 PyQt 是一个创建 GUI 应用程序的工具包。 它是 Python 编程语言和 Qt 库的成功融合。 Qt 库是目前最强大的库之 一。 PyQt 是由 Phil Thompson 开发。 PyQt 实现了一个 Python 模块集。 它有超过 300 类,将近 6000 个函数和方法。 它是一个多平台的工具包,可以运行在所有主要操作系统上,包括 UNIX, Windows 和 Mac。 PyQt 采用双许可证,开发人员可以选择 GPL 和商业许可。 在此之前, GPL 的版本只能用在 Unix上,从 PyQt 的版本 4 开始, GPL 许可证可用于所有支持的平台。 SQLite 数据库简介 SQLite,是一款轻型的数据库,是遵守 ACID 的关系型 数据库管理系统 ,它的设计目标是嵌入式的,而且 目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百 K 的内存就够了。 它能够支 持Windows/Linux/Unix 等等主流的操作系统,同时能够跟很多程序语言相结合,比如 沈阳航空航天大学毕业设计(论文) 14 Python、 C、 PHP、 Java 等,还有 ODBC 接口,同样比起 Mysql、 PostgreSQL 这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。 SQLite第一个 Alpha版本诞生于 2020 年 5 月。 至今已经有 14 个年头, SQLite 也迎来了一个。c语言源代码静态检测工具设计与实现毕业论文
相关推荐
做黑盒,从外部执行者的角度来理解系统。 图 DVD 租赁管理系统的用例图 影碟管理 用户管理 管理员 登录、注册、注销 用户信息更新 影碟租赁 查看历史记录 用户 管 理 员 用 户 D V D 管 理 系 统 登录 添加影碟 编辑影碟信息 删除影碟 删除用户 注册 登录 编辑用户 租赁影碟 查 看记录 注销登陆 四川师范大学 成都学院本 科毕业 设计 10
,建立技术先进、实用性强、可靠性高、可持续发展的防汛抗旱计算机业务综合平台,为 XXXX 水利业务信息化提供一个现代化的综合服务平台。 性能要求 ( 1) 可靠性 各系统可靠性设计要确保系统能不间断运行,保证系统在任何情况下能够实时采集信息,并将信息数据及时传输至中心。 ( 2) 安全性 保证系统硬件安全运行环境,如设备的不间断电源,设备的接地系统,设备的防雷措施
tf(系统最大有效用户约为 1180 个 \n)。 if(aamp。 a=) printf(系统最大有效用户约为 786 个 \n)。 if(aamp。 a=) printf(系统最大有效用户约为 590 个 \n)。 if(aamp。 a=1) printf(系统最大有效用户约为 590 个 \n)。 printf(请酌情选择有效用户 \n)。 } else if(Bamp。 B=) {
( 2) 指令所涉及的 微操作控制信号 clk 时钟输入 rst 复位输入 RWR 寄存器 (R0..R3)写允许 ( 3) 系统实现 LIBRARY IEEE。 USE。 USE。 ENTITY CPU2020 IS GENERIC( ALL_ZERO:STD_LOGIC_VECTOR(7 DOWNTO 0) := 00000000。 INT_ENTER: STD_LOGIC_VECTOR(7