软件安全实验一——实验报告
实验要求
- 使用Flawfinder(http://www.dwheeler.com/flawfinder)工具,对C/C++实现的软件进行静态分析。
- 搜集并了解其他的C/C++代码分析工具,如RATS、Splint等,比较这些工具的功能。
实验步骤
从Github上下载
jsoncpp
的源码(https://github.com/open-source-parsers/jsoncpp)作为实验对象,其中`jsoncpp` 是一个常用的 C++ 库,用于解析、生成和操作 JSON 数据,在Github上该库拥有8.2k stars和2.6k forks。使用pip下载安装flawfinder。
1
pip install flawfinder
使用flawfinder对
jsoncpp
的源码进行静态分析。1
flawfinder jsoncpp-master
实验结果截图
分析总结
Hits = 74
发现的潜在问题总数为 74 个(即代码中有 74 个位置可能存在安全隐患)。Lines analyzed = 12575
分析的代码行总数为 12,575 行(包括注释、空行和实际代码),分析花费的时间为0.30秒。Physical Source Lines of Code (SLOC) = 9707
物理代码行数(不包括注释和空白行)为 9,707 行,表示实际有效的代码内容。Hits@level
这是根据问题的风险级别对 Hits 的分类:
- [0] 25:25 个潜在问题的风险级别为 0(最低风险)。
- [1] 60:60 个潜在问题的风险级别为 1(低风险)。
- [2] 10:10 个潜在问题的风险级别为 2(中等风险)。
- [3] 0:0 个潜在问题的风险级别为 3(高风险)。
- [4] 4:4 个潜在问题的风险级别为 4(较高风险)。
- [5] 0:0 个潜在问题的风险级别为 5(最高风险,通常会造成严重安全漏洞)。
Hits/KSLOC@level+
表示每千行代码(KLOC)对应的风险问题数:
- [0+] 10.1988:每千行代码的风险级别为 0 及以上的问题数约为 10.20。
- [1+] 7.62336:每千行代码的风险级别为 1 及以上的问题数约为 7.62。
- [2+] 1.44226:每千行代码的风险级别为 2 及以上的问题数约为 1.44。
- [3+] 0.412074:每千行代码的风险级别为 3 及以上的问题数约为 0.41。
- [4+] 0.412074:每千行代码的风险级别为 4 及以上的问题数约为 0.41。
- [5+] 0:每千行代码的风险级别为 5 的问题数为 0。
flawfinder还给出了所有风险级别 1 及以上的所有问题,例如:
这一段显示了在代码的
./inclue\json\config.h:65
中,存在一个关于snprintf
的问题——如果格式字符串可以被攻击者影响,则可能被利用;此外,sprintf 的变体不总是以”\0”结尾(此外还给出了该漏洞属于CWE-134)。并给出了建议——应使用常量作为格式说明符。总结之后可归纳出在代码中存在的所有问题类型和出现次数为以下:
(format) snprintf (等级4),共1次
问题描述:如果格式字符串可以被攻击者影响,则可能被利用;此外,
sprintf
的变体不总是以\0
结尾(CWE-134)。应使用常量作为格式说明符。(buffer) sscanf (等级4),共3次
问题描述:
scanf
系列的%s
操作如果没有指定限制,可能导致缓冲区溢出(CWE-120, CWE-20)。应为%s
指定限制,或使用其他输入函数。(misc)open、 fopen(等级2),共4次
问题描述:打开文件时应检查,是否可能被攻击者重定向(通过符号链接),强制打开特殊文件类型(例如设备文件),通过更改文件位置制造竞争条件,控制其父目录,或更改其内容(CWE-362)。
(buffer) char (等级2),共4次
问题描述:静态大小的数组可能由于限制不当而导致潜在的溢出或其他问题(CWE-119!/CWE-120)。应进行边界检查,使用限制长度的函数,或确保数组大小足够容纳可能的最大长度。
(buffer) memcpy (等级2),共2次
问题描述:在向目标复制数据时不检查缓冲区溢出(CWE-120)。应确保目标始终能容纳源数据。
(buffer) strlen (等级1),共60次
问题描述:
strlen
无法处理非\0
结尾的字符串;如果传入这样的字符串,可能会导致过度读取(CWE-126)。在未保护的情况下可能会导致崩溃。
与其他工具对比
Flawfinder
Flawfinder 是一款专注于 C/C++ 代码的静态分析工具,用于快速检测代码中的潜在安全问题,尤其是危险函数和常见漏洞(如缓冲区溢出)。它基于一组已知的不安全函数规则库(例如
strcpy
等)进行扫描,并为每个问题分配安全风险等级。Flawfinder 优势在于易用性高,能够快速分析小型和中型项目,但它的规则覆盖范围有限,对现代 C++ 特性支持较差,且容易出现误报,特别是当代码上下文未被充分理解时。RATS
RATS(Rough Auditing Tool for Security)是一款多语言静态分析工具,支持 C/C++、Perl、Python 和 PHP 等语言,主要通过检测已知危险函数来发现代码中的安全漏洞。与 Flawfinder 类似,RATS 的规则库也偏向基础安全问题,但其多语言支持使其在跨语言项目中具有优势。RATS 操作简单,但其检测能力受限于规则的覆盖范围,对于复杂或现代化的编程场景,效果不够理想,且误报率较高。
Splint
Splint 专注于 C 代码的静态分析,主要用于类型安全、内存管理和逻辑错误的检查。与 Flawfinder 和 RATS 不同,Splint 偏向于细致的代码质量分析而非单纯的安全漏洞检测。开发者可以通过代码注释自定义检查规则,从而增强分析深度。Splint 的特点是可以深入挖掘隐式行为和潜在问题,但它的配置较复杂,对开发者的使用门槛较高。此外,Splint 不支持现代 C++ 特性,更适用于传统的 C 项目。