1 C/C++使用错误
不可以用没有长度限制的字符来拷贝函数
不可以用legacy的字符串拷贝、输入函数,这些函数的特征是:可以输出一长串字符串,而不限制长度。如果环境允许,应当使用其_s安全版本替代,或者使用n版本函数。
如果说使用形如sscanf之类的函数时,在处理字符串输入时应当通过%10s这样的方式来严格限制字符串长度,同时确保字符串末尾有\0。如果环境允许,应当使用_s安全版本。
因此,在使用n系列拷贝函数时,要确保正确计算缓冲区长度,同时,如果你不确定是否代码在各个编译器下都能确保末尾有0时,可以适当增加1字节输入缓冲区,并将其置为\0,以保证输出的字符串结尾一定有\0。
创建进程类的函数的安全规范
system、WinExec、CreateProcess、ShellExecute等启动进程类的函数,需要严格检查其参数。
另外,如果启动时从用户输入、环境变量读取组合命令行时,还需要注意是否可能存在命令注入。
比如,当用户输入1+1 && ls时,执行的实际上是calc 1+1和ls 两个命令,导致命令注入。
需要检查用户输入是否含有非法数据。
尽量减少使用 _alloca 和可变长度数组
_alloca 和可变长度数组使用的内存量在编译期间不可知。尤其是在循环中使用时,根据编译器的实现不同,可能会导致:(1)栈溢出,即拒绝服务; (2)缺少栈内存测试的编译器实现可能导致申请到非栈内存,并导致内存损坏。这在栈比较小的程序上,例如IoT设备固件上影响尤为大。对于 C++,可变长度数组也属于非标准扩展,在代码规范中禁止使用。
printf系列参数必须对应
所有printf系列函数,如sprintf,snprintf,vprintf等必须对应控制符号和参数。
防止泄露指针(包括%p)的值
所有printf系列函数,要防止格式化完的字符串泄露程序布局信息。例如,如果将带有%p的字符串泄露给程序,则可能会破坏ASLR的防护效果。使得攻击者更容易攻破程序。
%p的值只应当在程序内使用,而不应当输出到外部或被外部以某种方式获取。
不应当把用户可修改的字符串作为printf系列函数的“format”参数
如果用户可以控制字符串,则通过 %n %p 等内容,在的最坏情况下可以直接执行任意恶意代码。
在以下情况尤其需要注意: WIFI名,设备名