跳转至

软件安全——概述

软件安全

软件安全关注计算机程序或者程序中所包含信息的完整性、机密性、可用性

软件安全的范围

操作系统 数据库 应用软件等

  • 缺陷(内在) 威胁(外部,主观) 风险(缺陷和威胁有机交叉)
  • 安全范围是“三维化”的:生命周期、安全功能、环境要素
  • 软件安全知识体系:软件漏洞,恶意代码,软件保护

软件漏洞

  • 缓冲区溢出:W32.Blaster.Worm

    发生在Windows 2000和Windows XP系统的病毒,利用DCOM RPC漏洞,通过TCP 135端口发送恶意数据,并且在系统中会创建以下启动项:

    Text Only
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\ windows auto update=msblast.exe
    

    会造成RPC服务崩溃,并因此需要重启系统

  • 软件漏洞的危害

    Windows 98处理过多ping数据包时,可能会出现蓝屏,此为拒绝服务漏洞。

    考虑航天飞机的导航软件和情报部门使用的秘密软件。一旦发生漏洞,可能会造成生命危险或其他严重后果。

    一些软件出现漏洞后,可能被恶意攻击者利用而进行对用户关键数据的删除,从而造成用户数据的丢失。有一些漏洞甚至会直接造成对用户数据的清除。

    个人、单位、政府部门都有可能被一个软件的安全漏洞所泄漏,造成无法预知的后果。

    一个软件漏洞被发现后,最常见的利用就是恶意攻击者借此来散播木马病毒程序。

  • 软件漏洞出现的原因

    1. 开发不符软件工程
    2. 赶进度
    3. 安全意识淡薄(轻视安全测试、安全维护不完善)

软件风险[Gary Mcgraw软件漏洞分类]

  • 较为严重的安全问题一般由于对输入过度信任造成

对所分配的内存块之外的内存进行写操作会覆盖数据,使程序崩溃,甚至导致执行恶意代码

在没有指定完整路径的情况下执行命令可能使得攻击者可以通过改变$PATH或者其他环境变量来执行恶意代码

向浏览器发送非法的数据会使浏览器执行恶意代码,通过XML编码进行身份认证也会导致浏览器执行非法代码

允许攻击者控制一个函数的格式化字符串,可能会引起缓冲区溢出

在HTTP响应头中包含未经验证的数据将可能导致缓存中毒、跨站脚本、跨用户攻击或者页面劫持攻击

函数可能返回指向缓冲区外边的内存,接下来对该指针的操作有可能造成缓冲区溢出

不考虑整数溢出会造成逻辑错误或缓冲区溢出

写未验证数据到日志文件让攻击者伪造日志或注入恶意的内容

允许用户通过输入来控制文件系统操作使用的路径,会使攻击者有机会访问或修改被保护的系统资源

装载来自于非信任源或者非信任环境的库可能会导致应用程序执行攻击者的恶意代码

允许用户输入控制资源ID可能会使攻击者访问或修改系统保护的资源

允许外部控制系统设置有可能会导致服务崩溃或应用程序进行非法操作

允许用户输入来构造一个动态的SQL请求,将有可能让攻击者控制SQL语句的意思,执行任意的SQL指令

依赖于字符串终止符有可能造成缓冲区溢出

没有检查方法的返回值,可能会导致程序进入不可预料的状态

  • 大多数的API误用是由于调用者没有理解约定的目的所造成的

不能被安全使用的函数不应该使用

不合理的使用系统调用chroot()可能使攻击者逃脱chroot的限制

堆检查经常出现类似密码等敏感信息因为没有及时从内存中移走从而被黑客利用。所以不应该使用realloc()重新分配藏有敏感信息的缓冲区

攻击者经常伪造DNS进行攻击

_alloca()函数会抛出stack overflow exception,从而会使程序宕掉

传送一个大小不够的输出缓冲区给路径操纵函数会导致缓冲区溢出

未能坚持最小权限原则会增大其他弱点出现的风险

在进行多字节和unicode字符串转换时容易发生缓冲区溢出

不考虑方法的返回值会导致程序出现意外的状况

  • 安全特征主要指认证,访问控制,机密性,密码,权限管理等方面的内容

标准的伪随机数生成器不能抵抗加密攻击

程序在运行到需要将权限提高的函数时将权限提高,当不需要时应立即将权限降到最低

程序未能在所有可能的执行路径执行访问控制检查

用明文存储密码或者口令为空将导致系统的不安全。在HTTP重定向报文发送密码会导致密码泄露

对私有信息的不恰当处理会给用户带来损害

  • 多线程、多进程可能会令指令发生的顺序不按预期情况

不一致的程序锁定会导致死锁

通过认证后使用同一个会话会导致攻击者劫持已认证过的会话

文件属性被验证和文件被使用之间的时间差可以引起文件使用权限提升的攻击

创建和使用临时文件可能会导致应用程序和系统受到攻击

  • 忘记处理错误或错误暴露信息过多

捕获一个空指针异常不是一个有效的防止空指针发生的办法

忽视异常以及其他错误可能会导致攻击者引发意想不到的行为

捕获过多的异常会使错误处理代码过度复杂,使代码更可能携带安全弱点

  • 低劣代码质量可能会导致非预期的行为

对同一个内存地址调用2次free()会导致缓冲区溢出

内存分配却没有释放,会致资源枯竭

程序使用一个空指针引用时,就会抛出NullPointerException

尽量不要使用已经废弃的函数

函数行为未定义,直到其控制参数被设置为特定的值

程序可能在变量没初始化之前使用它

程序有时可能不能释放系统资源

在内存已被释放后使用可能会导致程序崩溃

通过名字比较类可能会对导致程序将两个不同的类认为是相同的

通过不同的会话访问同一个对象里的变量,数据可能被泄露。例如servlet以及通过共享池保存的对象

Debug代码可能会无意识的在应用程序中创建一些入口点

系统数据和调试信息的泄露会给攻击者对系统发动攻击机会

将可信的以及不可信的数据混杂在同一个数据结构中可能会导致程序员错误地信任未验证的数据

  • 虽然在源代码之外,但它们对产品的安全性仍然至关重要
  • 可能出现的风险:不安全的编译器优化、J2EE(不安全传输、弱访问许可)、配置文件中的密码

课程安排

  • 从缓冲区溢出出发 → C/C++安全编码知识
  • 参考书:C和C++安全编码,第二版

评论