软件安全
1、软件安全问题
- 软件安全与软件质量和可靠性紧密相关又相互区别。
- 防御性程序设计(也称安全程序设计):是一个软件设计与实现流程,目的是使生成的软件即使在面临攻击时仍然能够继续工作。
- 编写安全的程序代码需要关注一个程序执行的各个方面、执行的环境以及处理的数据类型。
- 意味着程序需要验证所有这些假设,所有可能的失败都能安全且完美地得到解决
- 关键是绝不假定任何事情,而是检查所有可能的假设,并处理任何可能的错误状态
2、处理程序输入
-
两个关键点:输入的长度+输入的含义和解释
-
输入的长度和缓冲区溢出
- 程序员经常假设输入数据的最大长度——>导致缓冲区溢出,危害程序执行
- 测试阶段难以识别缓冲溢出的漏洞
- 针对缓冲区溢出编写安全程序代码,应认为任何输入都存在危险
-
程序输入的解释
- 程序输入数据可分为文本和二进制两种形式
- 心脏出血OpenSSL漏洞,没有检查二进制输入值导致
- 注入攻击
- 命令注入
- SQL注入
- 代码注入
- 跨站点脚本攻击
- XSS反射
-
验证输入语法
- 程序仅接受已知的安全数据,才更有可能保持安全
- 比较方法:正则表达式,由一系列描述允许的输入变化的字符构成的模式即明确对其编码
- 多重编码:数据在HTML中或者在一些其他结构化的编码中允许字符的多重表示
- 字符规范化:转换成单一的、标准的、最小的表示形式;输入的数据与可接受的输入值的一个单一表示进行比较
-
输入的fuzzing技术
- 是一种软件测试技术
- 使用随机产生的数据作为程序的输入进行测试;也能依据一些模板随机产生输入
3、编写安全程序代码
-
算法的正确实现
-
保证机器语言与算法一致
-
数据值的正确解释
-
内存的正确使用
- 如果一个程序没有正确管理这个过程,后果可能是堆区的可用内存逐步减少,即产生内存泄漏。
-
组织共享内存竞争条件的产生
- 当多个进程或线程通过竞争来获取对一些资源的未加控制的访问时,会导致竟争条件的发生。
- 如果我们选择了不正确的同步原语序列,就有可能造成各种进程或线程的死锁
4、与操作系统和其他程序进行交互
-
环境变量
- 环境变量是每个进程从其父进程中继承的能够影响进程运行方式的一系列字符串值
- 环境变量提供的可以进入一个程序的另一个路径是未确认的数据,因而需要进行验证。
- 常见用法,本地用户经常利用这些环境变量获取对系统的更大权限。
-
使用合适的最小特权
- 特权扩大:比本来为攻击者分配的权限高,可能修改系统并持续拥有高特权。
- 最小特权:每个程序都应该使用完成其功能所需的最小特权
- 确认:在提高组优先级的同时也提高用户优先级,还是仅提高组优先级。
- 保证任何特权程序仅能修改所需的文件和目录
-
系统调用和标准库函数
-
阻止共享系统资源的竞争条件产生
- 常用的技术是在共享的文件上设定一个锁,保证每个进程轮流访问
- 最早也是最常用的技术是使用一个文件锁(lockfile)。
-
安全临时文件的使用
- 临时文件必须是唯一的,不能被其他人访问。
- 安全临时文件的产生和使用更需要使用随机的临时文件名。
-
与其他程序进行交互
- 应十分小心,任何对于程序间数据流规模和解释的错误假设都可能导致安全漏洞
- 保护多个程序间数据流的机密性和完整性问题
- 从安全的角度讲,检测和处理程序交互中产生的异常和错误也很重要。
5、处理程序输出
- 从程序安全的角度讲,输出和预想的形式相符合是很重要的。
- 程序必须区分哪些输出是允许的,并且过滤掉任何不可信数据,保证只有有效的输出被显示。
不同的字符集允许对元字符的不同编码方式,这会改变对有效输出的解释。