c语言代码审计和安全漏洞检查主要容易出现在接口和输入输出位置上。
c language code review note
1 参数和指令检查
command: argc argv
注意此处为用户外部输入接口,argc和argv两个参数必须严格判断,数据类型,指令
格式长度均作安全校验校测。常见的最容易出漏洞的argv[1]参数指针引用。缓冲区溢出,
整数溢出,越界等漏洞。
environmental var: getenv
环境变量获取和数据检测。此处出现漏洞的原因在于该函数在获取环境变量数值时候。
并不作任何校验或者判断,直到字符串结尾。
至少先得加个
string strenv ="";
strenv = getenv( "tmp_dir");
if( ( NULL == strenv ) || ( 0 == strlen(strenv ) ) )
{
//error
}
2 输入输出检查
input/output:read() fscanf() getc() fgetc() fgets() vfscanf()
keyboard input: read() scanf() getchar() gets()
network data: read(),recv(),recvfrom()
同类函数比较多,举个例子。gets函数
永远不要使用 gets()。该函数从标准输入读入用户输入的一行文本,
它在遇到 EOF 字符或换行字符之前,不会停止读入文本。也就是:gets()
根本不执行边界检查。因此,使用 gets() 总是有可能使任何缓冲区溢出。
3 字符串函数安全检查
string function
strcpy(),strcat()
strcpy()函数将源字符串复制到缓冲区。没有指定要复制字符的具体数目!
如果源字符串碰巧来自用户输入,且没有专门限制其大小,则有可能会造成缓冲。
当然如果不是用户输入,只是程序本身的自己的内部数据,如果不计算,判断,可能
会引起数据错误或者指针异常。
4 指针越界检查
poniter/array outbound
此处的指针和数组也是经常出现的问题,设计者不注意边界或者测试人员并不能完全
测试所有可能和数据类型大小,也会出现野指针或者越界访问数据,这样是很危险的。
5 函数返回值检查
check all function return value
// malloc() calloc() realloc() new()
这几个主要是内存分配函数,管理着程序的堆地址空间。
不合理的使用或者释放也会产生问题,比如堆缓冲区溢出,
UAF释放重用漏洞。
6 用户数据长度检查
check all the data lengh of the user
数据长度校验,也很重要,有时候把握不严格,
引入程序进入非常逻辑分支。比如整数溢出,
无符号和有符号之间的转换,导致了数据截断或者大小变化。
这些都会出现潜在漏洞和危害。
7 数据格式检查
check all the data format
数据格式问题也得注意。比如我们自己处理定义的结构体。
如果数据类型和格式变化,在内存中进行错误的解析了,
有可能出现数据当做代码或者指令执行的情况。
8 总结
总的来说,就是大家编写代码或者审计代码的时候,要特别注意以下常见的问题。
方可减少我们c语言程序中可能存在的危害和漏洞。
1 检查指针是否为空。
2 检查字符串是否正常结束。
3 检查数组大小,内存空间,越界等行为。
4 文件的读取写入数据格式,大小,缓存。
5 关键系统命令函数指令解析。