239-12
- pip安装flawfinder
- github上面找了一个C++写的终端版俄罗斯方块小游戏tinytetris,用的注释版源码
- 用flawfinder命令检测该项目,并将检测结果输出到一个html文件
结果:
- srand函数的随机性不足(CWE-327):
- 使用
srand函数来初始化随机数生成器。这个函数的随机性不足以用于安全相关的功能,比如密钥和一次性数字的生成。建议使用更安全的随机值获取技术,比如C++11中的<random>库。
- 使用
- memcpy函数的缓冲区溢出(CWE-120):
- 使用
memcpy函数复制数据时没有检查目标缓冲区是否溢出。这意味着如果源数据大于目标缓冲区的大小,可能会导致缓冲区溢出,这是一个常见的安全漏洞。建议确保目标缓冲区总是能够容纳源数据。
- 使用
- usleep函数的过时性(CWE-676):
- 使用了
usleep函数来暂停程序执行。这个函数被认为是过时的,并且其与SIGALRM信号和其他计时函数(如sleep()、alarm()、setitimer()和nanosleep())的交互是未定义的。建议使用nanosleep(2)或setitimer(2)代替。
- 使用了
flawfinder与其他代码分析工具的比较
- Cppcheck:
- 支持C和C++代码的静态分析。
- 能够检测除编译器会检测到的错误外的其他类型错误,假阳性率较低。
- 专注于检测越界错误、内存泄露、语法错误等问题。
- Splint:
- 一个针对C语言的静态分析工具不支持C++。
- 以注释为依据进行分析,可以检测出多种编程错误。
- 对于代码风格和潜在的运行时错误有较好的检测能力。
- TscanCode:
- 支持C、C++、C#和Lua代码的静态分析。
- 提供开源版本,支持Windows、Linux和Mac OS平台。
- 提示信息与Cppcheck相似,但给出的提示数量较少。
- 检测能力:Cppcheck > TscanCode > Flawfinder
- 友好度:TscanCode > Cppcheck > Flawfinder
- 易用性:TscanCode > Cppcheck > Flawfinder
即 在检测能力、友好度和易用性上,flawfinder仍有改进的空间。且其仅仅支持c/c++的代码检测,语言的种类多样性上仍有提升空间。
239-15
WSL Ubuntu上下载AFL
Ubuntu用nano创建测试代码:
- c
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <signal.h> int vuln(char *str) { int len = strlen(str); if (str[0] == 'A' && len == 66) { // 如果输入的字符串的首字符为A并且长度为66,则异常退出 raise(SIGSEGV); } else if (str[0] == 'F' && len == 6) { // 如果输入的字符串的首字符为F并且长度为6,则异常退出 raise(SIGSEGV); } else { printf("it is good!\n"); } return 0; } int main(int argc, char *argv[]) { char buf[100] = {0}; gets(buf); // 存在栈溢出漏洞。如果输入过长,则会导致栈溢出 printf(buf); // 存在格式化字符串漏洞.没有指定格式字符串,如果buf包含格式化指令,则会导致未定义行为 vuln(buf); return 0; }
流程概述:
- 首先是用afl-gcc编译源代码,然后以文件(最好小于1K)为输入.
- 然后启动afl-fuzz程序,进行模糊测试,将testcase(输入的测试文件)作为程序的输入执行程序,afl会在这个testcase的基础上进行自动变异输入,使得程序产生crash,产生了crash就会被记录起来。
- 模糊测试完成之后产生了4个crashes
- 用xxd工具分析:
Fsdfs.这种情况符合我们在vuln中规定的:如果输入的字符串的首字符为F并且长度为6,则异常退出。sidfsudfhsdhfo.....这种情况的输入数据长度为100多字节,超出了buf的长度从而导致了栈溢出错误。Sisdh%SIUhh这种情况的输入中包含%S这一printf输入控制符,导致了printf的错误,存在格式化字符串漏洞。Assdsf.......这种情况符合我们在vuln中规定的:如果输入的字符串的首字符为A并且长度为66,则异常退出。
结果:AFL的模糊测试基本找出了我们给定代码中的一些漏洞。
