目 录
第 1章 代码检测和工具1
1.1 背景1
1.2 代码审计1
1.2.1 代码审计的思路2
1.2.2 代码审计的步骤2
1.2.3 安全审计的标准3
1.2.4 代码审计中的常见概念5
1.3 代码检测工具5
1.3.1 代码检测工具的原理6
1.3.2 代码检测技术7
1.3.3 代码检测的主要方法9
1.3.4 代码检测工具的主要功能14
1.3.5 常见的代码检测工具14
1.3.6 代码检测工具的评价基准16
1.4 软件成分分析工具19
1.4.1 软件成分分析工具的
原理20
1.4.2 软件成分分析工具使用的
关键技术21
1.4.3 SCA工具技术指标27
1.5 如何成为一名代码安全检测
工程师27
1.6 代码安全审计 检测练习靶场28
第 2章 C语言安全标准(一)30
2.1 C语言安全标准产生的背景30
2.2 如何理解和使用GJB 8114标准30
2.3 C和C++的共用规则31
2.3.1 声明定义规则31
2.3.2 版面书写规则57
2.3.3 指针使用规则63
2.3.4 分支控制规则77
2.3.5 跳转控制规则91
2.3.6 运算处理93
2.3.7 函数调用113
第3章 C语言安全标准(二)127
3.1 关于语句使用的规则127
3.1.1 关于循环控制的规则131
3.1.2 关于类型转换的规则135
3.1.3 关于初始化的规则141
3.1.4 关于比较判断的规则146
3.1.5 关于变量使用的规则152
3.2 C++的专用规则162
3.2.1 关于类与对象的强制规则162
3.2.2 关于构造函数的强制规则169
3.2.3 关于虚函数的强制规则173
3.2.4 关于类型转换的强制规则176
3.2.5 关于内存释放的强制规则177
第4章 C C++语言源代码漏洞测试
规范180
4.1 不可控的内存分配180
4.2 路径错误181
4.3 数据处理182
4.3.1 相对路径遍历182
4.3.2 绝对路径遍历184
4.3.3 命令行注入185
4.3.4 SQL注入186
4.3.5 进程控制188
4.3.6 缓冲区溢出189
4.3.7 使用外部控制的格式化
字符串189
4.3.8 整数溢出190
4.3.9 信息通过错误消息泄露191
4.3.10 信息通过服务器日志文件
泄露192
4.3.11 信息通过调试日志文件
泄露193
4.3.12 以未检查的输入作为
循环条件193
4.4 错误的API实现194
4.5 劣质代码195
4.6 不充分的封装196
4.7 安全功能197
4.7.1 明文存储密码197
4.7.2 存储可恢复的密码197
4.7.3 密码硬编码198
4.7.4 明文传输敏感信息199
4.7.5 使用已破解或危险的
加密算法199
4.7.6 可逆的哈希算法200
4.7.7 密码分组链接模式未使用
随机初始化向量201
4.7.8 不充分的随机数202
4.7.9 安全关键的行为依赖反向
域名解析203
4.7.10 没有要求使用强密码204
4.7.11 没有对密码域进行掩饰205
4.7.12 通过用户控制的SQL关键字
绕过授权206
4.7.13 未使用盐值计算哈希值207
4.7.14 RSA算法未使用最优
非对称加密填充208
4.8 Web问题209
第5章 常见运行时缺陷211
5.1 缓冲区溢出211
5.1.1 缓冲区溢出的原理211
5.1.2 防范缓冲区溢出216
5.1.3 栈缓冲区溢出216
5.1.4 缓冲区溢出案例217
5.2 内存泄漏223
5.2.1 内存泄漏的原理223
5.2.2 内存泄漏案例224
5.3 代码不可达235
5.4 整数溢出或环绕236
5.5 资源泄露237
5.6 线程死锁238
5.6.1 加锁后未判断是否成功238
5.6.2 线程死锁239
5.6.3 加锁后未解锁240
5.7 无限循环240
5.7.1 可能不变的循环因子240
5.7.2 循环跳出条件无法满足241
5.7.3 函数循环调用241
5.7.4 控制表达式有逻辑错误241
5.7.5 以外部输入作为循环
跳出条件242
展开