《软件安全》上机实验一
第一次上机作业:课本239页第12题
一、实验内容:
C/C++代码静态分析。实验内容如下。 1)使用Flawfinder(http://www.dwheeler.com/flawfinder)工具,对C/C++实现的软件进行静态分析。 2)搜集并了解其他的C/C++代码分析工具,如RATS、Splint等,比较这些工具的 功能。 完成实验报告。
二、实验环境
- 操作系统:Linux
- 分析工具版本:Flawfinder 2.0.19
- 编程语言:C
- 编译器:GCC
三、实验原理
静态代码分析:在不实际执行程序的情况下,对源代码进行检查和分析的技术。它能够在软件开发的早期阶段识别潜在错误和安全漏洞。
Flawfinder工作原理:Flawfinder通过扫描源代码,匹配其内置的已知危险函数(如strcpy、gets)和代码模式的数据库来工作。它会报告潜在漏洞的位置、风险等级和安全建议。
三、实验步骤
3.1配置环境
1.创建虚拟环境(可选) 创建虚拟环境只是为了将实验环境与本地环境隔离开,毕竟上机实验的项目完事儿之后就删了。
1
2
3
4
#创建python虚拟环境
python3 -m venv .venv
#启动虚拟环境
source ./.venv/bin/activate
2.安装flawfinder包
1
2
#直接使用pip安装flawfinder包
pip install flawfinder
3.检查flawfinder版本
1
2
#直接使用pip安装flawfinder包
flawfinder --version
flawfinder基本命令格式:
1
2
3
4
# 扫描C/C++文件或者项目
flawfinder [options] [source_code_files_or_directories]
# 扫描当前路径下的所有C/C++文件
flawfinder .
3.2简单测试
使用简单测试文件测试flawfinder的基本功能
1.测试代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <string.h>
void greet(char *name) {
char buffer[20];
strcpy(buffer, name);
printf("Hello, %s!\n", buffer);
}
int main() {
char name[100];
printf("Enter your name: ");
scanf("%s", name);
greet(name);
return 0;
}
2.测试结果
3.测试结果分析
Flawfinder的报告总共指出了4个潜在问题(Hits),包括2个高风险漏洞和2个中风险警告。
- 高风险漏洞1:
strcpy缓冲区溢出(第6行)- 风险等级:[4]
- 问题:
strcpy函数在复制字符串时,不检查目标缓冲区buffer的大小(20字节),当输入字符串过长时,会导致数据溢出,覆盖相邻的内存。 - 危害:这是典型且危险的缓冲区溢出漏洞,攻击者可利用它覆盖函数返回地址,从而执行任意恶意代码。
- 程序给出的修复建议:Consider using snprintf, strcpy_s, or strlcpy (warning: strncpy easily misused)
- 高风险漏洞2:
scanf缓冲区溢出(第13行)- 风险等级:[4]
- 问题:
scanf的%s格式符会读取输入直到遇到空白字符,它同样不限制读取的长度。当输入一个超过name缓冲区容量的字符串时,就会导致溢出。 - 危害:与
strcpy类似,这也是一个缓冲区溢出漏洞,可能导致程序崩溃或被攻击者利用。 - 程序给出的修复建议:Specify a limit to %s, or use a different input function.
- 中风险警告:使用固定大小的静态缓冲区(第5行和第11行)
- 风险等级:[2]
- 问题:Flawfinder对
char buffer[20];和char name[100];这两行代码提出了警告。这本身不是一个直接的漏洞,而是对一种“危险实践”的提醒。使用固定大小的缓冲区是许多溢出漏洞的根源。 - 说明:这个警告指出了上述两个高风险漏洞的根本原因。它提醒开发者,只要使用了固定大小的缓冲区,就必须对所有相关的内存操作(如复制、读取)进行严格的边界检查。
- 程序给出的修复建议:Perform bounds checking, use functions that limit length, or ensure that the size is larger than the maximum possible length.
3.3中小型软件项目测试
1.项目简介:本次测试采用json-c项目,它是一个广泛使用的C语言库,用于解析和生成JSON数据。
2.测试结果
3.结果分析
flawfinder对json-c项目进行了全面扫描,共报告了130个风险等级大于等于1的潜在问题 (Hits)。风险分布如下:
- 高风险 (Level 4): 19个
- 中等风险 (Level 2-3): 89个
- 低风险 (Level 1): 22个
经过大模型辅助筛查,上述所有文件和对应行号有些位置实际上并不存在相应的风险,这是静态分析工具中非常典型的误报(False Positive,FP),静态分析虽然能在不运行代码的前提下发现一些潜在的问题,但其极高的误报率也是目前传统静态分析工具亟待解决的问题。



