软件安全设计

CH01软件与软件安全

计算环境与软件

二进制基础

位运算

所谓位运算是指进行二进制位的运算。在系统软件中,常要处理二进位的问题。

**不同长度的数据进行位运算**

如果两个数据长度不同(例如long型和int型)进行位运算时(如a & b,而a为long型,b为int型),系统会将二者按右端对齐。如果b为正数,则左侧16位补满0。若b为负数,左端应补满1。如果b为无符号整数型,则左侧添满0。

指令系统与指令集

指令系统:计算机的指令系统就是指该计算机能够执行的全部指令的集合。

指令系统也称指令集

软件的形式与概念

软件

与一个系统(尤指计算机系统)有关的程序、步骤和有关文件编制的完整集合。特指特定类型计算机所使用的程序的总称,连同与计算机或程序有关的资料,例如手册、图表和操作指令。

程序

根据一定的需要事先编写的一系列控制计算机工作的命令,就称为计算机程序。

计算机系统的组成

完整的计算机系统包括计算机硬件系统和计算机软件系统。

软件的主要内容

程序、步骤及数据、信息手册等相关资料

功能:针对一个系统(计算机),合理组织工作。

两个层次:

–直接与硬件相关

–合理组织工作,完成特定任务。

软件的形式

软件分为系统软件应用软件应用软件以系统软件为基础。

信息安全与软件安全

信息与信息安全

信息安全属性

安全性,可用性,保密性,可控性,可靠性

软件安全

软件安全:软件在恶意攻击下能够正确地完成其功能。

软件安全性:软件安全性是指软件不被恶意使用或者攻击进而造成用户信息资产损失的属性。

软件安全属性:

  1. 可信性:保护敏感信息不被未授权用户访问
  2. 完整性:保护数据不被更改或破坏
  3. 可用性:确保资源被授权用户的使用

软件安全保护:

(1) 软件自身安全:防止软件丢失、被破坏、被篡改、被伪造

(2) 软件存储安全:可靠存储,保密存储,压缩存储,备份存储

(3) 软件通信安全:安全传输、加密传输、网络安全下载、完整下载

(4) 软件信用安全:合法用户与非法用户,授权访问,防止软件滥用,

防止软件窃取,软件的非法复制

(5) 软件运行安全 :确保软件正常运行,功能正常

软件安全研究:如何设计、构造、验证和维护软件以保证其是安全的。

包括改进和实现软件安全的架构或结构、工具、方法

ISO7498-2

主要内容

在ISO7498-2中描述开放系统互连安全的体系架构,提出设计安全的信息系统的基础架构应该包含的:5种安全服务,对5种安全服务提供支持的8类安全机制,需要进行的5种OSI安全管理方式

5种安全服务
  • 鉴别服务、访问控制、数据完整性、数据保密性、抗抵赖
8种安全机制
  • 加密、数字签名、访问控制、数据完整性、数据交换、业务流填充、路由控制、公证
5种普遍性安全管理机制
  • 可信功能度、安全标记、事件检测、安全审计跟踪、安全恢复

软件安全的概念

漏洞

计算机系统具有的某种可能被入侵者恶意利用的属性

有时安全漏洞也称为脆弱性(Vulnerability)。

本质:漏洞是系统的一组特性,恶意的主体(攻击者或者攻击程序)能够利用这组特性,通过已授权的手段和方式获取对资源的未经授权访问,或者对系统造成损害。

脆弱状态

从已授权的状态变换到未授权状态。

攻击

攻击是以授权状态或脆弱状态开始,以受损状态为目标的状态变换

安全事件

当系统的某个漏洞被入侵者渗透(exploit)而造成泄密

ISO9126标准

ISO9126标准:软件产品评价-质量特性及其使用指南

6个质量特性
  • 功能性
    • 准确性:软件提供给用户功能的精确度是否符合目标。(例如:运算结果的准确,数字发生偏差,多个0或少个0)
    • 互操作性:软件与其它系统进行交互的能力。(例如:PC机中WORD和打印机完成打印互通)
    • 保密安全性:软件保护信息和数据的安全能力。(主要是权限和密码)
    • 功能性的依从性:遵循相关标准(国际标准、国内标准、行业标准、企业内部规范)
  • 可靠性
    • 成熟性:软件产品为避免软件内部的错误扩散而导至系统失效的能力(主要是对内错误的隔离)
    • 容错性:软件防止外部接口错误扩散而导致系统失效的能力(主要是对外错误的隔离)
    • 易恢复性:系统失效后,重新恢复原有的功能和性能的能力。
    • 可靠性的依从性:遵循相关标准
  • 易用性
    • 易理解性:软件交互给用户的信息时,要清晰,准确,且要易懂,使用户能够快速理解软件。
    • 易学性:软件使用户能学习其应用的能力。
    • 易操作性:软件产品使用户能易于操作和控制它的能力。
    • 易用性的依从性:遵循一定的标准。
  • 效率
    • 时间特性:软件处理特定的业务请求所需要的响应时间。
    • 资源利用性:软件处理特定的业务请求所消耗的系统资源。
    • 效率依从性:遵循一定的标准。
  • 维护性
    • 易分析性:软件提供辅助手段帮助开发人员定位缺陷产生的原因,判断出修改的地方。
    • 易改变性:软件产品使得指定的修改容易实现的能力。(降低修复问题的成本)
    • 稳定性:软件产品避免由于软件修改而造成意外结果的能力。
    • 易测试性:软件提供辅助性手段帮助测试人员实现其测试意图。
    • 维护性的依从性:遵循相关标准。
  • 可移植性
    • 适应性:软件产品无需作相应变动就能适应不同环境的能力。
    • 易安装性:尽可能少的提供选择,方便用户直接安装。
    • 共存性:软件产品在公共环境中与其它软件分享公共资源共存的软件。
    • 易替换性:软件产品在同样的环境下,替代另一个相同用途的软件产品的能力。
    • 可移植性的依从性:遵循相关的标准。
9126质量模型缺陷
  • 安全性是软件功能性的子属性
  • 充分体现了对安全的忽视。

安全的代码(secure code): 能够抵抗恶意攻击的代码;安全的代码同时也是健壮的代码(robust code)

安全性代码(security code): 实现安全功能的代码。

安全的程序:安全隐含某种程度的信任(trust),程序实现了期望的机密性、完整性、可用性及其功能。

CH02典型软件安全问题

安全问题的来源

根本来源:漏洞(漏洞是软件的属性,是软件安全威胁的根源)、攻击者、软件存在的攻击路径-攻击面问题。

漏洞

产生漏洞的原因
  1. 软件或协议设计时的瑕疵
  2. 软件或协议实现中的弱点
  3. 软件本身的瑕疵
  4. 系统和网络的错误配置
漏洞的两种类型
  • 设计漏洞:
    • 设计错误,往往发现于软件的安全功能特性中。
  • 实现漏洞:
    • 来源于软件实际编码中的安全缺陷。

意外行为和缺陷

意外行为(Unexpected Behavior):也称程序安全缺陷,是由于程序脆弱性引起的不适当的程序行为。

缺陷(Flaw):缺陷可以是故障(Fault),或者失效(Failure)

程序安全缺陷可能来源于任何种类的软件错误

  • 无意或疏忽的
  • 故意或有意的
缺陷的类型:
  • 有意的缺陷
    • 恶意的
    • 非恶意的
  • 无意的缺陷
    • 确认错误
    • 的错误
    • 顺序化和混淆现象
    • 不完全的身份识别和认证
    • 边界条件违反
    • 其它可利用的逻辑错误
APPLE DEVELOPER常见软件缺陷
  • buffer overflows 缓冲区溢出
  • invalidated input 未校验输入
  • race conditions 资源竞争
  • access-control problems 访问控制问题
  • weaknesses in authentication, authorization, or cryptographic practices 认证、授权、加密缺陷

常见的安全设计问题

  1. 密码技术使用的败笔
    • 创建自己的密码技术
    • 选用了不当的密码技术
    • 依赖隐蔽式安全
    • 编写到程序中的密钥
    • 错误地处理私密信息
  2. 对用户及其许可权限进行跟踪的薄弱或缺失
    • 会话管理薄弱或者缺失
    • 身份鉴别薄弱或缺失
    • 授权薄弱或缺失
  3. 有缺陷的输入验证
    • 没有在安全的上下文环境中执行验证,如在服务器验证而在客户端没有验证
    • 验证例程不集中,验证应尽可能靠近用户输入,并应集中以便于核实
    • 不安全的组件边界
  4. 薄弱的结构性安全
    • 过大的攻击面
    • 在过高权限级别上运行进程
    • 没有纵深防御
    • 失效时的处理不安全
  5. 其他设计缺陷
    • 代码和数据混在一起
    • 错将信任寄予外部系统
    • 不安全的默认值
    • 未做审计日志

编程语言问题

C/C++的问题

  1. 没有安全的本地字符串类型,也没有安全而易用的字符串处理函数。

    PS:

    1
    2
    3
    4
    5
    6
    7
    //C中以NULL终止符表示一个字符串的末尾。
    //如:
    Char buffer[]=“small string
    //没有确切地存储字符串的长度,该字符串的长度要
    //程序员管理。
    //当程序员处理这个长度犯错时,就会导致超过缓冲
    //区结尾部分的内存被覆盖。

    缓冲区溢出(BufferOverflow)
    ——一个最典型的例子:

    1
    2
    3
    char sample[10];
    for (i=0; i<10; i++) sample[i] = 'A';
    sample[10] ='B'; //
  2. 缓冲区超限覆盖栈中的函数返回地址

    • 用于从被调用的函数返回到某个位置的返回地址驻留在栈中,紧接在本地变量之后;
    • 返回地址是驻留在栈中的一段隐蔽的数据,栈中其余部分是传递给该函数的变量;
    • 编译后的程序在调用这个函数之前会将这个地址数据放在栈中,以使程序获知当这个函数执行完后转到哪里;
    • 通过把栈中某个变量产生缓冲区溢出,就可以覆盖栈中的这个返回地址。

    PS:

    典型例子-栈溢出(Stack Smashing)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Void createFullName (char* firstName, Char* lastName)
    {
    Char fullName[1024];
    Strcpy(fullName, firstName);
    Strcat(fullName, “ “)
    Strcat(fullName, lastName);
    }
    /*
    接受参数名字和姓氏,放到一起,中间用空格分隔;
    变量fullName的声明方式,使其在堆栈中驻留;
    如果firstName和lastName太长,可能会使fullName超出1024;
    调用strcpy 和strcat函数破坏内存栈,会导致程序崩溃;
    如果控制参数使得fullName发生缓冲区溢出,就可以造成程序的恶意攻击。
    */

    预防栈溢出的方法:

    • 精确控制输入变量的长度(如上述firstName和lastName的长度限制为511个字节);
    • 建议使用strncpy和strncat替代strcpy和strcat;
    • 避免使用无界字符串;
    • 创建一个新的或使用已有的字符串缓冲区模块。
  3. printf类型的格式化函数-格式化字符串攻击

    例子:

    sprintf(target, “Name:%s, count:%d”, person, num);

    该例子获取字符串Name和整型数count,放入target(目标缓冲区)

    如果:

    sprintf(target,“Name: %s%s%s%s, count:%d”,num);

    此时该函数将从栈中读取四个字符串,但事实上栈中不存在这四个字符串,程序读取栈中原本用于其他目的的值。

  4. 整数溢出

    在C语言中,整数的正负标识是默认的;

    当一个整数值增长从而超过了其最大可能的值并循环到成为一个负数的时候,将发生整数溢出;

    C语言没有任何措施预防整数溢出。

    如果攻击者通过用户输入操纵整数长度,就可以让这个值溢出,引起程序的处理发生错误。

    例:整数2147483647加1,发生溢出,成为

    ​ -2147483648

    PS:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    Int copy_something(char *buf, int len)
    {
    char kbuf[800];
    if(len>sizeof(kbuf)
    {
    return -1; /*1*/
    }
    return memcpy(kbuf, buf, len); /*2*/
    }

    在 1 利用符号整数进行了一次边界检查;

    如果能够控制程序,传递一个负值给len,则可能通过1的检查;

    在2中,memcpy接受无符号数作为长度,len被解释为一个大的无符号数,导致超越缓冲区kbuf的末尾;

    具有讽刺意味的是:1所进行的边界检查是为了预防缓冲区溢出。

平台的实现问题

平台:平台是指程序在其中所运行的环境,包括操作系统以及与之交互的组件

平台问题1:符号链接

符号链接(Symbolic link, 简写为symlink):文件系统中指向其他文件的文件。符号链接等效于其指向的文件。程序打开的是一个符号链接,实际打开的是该符号链接指向的文件。

符号链接问题

攻击者可以使用程序预计要操作的文件名创建一个符号链接,使该文件名指向希望的文件;利用符号链接,攻击者事实上可以启动系统中的任何程序。

解决

程序员或使用者创建、打开、删除文件,或更改文件权限,必须检查该文件的符号链接,不可以基于文件名做任何安全方面的判定。

权限攻击的例子:如果程序以攻击者没有的权限运行,比如作为SUID(系统用户身份),攻击者可以借此发动一次权限提升。

平台问题2:目录遍历

典型例子:

CIFS是WINDOWS的文件共享协议,允许计算机通过网络访问彼此的文件系统。

利用目录遍历,攻击者可通过使用“..”符号上升到文件系统的上一级目录,从而对文件共享程序进行欺骗,进而获得对不在共享目录下的目录进行访问。

平台问题3:字符转换

平台支持不同类型的字符编码,存在多种不同的表示某个字符的方式。

程序接受用户的输入,为了满足安全需求,通常会要求进行安全检查,以确保输入的字符串对该程序设计是有效的。

当平台进行升级的时候可能会引入新的字符编码。

常见的应用程序安全问题

引起原因:

  • 应用程序的某个组件的恶意数据引起,这些恶意数据在其另一个组件中被当作了合法代码;
  • 对涉密信息的不当处理

应用安全问题1:SQL注入

攻击者通过操纵程序的某种输入,在连接到SQL数据库的应用程序上执行自己所构造的查询。

预防SQL攻击方法:

  • 过滤所有输入,确保输入字段只包含所需要的字符;
  • 尽量避免使用动态生成的SQL。

 SQL注入典型例子:

​ 但如果我们刻意的去绕过登录认证呢?猜想下面这个sql语句,单说用户名,开发人员很可能会这样去数据库里对比:
  Select from sys_user where username=‘XXX’
  当然可能更复杂,假如我们在输入框里输入下面一句特殊的字符会如何?’or‘1=1
  这是段神奇的字符,因为这样这个sql就变成:
  Select
from sys_user where username=‘’or‘1=1’ ‘
  这样我们就跳过了用户名的验证,实现了入侵。

这样的结果,导致无条件越过用户名验证。

应用安全问题2:跨站点执行脚本

利用Internet上某些环境(或WEB站点)的受信任级别高于其他环境。

来自非受信环境的攻击者可在受信的环境注入数据,使其在受信环境作为脚本予以执行。

跨站点执行脚本还可以用来访问数据,如用户cookies。

跨站点执行脚本的例子:

1
2
3
4
5
6
7
8
9
10
11
12
假如有下面一个textbox:  
<input type="text" name="address1" value="value1from">
value后面的值是来自用户的输入,如果用户输入 
"/><script>alert(document.cookie)</script><!-
那么就会变成 
<input type="text" name="address1" value=""/><script>alert(document.cookie)</script><!- "> 
嵌入的JavaScript代码将会被执行 
或者用户输入的是:
"onfocus="alert(document.cookie)
那么就会变成
<input type="text" name="address1" value=""onfocus="alert(document.cookie)">
事件被触发的时候嵌入的JavaScript代码将会被执行

开发过程问题

  • 安全需求和前提条件的文档记录缺乏
  • 交流和文档匮乏
  • 缺少安全过程

部署上的薄弱性

部署的执行者一般不属于开发团队

软件错误地设置文件或注册表的键值,使系统上的其他用户可以进行更改

使软件安装时具有不必要的权限。

OWASP

The Open Web Application Security Project

OWASP Top 10

A1-注入:攻击者发送的恶意数据可以欺骗解释器,以执行计划外的命令或者在未被恰当授权时访问数据。

A2-失效的身份认证

A3-跨站脚本:XSS允许攻击者在受害者的浏览器上执行脚本,从而劫持用户会话、危害网站、或者将用户转向至恶意网站。

A4-不安全的直接对象引用

A5-安全配置错误

A6-敏感信息泄露

A7-功能及访问控制缺失

A8-跨站请求伪造(CSRF)

A9-使用含有已知漏洞的组件

A10-未验证的重定向和转发

CH03安全软件工程

SSE-CMM

开发SSE-CMM的目的

降低开发和维护系统的花费;

提高工程进度和预算的一致性;

选择合适的承包者。

发起者:国防部、国家安全局

主要内容

能力方面
能力级别

能力级别1:非正式执行

公共特征

执行基本实施

能力级别2:计划与跟踪

公共特征

计划执行

规范化执行

验证执行

跟踪执行

能力级别3:充分定义

公共特征

定义标准过程

执行已定义的过程

协调安全实施

能力级别4:定量控制

公共特征

建立可测的质量目标

客观地管理过程的执行

能力级别5:连续改进

公共特征

改进组织能力

改进过程的有效性

域方面

工程和安全实施是安全工程过程中必须存在的性质,指出特殊过程区的目的并属于该过程区

每个过程区(PA)是一组相关安全工程过程的性质,当这些性质全部实施后则能够达到过程区定义的目的。

一组过程区指出活动的同一通用区

关于安全工程与评估

安全工程分三个基本过程:风险、工程和保证

风险(风险信息)

风险过程是要确定产品或者系统的危险性,并对这些危险性进行优先级排序

工程(解决方案)

工程过程是针对面临的危险性,安全工程过程与相关工程过程一起来确定并实施解决方案

保证(保证论据)

保证过程是建立起对解决方案的信任,并把这种信任传达给顾客

SSAM(SSE-CMM评定方法)

SSAM 为了进行评定,收集数据广泛、严格,每个数据有充分的证据。此方法在评定过程中最大程度地发挥了SSE-CMM模型的功效。

此方法:

  • 决定实施安全工程过程的能力
  • 为了评定定义了安全工程环境
  • 在评定时巧妙地使用了SSE-CMM体系结构中的两个方面。

SDL-安全开发生命周期模型

Secure Development Lifecycle

微软可信计算(TrustWorthy Computing )努力的一个组成部分

  • 基于并行理念的标准软件开发过程
  • 基于威胁建模和测试

SDL概览

SDL从三个方面考虑软件安全的保障。

设计安全
  • 为了保护软件自身以及软件处理的信息,并抵御攻击,软件应该从架构,设计和实现上进行考虑
缺省安全
  • 设计者应该假定安全缺陷将会出现。

  • 为了当攻击者对软件存在的缺陷进行攻击时使损害降到最小, 软件的缺省状态应该保证安全。

    比如 最小特权原则。

提交安全
  • 工具和指南应该随着软件提供以帮助最终用户或管理员安全使用。

  • 关于软件的更新应该容易提交。

SDL过程

0:教育和意识

安全教育的内容

安全设计基础:受攻击面分析、深度防御、最小特权、安全默认配置

威胁建模:设计威胁建模、编码威胁建模、测试威胁建模

1:项目启动

判断SDL是否覆盖应用、任命安全顾问、组建安全领导团队、确保在BUG追踪管理过程中包含安全、隐私类BUG、建立BUG标准

2:定义并遵从设计最佳实践

常见安全设计原则

经济机制、默认失效保护、安全中介、公开设计、权限分离、最小特权、最少公共机制、心里可接受程度

受攻击面分析与降低

分析

枚举所有接口、协议以及可执行代码的过程。

软件的受攻击面

代码、接口、服务、协议、其他

降低

核心观点:在所有代码中存在至少一个或多个漏洞的可能性一定不为零,一部分严重漏洞会导致用户不得不接受妥协。唯一解决上述问题的方法是将代码的利用率降至为零。

受攻击面降低的方法:

  • 降低默认执行的代码量

  • 限制可访问到代码的人员范围

  • 限定可访问到代码的人员身份

  • 降低代码所需权限。

3:产品风险评估

安全风险评估隐私影响分级统一各种因素

4:风险分析/威胁建模

益处

有助于整个风险管理过程

在系统进入编码阶段前发现系统威胁

开发团队通过威胁建模可以重新验证其架构与设计

有助于进一步明确针对应用以及环境采取相应的解决对策

有助于指导整个代码审核过程

指导整个渗透测试过程

威胁建模过程

  1. 定义应用场景

  2. 收集外部依赖列表

  3. 定义安全假设

  4. 创建外部安全备注

  5. 绘制待建模应用的一个或多个数据流图

  6. 确定威胁类型

  7. 识别系统威胁

  8. 判断风险

  9. 规划消减措施

5:创建安全文档、工具以及客户最佳实践

6:安全编码策略

7:安全测试策略

安全测试内容:模糊测试、渗透测试、运行时测试、重审威胁模型、重估受攻击模型

8:安全推进过程

9:最终安全评审

10:安全响应规划

使用SDL不能保证生产绝对安全的软件:

  • 开发团队一定会出错

  • 新漏洞一定会变化

  • 规则一定会变化

11:产品发布

12:遵从计划、尽可能补救、理解取舍之道

CH04软件安全测试

软件安全测试

安全性测试是指有关验证应用程序的安全等级和识别潜在安全性缺陷的过程。

应用程序级安全测试的主要目的是查找软件自身程序设计中存在的安全隐患,并检查应用程序对非法侵入的防范能力。

安全指标不同测试策略也不同。

安全测试的法律问题

安全测试必须得到授权
安全测试工具的应用必须得到授权
穿透测试实验必须得到授权
在未得到明确授权的情况下,不允许针对第三方系统进行穿透测试的实验

软件安全测试的方法

  • 静态测试

主要通过对源代码进行安全扫描,根据程序中数据流、控制流、语义等信息与其特有软件安全规则库进行匹对,从中找出代码中潜在的安 全漏洞。

静态的源代码安全测试是非常有用的方法,可以在编码阶段找出所有可能存在安全风险的代码,这样开发人员可以在早期解决潜在的安全问题。

静态代码测试比较适用于早期的代码开发阶段,而不是测试阶段。

  • 动态的测试

动态测试也称渗透测试,penetrate

渗透测试是常用的安全测试方法。是使用自动化工具或者人工的方法模拟黑客的输入,对应用系统进行攻击性测试,从中找出运行时刻所存在的安全漏洞。

渗透测试的特点就是真实有效,一般找出来的问题都是正确的,也是较为严重的。

渗透测试的缺点是模拟的测试数据只能到达有限的测试点,覆盖率很低。

  • 程序数据扫描

一个有高安全性需求的软件, 在运行过程中数据是不能遭到破坏的,否则就会导致缓冲区溢出类型的攻击。

数据扫描的手段通常是进行内存测试,内存测试可以发现许多诸如缓冲区溢出之类的漏洞,而这类漏洞使用除此之外的测试手段都难以发现。

例如,利用专门的工具对软件运行时的内存信息进行扫描,检查是否存在导致隐患的信息。

安全测试点

  • 程序安全性测试

  • 数据安全性测试

典型问题

程序安全性测试典型问题参考

① 明确区分系统中不同用户权限;

② 系统中会不会出现用户冲突;

③ 系统会不会因用户的权限的改变造成混乱;

④ 用户登陆密码是否是可见、可复制;

⑤ 是否可以通过绝对途径登陆系统(拷贝用户登陆后的链接直接进入系统);

⑥ 用户推出系统后是否删除了所有鉴权标记,是否可以使用后退键而不通过输入口令进入系统。

网络安全测试典型问题参考

① 测试采取的防护措施是否正确装配好,有关系统的补丁是否打上;

② 模拟非授权攻击,看防护系统是否坚固;

③ 采用成熟的网络漏洞检查工具检查系统相关漏洞;

④ 采用各种木马检查工具检查系统木马情况;

⑤ 采用各种防外挂工具检查系统各组程序的客外挂漏洞。

数据安全测试考虑问题参考:

① 系统数据是否机密(比如对银行系统,这一点就特别重要,一般的网站就没有太高要求);

② 系统数据的完整性;

③ 系统数据可管理性;

④ 系统数据的独立性;

⑤ 系统数据可备份和恢复能力(数据备份是否完整,可否恢复,恢复是否可以完整)。

安全漏洞分级

DREAD模型

DREAD模型:进行威胁程度级别分析的有效技术。

  • 潜在的破坏(Damage potential)

    • 如果该漏洞被利用,所产生的破坏程度
  • 再现性(Reproducibility)

    • 探测并利用该漏洞所需要的努力要多久
  • 可利用性(Exploitability)

    • 是否需要身份鉴别?
  • 受影响用户(Affected users)

    • 漏洞利用的影响面有多大
  • 可发现性(Discoverability)

    • 漏洞研究人员或黑客找出该漏洞的可能性

TRAP模型

基于可利用性提出。

因素:

时间(Time)

可靠性(Reliability)/再现性(Reproducibility)

访问(Access)

定位(Positioning)

安全的常规测试方法

基于风险的安全测试

安全测试的目标

在给定的时间和资源不变的情况下,尽可能多地找出最为严重的安全缺陷。

威胁建模=风险建模

基于风险的测试是软件测试的常规方法

基于风险的测试的三个步骤
  1. 信息搜集

    信息搜集的目的:熟悉程序的设计、了解程序访问入口点位置、了解程序所涉及的信息资产-需要保护的信息

    信息搜集的方法:程序设计文档的评审、与设计人员和架构师会谈、运行时分析-使用调试和诊断程序

  2. 威胁(风险)建模

    威胁建模的目的:排定测试优先级,找出测试区域,发现系统弱点

    威胁建模步骤:

    1. 识别威胁路径

      目的:识别应用程序级别最高的风险领域,确定相应的保护措施

      步骤:

      ①了解应用程序平台和编程语言的整体强度

      ②确定用户的访问类别

      ③建立并分析数据流图

    2. 识别威胁:

      目的:深入识别沿威胁路径的处理,逐一理清与处理相关的每一种威胁。

      针对威胁路径的每一个处理组件的问题列表:

      –该组件执行什么样的处理

      –该组件如何确定身份

      –该组件信任数据或者其他组件吗

      –该组件修改了什么数据

      –该组件有何外部连接

      在一个威胁路径上的9个高风险活动:

      ①数据解析 ②文件访问 ③数据库访问 ④生成子进程 ⑤身份鉴别 ⑥授权 ⑦同步或会话管理 ⑧处理私密数据 ⑨网络访问

    3. 识别漏洞

      目的:找出可能存在于组件中的实际漏洞。

      缓解措施:

      –数据验证测试

      –资源监视

      –关键功能的访问控制

      搜寻漏洞的方法及途径:

      –安全设计审查

      –安全代码审查

      –安全测试

    4. 风险分级/排定优先级

  3. 可用性分析

    判定可利用性的目的:判断漏洞是否可被攻击者利用。

    原则:在开发中直接修补一个可能会被利用的问题比花时间判定其是否会被利用容易

白盒、黑盒和灰盒测试

白盒测试

也称明盒测试、开盒测试或信息充分测试。

白盒测试可以看作是内部的攻击。

测试人员可以访问源代码和设计文档,可以进行威胁建模或逐行的代码检查。

白盒测试是找出漏洞最为有效的方法。

黑盒测试

以局外人的身份对系统进行攻击,使用工具检查系统的攻击面,并探查系统的内部信息。

黑盒测试是白盒测试的补充。

方向工程团队利用黑盒测试验证隐蔽式安全方法的强度。

灰盒测试

组合使用白盒测和黑盒测试。

–白盒测试用于发现在设计和开发中详细说明的功能中的缺陷;

–黑盒测试在无法了解程序内部信息的时候找出缺陷。

程序开发中的调试运行是典型的灰盒测试方法。

典型安全测试工具

JAVA代码安全分析工具:

–IBM AppScan Source Edition

–Fotify Static Code Analyzer

–Findbugs

C++代码安全分析工具:

–C++Test

–IBM AppScan Source Edition

–Fotify Static Code Analyzer

Visual Studio(27.78%)

JavaScript代码安全工具:

–Google’s Closure Compiler

–JSHint

Python代码安全工具:

–Pychecker

–PyCharm

–Pylint

–PySEC,开源

WEB应用安全测试工具:

IBM AppScan

SoapUI

HP的WebInspect

WEB应用的开源工具:

Firebug

OWASP ZAP

Android App安全测试工具:

Android Tamer

AndroBugs

Mobisec

SQL注入测试工具:

SQLInjetor

SQL Power Injector

OWASP SQLiX

网络状态监控与分析工具:

Wireshark

CH05编写安全的代码

SD3

安全设计

  • 安排具体的安全设计的人员;

  • 进行安全教育;

  • 确保威胁分析已经完成;

  • 符合安全设计和编码的指导原则;

  • 尽可能修补任何安全编程指南上的BUG;

  • 确保安全指南是逐步改进的;

  • 针对已经修复的缺陷开发回归测试;

  • 简化代码和安全模型;

  • 在打包以前完成穿透测试。

缺省安全

  • 缺省状态下,不要设置所有的特点和功能;

  • 允许最小权限;

  • 恰当的资源保护。

安全提交

  • 确认程序给管理员提供了安全功能;

  • 尽可能提供高质量的补丁;

  • 提供足够的信息以使用户安全的使用软件。

安全规则

  • 学习错误;

  • 最小化攻击面;

  • 使用深度防御;

  • 使用最小权限;

  • 应用缺省安全;

  • 记住兼容性的倒退是痛苦的;

  • 假定外部系统是不安全的;

  • 基于错误计划;

  • 切记安全的特性不等于安全特性;

  • Never depend on security through obscurity( 朦胧,晦涩,不分明) alone

  • 不要混合编码和数据;

  • 正确修复安全问题。

学习错误

学习错误从填写一个文档开始,文档内容:
产品名称;产品版本;联系人;BUG数据库编号;
脆弱性描述;脆弱性的隐含意义;
在产品的缺省安装中,这个问题是否存在?
设计,开发和测试人员能够做什么来防止这个缺陷?
修复的细节,包括代码的区别,如果可以填写。

最小化攻击面

需要计算下面的内容:
(1)打开socket、命名管道、RPC端点的数量;
(2)服务的数量;缺省运行服务的数量;服务以提高权限运行的数量;
(3)ISAPI过滤器和应用的数量;动态WEB页面数量;加入管理员组帐号的数量;
(4)文件,目录和注册键值的数量,带有弱访问控制列表。

CH06信息系统的安全建模莫分析

信息系统及其特征

MIS

MIS是借助于自动化数据处理手段进行管理的系统,由计算机硬件、软件(包括:系统软件、应用软件和管理学软件包)、数据库各种规程和人共同组成。

是由人、计算机等组成的能进行管理信息的收集、传递、加工的信息系统。

主要特征
  • 依赖于计算机的;

  • 涉及了计算机的软件和硬件;

  • 实现数据的采集、传递、加工、处理功能。

系统主要特性

1 整体性—系统的各个部分一定以整体目标为目标,追求全局最优;

2 目的性—一个系统一定是具有明确目标的,并完成一定的功能;

3 层次性—一个系统可以分为若干层次和子系统;

4 边界性—每一个系统都能够明显地区别于其他系统,系统之间有明确的界限;

5 关联性—系统包括若干元素,元素之间存在一定的关联性;

6 环境性—系统处于一定的环境之中并受环境影响。

信息系统的类型

宏观的国家经济信息系统;

面向基层的企事业管理信息系统;

事务型管理信息系统;

办公型管理信息系统;

专业型管理信息系统等;

既有典型的MRP,ERP,SCM等通用的信息系统,也有针对特定业务的系统。

许许多多以计算机为核心的,实现数据的采集、存储、操作的系统都属于信息系统的范畴。

运行环境要素
  1. 物理世界;

  2. 管理者实体—拥有授权管理、变更、修复和使用系统的人或者其他系统,其中一些被授权人可能缺乏有效管理系统的能力或具有恶意的目的;

  3. 使用者—在使用界面接受来自系统的服务的实体;

  4. 提供者—在系统的使用界面提供服务的实体;
  5. 基础组织—对系统提供信息源、通信链接、能源、冷气等特定服务的实体;
  6. 入侵者—企图超越所拥有的权限并且变更服务或阻止服务,变更系统的功能或性能或者存取秘密信息的实体。

信息系统的安全问题

ISO7498-2标准中所定义的五种安全服务类型:

  • 身份鉴别(Authentication)

  • 访问控制(Access Control)

  • 数据保密(Data Confidentiality)

  • 数据完整性( Data integrity)

  • 抗抵赖(Non-reputation)

安全模型

系统使用者:

用户 系统管理员 信息主管(企业主管)

系统划分:

用户界面逻辑 业务逻辑 异常检测机

系统安全实现的主要功能:

访问控制 抗抵赖 数据保密 身份鉴别

授权机制 日志审计 系统异常探测

用户界面逻辑

用户界面逻辑部分:数据访问、登录控制。

在系统启动时,用户首先登录系统,通过系统验证后才可以完成数据访问功能。

登录控制

主要功能:口令验证,口令修改,口令数据的加密,登录时间记录

设计考虑:

  1. 用户ID:从权限数据中提取出相应的用户名。采用用户编号的原因是回避重名,简化输入,同时用户号本身也可以增加一定的安全性。
  2. 用户修改口令,而不是系统管理员:系统管理员对用户授权,但是口令由用户在用户界面输入,并加密存储至后台数据库中,以避免系统管理员获取用户口令造成泄密
  3. 初始口令的安全:系统的第一次运行关键是初始口令的赋予,由信息主管(或其他高层)完成用户身份的确认,同时要求用户第一次登录时必须更改初始口令。
  4. 口令安全:口令长度限制;口令字符集限制;口令有效期限制。
  5. 用户封锁:所谓的用户封锁是当出现用户多次登录系统失败的情况时,系统将锁定用户的操作并提示,解锁过程必须由系统管理员完成。

业务逻辑

在系统的业务逻辑部分主要包括数据服务、权限管理、日志审计三个部分。

数据服务

主要安全任务是完成特定数据的加密、解密,日志数据的存储,权限及用户信息的存储。

权限管理

完成用户的授权,包括两个部分:系统管理员和信息主管。信息主管负责系统启动和初始授权,系统管理员负责日常权限管理、日志审计、系统状态监控、异常监测、用户锁定处理。

日志审计

对用户的操作行为进行跟踪,提供根据时间、用户、系统的检索手段。是保证安全,提高安全可信性的重要手段。

异常探测机

异常探测机实现的主要功能:

–是日志的分析;

–网络状态的安全监测;

–提供一定的日志文件保护机制。

异常检测独立于业务逻辑的目的

1独立的程序,便于进一步发展,有较大的发展空间;

2位于业务和用户进程之外,能够对其进行监控;

3不对信息系统运行发生干扰;

4使该探测器成为系统的可选件。

异常行为探测
区别内容 异常探测机 IDS
检测范围 网络内部行为 网络外部行为
实现方式 软件 硬件
与系统关系 可以存取系统数据 不能存取系统数据
保护目标 信息系统 网路
异常行为

用户身份的攻击:非法用户针对用户ID进行攻击,试图猜测用户身份。

口令攻击:在已知用户身份的情况下,猜测口令,进行口令攻击。

服务器的异常访问:这里是指服务器计算机和WEB
SERER等专用服务程序。类似DOS攻击的方式在局域网内也是有可能发生的。

数据库异常连接:对数据库的访问主要是通过特定端口进行的,可能的威胁来自合法的客户端程序或者非法的客户端程序。

数据库文件变动异常:系统中数据库文件的变动包括文件访问、拷贝、删除等操作。

日志文件攻击:针对日志文件发起的包括文件删除、修改等非法操作。

日志分析

针对日志文件自身的攻击主要有:

  • 日志数据的删除
    • 系统本身不向用户提供日志数据的删除功能。
    • 针对非法用户的攻击,如果是单独的日志文件,当系统启动后,该文件置于异常探测机的保护之下
    • 如果是数据库数据,则依赖于操作系统和数据库本身的保护机制。
    • 无论是系统操作员还是系统管理员的合法用户不具有日志文件删除的能力,而来自于客户端和服务器端的非法用户受到异常探测机、操作系统、数据库系统的安全机制约束。
  • 日志数据的修改
    • 系统不向用户提供日志修改功能。日志浏览也作为重要功能进行授权。
    • 由于单独的日志文件置于了异常探测机的保护之下,所以可以避免合法用户的修改。非法用户试图对记录于数据库中的日志数据进行修改时,则受到操作系统和数据库系统的约束。
日志数据审计和异常模式
  1. 手动审计
  2. 自动审计和报警
网络异常探测机

网络异常探测机的主要功能是针对来自网络的信息进行分析,提供对信息系统的保护报警。

探测器并不是通用的系统异常探测器。

功能:数据流量检测、服务端口连接数量检测、文件访问限制、日志文件保护

CH07WEB应用安全

WEB应用

定义

  • 采用HTTP协议完成通信的应用程序
  • 与后台WEB Server实现交互的程序

  • 与互联网(Internet)服务器,包括Web Server,database server进行交互的程序

  • 位于中间层,进行数据交互或者其他服务程序

安全现状

  • 实现WEB应用安全非常困难

    • WEB应用环境包括多个系统
    • WEB应用大部分运行于INTERNET,具有更广的攻击面
  • 在WEB应用的运行中,具有更多的临时决策,以支持系统的运行,系统状态具有更多的可变性

  • 许多支持系统没有得到恰当的保护

微软WEB应用安全框架

WEB应用安全建模

活动:Web 应用程序的威胁建模

目的:确定方案中的相关威胁和漏洞,以帮助您构建应用程序的安全设计。

输入:

•主要用例和使用方案
•数据流
•数据架构
•部署关系图

输出:

•威胁列表
•漏洞列表

五个步骤:

步骤 1 :确定安全目标。目标清晰有助于将注意力集中在威胁建模活动上,以及确定后续步骤要做多少工作。
步骤 2 :创建应用程序概述。逐条列出应用程序的重要特征和参与者有助于在步骤 4 中确定相关威胁。
步骤 3 :分解应用程序。全面了解应用程序的结构可以更轻松地发现更相关、更具体的威胁。
步骤 4 :确定威胁。使用步骤 2 和 3 中的详细信息来确定与应用程序方案和上下文相关的威胁。
步骤 5 :确定漏洞。检查应用程序的各层以确定与威胁有关的弱点。使用漏洞类别来帮助关注最常出现错误的区域。

WEB应用安全框架

输入和数据验证
身份验证
授权
配置管理
敏感数据
会话管理
加密
参数操作
异常管理
审核与记录

一个WEB应用安全模型

威胁建模:一种用于理解和消除系统安全威胁的形式化的方法

方法:

信息收集

•定位文档(Locate written document)
•访问相关人员(Interview stakeholders)
•探查系统(Inspect system)

分析

•用户Users
•构件,资产,动机 Components, assets, and motivation
•入口 Entry points
•弱点和威胁 Weaknesses and threats

威胁消除

•建立预算 Establish your budget.
•排序处理 Rank treats using a model that works for you.
•确立针对威胁的工作 Decide what to do with threats.

消除选择:

•忽略 Ignore risk. (Popular choice!)
•消除 Mitigate risk:入侵代价昂贵、安全代价昂贵、能够承受?
•接受 Accept risk.

消除策略:

•移除入口点.
•减少攻击面.
•区分.
•最小优先权原则

消除技巧:

•不要过度宽泛以避免不能自拔。建立子模型分支以处理复杂性。
•多数WEB APP具有共性-开发可重用的威胁模型库。
•由一个草稿开始(scratch),并且不要做任何假定。消除多数明显的(foolproof)威胁将导致简单的操作过程.

CH08安全工程过程模型

核心工作

①安全目标定义
②敏感数据分析
③威胁分析
④安全设计
⑤受攻击面分析
⑥安全实现
⑦安全测试
⑧安全维护

过程模型

过程实施要点

安全实施能力培养

团队安全能力范畴:
①软件安全的概念与意识;
②典型安全问题;
③开发语言的安全问题与工具;
④安全设计方法;
⑤数据及其敏感性;
⑥攻击面;
⑦威胁建模与分析;
⑧信息安全法律与政策;

安全目标定义

确定本项目需要达到的安全目标。形成规范的文档,作为工程过程中的指导原则。
安全目标定义应包括的内容:

①软件名称;
②软件开发目标及主要功能概述;
③软件主要用户及其分析;
④软件的关键信息与数据;
⑤软件各个部分及其总体需要达到的安全水平。

资源及敏感数据分析

确定本项目实施中所涉及的敏感数据,进行分类,给出明确的定义和敏感程度,以及保护措施。
软件操作的资源:网络端口,文件,服务器,URL,数据库…
软件操作的主要数据:

数据名 类型 作用 敏感程度 安全要求

威胁分析

分析系统用户,部署,功能,确定系统威胁来源。
明确:系统关键工程,部署,各个部分及功能用户

威胁名称 威胁来源 说明 重要程度

安全设计

根据安全目标,敏感数据,威胁分析的内容,实现安全设计。包括架构,安全问题的应对措施等。
需明确:
①系统架构与安全性问题
②安全问题及其应对措施
③架构与安全目标的响应
④敏感数据的保护措施
⑤威胁的应对措施

受攻击面分析

与安全设计对应,根据设计的架构,以及敏感信息,对受攻击面及攻击路径进行分析。
典型的受攻击面包括:端口,数据,文件…

攻击面 类别 威胁来源 重要程度

安全实现

安全测试

安全维护