作者:empty 出版社:empty |
0前言目的本规范旨在加强编程人员在编程过程中的安全意识,建立编程人员的攻击者思维,养成安全编码的习惯,编写出安全可靠的代码,适用范围C/C++语言编程人员都应遵循本规范所规定的内容.攻击者思维编程过程中应该时刻保持以下的假设:1.程序所处理的所有外部数据都是不可信的攻击数据2.攻击者时刻试图监听、篡改、破坏程序运行环境、外部数据安全编码基本思想基于以上的假设,得出安全编码基本思想:1.程序在处理外部数据时必须经过严格的合法性校验编程人员在处理外部数据过程中必须时刻保持这种思维意识,不能做出任何外部数据符合预期的假设,外部数据必须经过严格判断后才能使用,编码人员必须在这种严酷的攻击环境下通过遵守这一原则保证程序的执行过程符合预期结果,2.尽量减少代码的攻击面代码的实现应该尽量简单,避免与外部环境做多余的数据交互,过多的攻击面增加了被攻击的率,尽量避免将程序内部的数据处理过程暴露到外部环境,3.通过防御性的编码策略来弥补潜在的编码人员的疏忽粗心是人类的天性。由于外部环境的不确定性,以及编码人员的经验、习惯的差异,代码的执行过程很难达到完全符合预期设想的情况.因此在编码过程中必须采取防御性的策略,尽量缓解由于编码人员疏忽导致的缺陷,这些措施包括:
规则1.1.1:指针变量、表示资源描述符的变量, BOOL变量声明必须赋予初值
规则1.1.2:指向资源甸柄或描述符的变量,在资源放后立即熨予新值
规刚1.1.3类的成员变量必须在构造函数中壁予初值
规则1.1.4:严禁对指针变量进行sizeof操作
建议1.1.1:尽量使用const
建议1.1.2:全局变量的访问如果涉及多个线程,必须加锁
建议1.13:同一个函数内,局部变量所占用的空间不要过大
1.2断言(AS SERI)
规则1.2.1:断言必须使用宏定义, 禁止直接调用assert函数
规则1.2.2;运行时可能会导致的蜡课,严禁使用断言
规则1.2.3严慧在断吉内改变运行环境
建议1.2.1:不要将多条语包放在同一个断言中
13函数
规则1.3.1数组作为函数参数时,必须同时将其长度作为函数的参数
规则1.3.2:严禁对公共接API函数的参数进行ASSERT操作
规则1.3.3:不对内容进行修改的指针型参数, 定义为const
建议1.3.1谨值使用不可重入函数
建议1.3.2:字答串或指针作为函数参数时, 请检查参数是否为NULL
建议1.3.3:在函数的开始处对参数进行ASSERT操作(API除外)
14循环
规则1.4.1:循环必须有退出条件
1.5异常机制
规则1.5.1:禁用C++异常机制
1.6类
规则1.6.1:如果有构造函数,则必须有析构函数
规则1.5.2构造函数内不能做任何有可能失败的操作
规则1.6.3:严禁在构造函数中速线程
规刚1.5.4:严禁出现delete this操作
规则1.6.5:如果类的公共接中返回类的私有数据地址, 则必须加const类型
建议1.6.1:尽量避免定义public成员
1.7安全退出
规则1.7.1:禁用atexit函数
规别1.7.2严禁调用kill.Terminate Process函终止其他进程
规则1.7.3:禁用pthread exit.Exit Thread函数
建议1.7.1:禁用exit.ExitProcess函数(main函数除外)
建议1.7.2:禁用abort函数
2字符串教组操作
规则2.1保有足够的存储空间
规则2.2对字符串进行存储操作,确保字符串有10结束符
规则2.3外部数据作为数组素引时必须通保在数组大小范围内
规则2.4外部输入作为内在操作相关函数的复制长度时,需要校验其合法性
规则2.5调用格式化函数时, 禁止format参数由外部可控
规则2.6调用格式化函数时, format中参数的类型与个数必须与实际参数类型一致
3正确使用安全函数
规则3.1正确设置安全函数中的dest Max参数
规则3.2禁止不正确地重定义或封装安全函数
规则3.3:禁止用宏重命名安全函数
规则3.4禁止自定义安全函数
规则3.5必须检查安全函数返问值,并进行正确的处理
4整数
规则4.1整数之间运算时必须严格检查,确保不会出现溢出,反转、除
规则4.2整型表达式比较值为一种更大类型之的必须用这种更大类对它进行求值
规则4.3:禁止对有符号整数进行位操作符运算
规则4.4禁止整数与指钍间的互相转化
规则4.5禁止对指钍进行逻辑或位运算(&&LL22、.&.^_L)
规则4.6循环次数如果受外部数据控制,需要校验其合法性
5内存
规则5.1内存电请前,必须对电请内存大小进行合法性校验
规则5.2:内存分配后必须光浙是否成功
规则5.3禁止引用未初始化的内存
规则5.4:内存释放之后立即瑟予新值
规刚5.5整止使用realloc 0函数
规则5.6禁止使用alloca 0函数申请伐上内在
6不安全函数
规则6.1禁止处部回控数据作为system.popen、Win Exec.ShellExecute, eze ci.execlp.exec le.exec y,
execp、CreateProcess等进程启动函数的参数
规则6.2:禁止外部可控数据作为dlopenLoadLibrary等模块加载函数的参数
规则6.3禁止使用外部数据拼接SQL命令
规则6.4禁止在信号处理例程中用非异步安全函数
规则6.5禁用setjmplong imp
规则6.5禁止使用内存操作类危险函数
7文件输入输出
规则7.1创建文件时必须显式指定合适的文件访回权限
规则7.2:必须对文件路径进行规范化后进行使用
规则7.3不要在共享且录中创建临时文性
建议7.1在进行文件操作时避免引起竞争条件
8敏质信息处理
规则8.1禁用rand函数产生用于安全用途的伪随机数
规则8.2:内存中的敏感信息使用完毕后立即清0
规则8.严禁使用string类存储敏感信息
附录A SQL注入相关的特殊字符
附录B合令注入相关的