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 关键系统命令函数指令解析。