安全编码原则 ?? ?了解验证输入、避免缓冲区溢出、程序内部安全、安全调用组件、禁用有风险的函数等通用安全编程准则 ?? ?了解相关的安全编码标准及建议 ?? ?理解常见的代码安全问题及处置方式 代码安全编译 ?? ?了解代码编译需要关注的安全因素 代码安全审核 ?? ?理解代码审查的目的 ?? ?了解常见源代码静态分析工具及方法
对所有输入数据进行检查、验证及过滤 ?? ?应用软件的“数据防火墙”避免恶意数据进入 什么时候验证 ?? ?最初接收数据时 ?? ?(第一次)使用数据时
命令行 ?? ?参数数量、数据格式、内容 环境变量 ?? ?环境变量可能会超出预期 ?? ?有的环境变量存储格式存在危险 文件 ?? ?不信任可以被不可信用户控制的文件内容 ?? ?不信任临时文件 网络 ?? ?来自网络的数据是“高度不可信的” 其他来源
缓冲区溢出 ?? ?缓冲区:包含相同数据类型的实例的一个连续计算机内存块 ?? ?溢出:数据被添加到分配给该缓冲区的内存块之外 外部数据比目标空间大 是一个非常普遍而且严重的问题
溢出后果 ?? ?攻击者可以使远程服务程序或者本地程序奔溃 ?? ?攻击者可以设计溢出后执行的代码 C/C++语言 ?? ?语言特性决定 ?? ?大量的库函数存在溢出 ?? ??? ?strcpy、strcat、gets等 其他语言 ?? ?调用C语言库 ?? ?C#允许设置“不安全”历程
解决方法 ?? ?填充数据时计算边界 ?? ??? ?动态分配内存 ?? ??? ?控制输入 ?? ?使用没有缓冲区溢出问题的函数 ?? ??? ?strncpy、strncat、C++中std:string ?? ?使用代替库 ?? ??? ?libmib、libsafe ?? ?基于探测方法的防御 ?? ??? ?stackguard、propolice ?? ??? ?将一个“探测”值插入到返回地址的前面 ?? ?非执行的堆栈防御 ?? ??? ?不可在堆栈上执行代码
程序内部接口安全 ?? ?程序内部接口数据的检查 异常的安全处理 ?? ?检测异常,安全处理各种可能运行路径 ?? ?检测到某些错误行为/数据,必须以合适的方式处理,保证程序运行安全 ?? ?必要时立即拒绝服务,甚至不回送详细的错误代码
最小化反馈 ?? ?避免给予不可靠用户过多的信息 ?? ??? ?成功或失败 ?? ??? ?作为跟踪检查的日志可以记录较为详细的信息 ?? ?认证程序在认证前尽量少给信息 ?? ?如果程序接受了密码,不要返回它 避免竞争条件 ?? ?访问共享资源时(文件/变量)没有被适当地控制 ?? ?使用原子操作 ?? ?使用锁操作一一避免死锁 安全使用临时文件
应用程序实际上几乎都不会是自包含的,它们通常都会调用其他组件 ?? ?底层的操作系统 ?? ?数据库 ?? ?可重用的库 ?? ?网络服务
使用安全组件,并且只采用安全的方式 ?? ?检查组文档,搜索相关说明 ?? ??? ?gets ?? ??? ?随机数 ?? ?使用经过认可的组件 ?? ?尽可能不调用外部命令,如果不得已要调用,必须严格检查参数 ?? ??? ?system、open、exec
正确处理返回值 ?? ?一定要检查返回值,调用是否成功 ?? ?成功时检查 ?? ??? ?返回值,是否按照期望值处理 ?? ??? ?数据中可能含有nul字符、无效字符或其他可能产生问题的东西 ?? ?错误时检查 ?? ??? ?错误码 保护应用程序和组件之间传递的数据 ?? ?视安全需求和安全环境 ?? ??? ?考虑传输加密,包括密码算法和安全协议
确保编译环境的安全 ?? ?使用最新版本编译器与支持工具 ?? ?可靠的编译工具 ?? ?使用编译器内置防御特性 确保运行环境的安全 ?? ?将软件运行环境基于较新版本的系统
什么是源代码审核 ?? ?通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性,报告源代码中可能隐藏的错误和缺陷 源代码审核方式 ?? ?人工审核 ?? ??? ?费时费力 ?? ??? ?容易遗漏 ?? ?工具审核 ?? ??? ?速度快,自动 ?? ??? ?可升级知识库 (统计证明,在整个软件开发生命周期中,30%至70%的代码逻辑设计和编码缺陷是可以通过源代码审核来发现的)
软件测试 ?? ?了解软件测试的基本概念 ?? ?了解常见的软件测试方法及不同测试方法之间的区别和优缺点 软件安全测试 ?? ?了解软件安全测试的基本概念 ?? ?理解模糊测试、渗透测试等软件安全测试方法的原理、相互的区别以及各自的优势 ?? ?掌握安全测试的思路和方法
什么是软件测试 ?? ?使用人工和自动化的手段来运行或测试某个系统的过程,其目的在于检测它是否满足规定的需求或是弄清预期结果与实际结果之间的差异 基本概念 ?? ?测试用例 ?? ?测试覆盖率度量指标
测试的信条 ?? ?预期测试的测试结果是预先确定的 ?? ?好的测试用例发现错误的概率高 ?? ?成功的测试就是发现了错误的测试 ?? ?测试独立于编码 ?? ?需要具备应用(用户)及软件(编程)两方面的专业知识 ?? ?测试人员使用不同于开发人员的工具 ?? ?只检查常见的测试用例是不够的 ?? ?测试文档要能够再利用
单元测试、集成测试、系统测试 黑盒测试、白盒测试、灰盒测试 静态测试、动态测试 ?? ?代码走查、代码审计、代码评审 回归测试 验收测试
什么是软件安全测试 ?? ?确定软件的安全特性实现是否与预期设计一致的过程 ?? ?有关验证软件安全等级和识别潜在安全缺陷的过程 ?? ?查找软件自身程序设计中存在的安全隐患,并检查应用程序对非法侵入的防范能力 为什么需要软件安全测试 ?? ?传统测试仅考虑软件出错时的处理,没有考虑对软件的故意攻击
在应用投产前,应由独立的安全团队对应用的安全性进行综合评估 ?? ?功能性安全测试 ?? ?对抗性安全测试 安全测试方法 ?? ?模糊测试 ?? ?渗透测试 ?? ?静态源代码审核
什么是模糊测试 ?? ?也称fuzzing测试,一种通过提供非预期的输入并监视异常结果来发现软件故障的方法 ?? ?黑盒测试,不关心被测试目标的内部实现,而是利用构造畸形的输入数据引发被测试目标产生异常,从而发现相应的安全漏洞 (非常有效的漏洞挖掘技术,已知漏洞大部分都是通过这种技术发现的)
强制软件程序使用恶意/破坏性的数据并进行观察结果的一种测试方式 ?? ?不够强壮的程序会崩溃 ?? ?编码良好的程序正常运行 特征 ?? ?方法学 ?? ?随机值 ?? ?大量测试用例 ?? ?查找漏洞或可靠性错误
模糊测试过程 ?? ?生成大量的畸形数据作为测试用例 ?? ?将这些测试用例作为输入应用于被测对象 ?? ?监测和记录由输入导致的任何崩溃或异常现象 ?? ?查看测试日志,深入分析产生崩溃或异常的原因
测试点 ?? ?数据通道入口、可信边界点 样本选择 ?? ?选择覆盖面广、便于测试的多个样本 数据关联性 ?? ?智能模糊测试 自动化框架 异常监控与异常回复 分析评估
渗透测试 ?? ?通过模拟恶意攻击者进行攻击,来评估系统安全的一种评估方法 ?? ?从攻击的角度测试软件系统是否安全 ?? ?使用自动化工具或者人工的方法模拟攻击者的输入,找出运行时刻目标系统所存在的安全漏洞 优点 ?? ?找出来的问题都是真实的,也是较为严重的 缺点 ?? ?只能到达有限的测试点,覆盖率较低
测试目的 ?? ?安全性的评估,不是摧毁或破坏 测试人员 ?? ?技术、知识和经验很重要 ?? ?像“坏人”一样思考 安全问题 ?? ?系统备份和恢复措施 ?? ?风险规避 (人工测试参数由那些不想发现安全问题的人所确定,那么,渗透测试就很可能变成一种毫无用处的自我满足练习)
代码审核+体系结构风险评估 基于风险的安全测试+渗透测试 安全需求分析+滥用案例开发 代码审核+渗透测试 体系结构风险分析+基于风险的测试
充分了解软件安全漏洞 评估软件安全风险 拥有高效的软件安全测试技术和工具
软件供应链安全 ?? ?了解软件供应链安全的概念并理解软件供应链安全措施 软件安全验收 ?? ?了解软件安全验收的重要性及需要考虑的内容 软件安全部署 ?? ?了解软件安全部署的重要性及软件安全加固、软件安全配置的概念
供应链安全的概念 ?? ?目前软件安全开发生命周期中新的威胁,涉及到软件的代码编写、代码编译、软件开发、软件更新 ?? ?代码编写 ?? ??? ?共享库 ?? ?代码编译 ?? ??? ?被污染的编译软件 ?? ?软件分发/更新 ?? ??? ?污染源头 供应链安全应对策略 ?? ?安全流程覆盖到引入的第三方代码中 ?? ?可靠的编译软件获取方式 ?? ?官方渠道、发布验证
软件验收 ?? ?正式的验收流程 ?? ?安全纳入到验收考虑中 安全部署 ?? ?提供软件部署所需要的文档和工具 ?? ?软件加固 ?? ?软件安全配置
|