[关闭]
@killa 2016-01-15T17:06:33.000000Z 字数 4895 阅读 895

十问十答

计算机系统安全分析考试

课程 计算机系统安全分析


1. 描述可信计算和安全体系结构的异同?

答:

      可信计算是在计算和通信系统中广泛使用基于硬件安全模块支持下的可信计算平台,以提高系统整体的安全性。

安全体系主要包括以下四方面内容:
 1. 详细描述系统中安全相关的所有方面,包括系统提供的所有安全服务和保护系统自身安全的所有安全措施;
 2. 在一定抽象层次上描述各个安全相关模块之间的关系;
 3. 提出指导设计的基本原理;
 4. 提出开发过程的基本框架及对应于该框架体系的层次结构;
      严格来说,可信计算技术属于安全体系结构下的一种信息安全技术。如果用面向对象的概念来理解这两个的联系就是:安全体系结构属于“类”,可信计算是继承该类的一个实例化“对象”。


2. 假如你已经可以完美克隆任意一张3G SIM卡片,请构思一种到两种获取该SIM卡用户手机上的隐私/机密数据的方法(请打开你们的脑洞)。(注:用户正在自己的手机上使用自己的SIM卡,对克隆行为毫无意识。你通过某些方式拿到了一张克隆的SIM卡,该卡可以如同合法SIM卡一样电话短信,显示被害用户的号码。)

答:

方法一:对该用户的账号进行忘记密码操作,使用此SIM卡收取验证短信从而修改该用户账号。例如使用手机号码登录微信,从而获取其手机上的联系人信息,或者通过手机号码修改QQ号密码获得其手机上的QQ聊天记录。

方法二:使用此SIM卡向该用户的父母发短信询问一些隐私信息。


3. 系统如何实现内核态与用户态的空间隔离?

答:

      用户空间就是用户进程所在的内存区域,相对的,系统空间就是操作系统占据的内存区域。用户进程和系统进程的所有数据都在内存中。当用户进程占据CPU时,就叫做用户态;相对地,当操作系统占据CPU时,就是内核态。
      划分内存空间:在电脑开机之前,内存是一块原始的物理内存。什么也没有。开机加电,系统启动后,对物理内存进行划分。当然,这是系统的规定,物理内存条上并没有划分好的地址和空间范围。这些划分都是操作系统在逻辑上的划分。不同版本的操作系统划分的结果都是不一样的。
      综上,要实现内核态与用户态的空间隔离,就要实现用户代码和操作系统代码的隔离。


4. 系统虚拟化的两种形式各有何优劣,存在何种安全问题?

答:

两种形式及其优劣:
      Hypervisor VM,优点:它直接运行在硬件(Bare Metal)上面,提供接近于物理机的性能,并在 I/O 上面做了特别多的优化,主要用于服务器类的应用,也被称为“Type 1”。 缺点:用户体验较差。
      Hosted VM,优点:其安装和使用非常方便,而且功能丰富,比如支持三维加速等特性,常用于桌面应用,也被称为“Type 2”。 缺点:它运行在物理机的操作系统上,其本身性能不如Hypervisor(因为它和硬件之间隔了一层 OS),基于 Hosted 模式的全虚拟产品性能方面不是特别优异,特别是 I/O 方面。

安全问题:
      虚拟机内部篡改
      虚拟机非法访问
      虚拟机隐蔽通道
      基于虚拟机的Rootkit攻击
      针对VMM的攻击


5. 虚拟机如何被应用于系统安全防护?请构思两个应用场景,对攻击场景和防护思路进行描述。

答:

VM 作为沙盒:

VM 作为 HIDS:

应用场景一:
WEB服务器对每一个传入的TCP连接单独开启一个虚拟机处理,以防某个恶意TCP连接利用服务器代码漏洞将shell反弹导致所有连接都可以进行攻击。降低被攻击后的损失。

应用场景二:
对于有可能被频繁攻击的服务器,在正式上线前使用虚拟机接受攻击,统计攻击类型和次数,针对接受到的攻击统计结果进行防范。以使服务器正式上线时可以抵御大部分攻击。


6. 栈溢出和堆溢出,描述攻击原理,并各举具体实例。

答:

(1)栈溢出是由于没有内置检查机制来确保复制到缓冲区的数据不得大于缓冲区的大小,因此当这个数据足够大的时候,将会溢出缓冲区的范围。栈溢出就是缓冲区溢出的一种。程序在运行过程中,为了临时存取数据的需要,一般都要分配一些内存空间,通常称这些空间为缓冲区。如果向缓冲区中写入超过其本身长度的数据,以致于缓冲区无法容纳,就会造成缓冲区以外的存储单元被改写,这种现象就称为缓冲区溢出。缓冲区长度一般与用户自己定义的缓冲变量的类型有关。由于缓冲区溢出而使得有用的存储单元被改写,往往会引发不可预料的后果,向这些单元写入任意的数据,会导致程序崩溃之类的事故。

(2)堆溢出:堆是一个在计算机科学中经常使用的抽象数据类型。堆中的物体具有一个特性: 最后一个放入堆中的物体总是被最先拿出来, 这个特性通常称为后进先出队列。 堆中定义了一些操作。堆溢出的产生是由于过多的函数调用,导致调用堆无法容纳这些调用的返回地址,一般在递归中产生。堆溢出很可能由无限递归产生,但也可能仅仅是过多的堆层级。

攻击实例:栈溢出
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void why_here(void)
  4. {
  5. printf("why u r here?!\n");
  6. exit(0);
  7. }
  8. int main(int argc, char * argv[])
  9. {
  10. int buff[1];
  11. buff[2] = (int)why_here;
  12. return 0;
  13. }

执行步骤大致如下:
1)进入main 函数后,栈的内容:[eip][ebp] 其中eip 为main 函数的返回地址,ebp 为main 函数的返回值。它们都占4 个字节,所以假设栈底地址1000,此时ESP 为996。
2)声明数组buff[1] int 型数组buff 存储在栈内存中(上面已有解释为什么存放在栈中),ESP=ESP-4,为992。buff 为数组首地址,与ESP 指向同一位置。此时栈的内容为[eip][ebp][buff[0]].
3)为buff[2]赋值。由于C/C++对数组元素的引用不自动进行越界检查,所以引用buff[2]是“合法”的,根据syntax sugar(语法糖,点此移步wiki)原理,buff[2] == *(buff +2 * 4),所以buff[2]地址为1000,原本存放的是eip,现被修改为why_here 入口地址。注意到why_here 地址已被强制类型转换为int 型。这样,main()函数结束后返回的时候将这个地址作为返回地址加以运行。

攻击实例:堆溢出
  1. #include<stdio.h>
  2. int main()
  3. {
  4. char name[8];
  5. printf("Please type your name:");
  6. gets(name);
  7. printf("Hello.%s!",name);
  8. return 0;
  9. }

编译并且执行,输入ipxodiAAAAAAAAAAAAAAAA,执行完gets(name)之后,由于我们输入的name 字符串太长,name 数组容纳不下,只好向内存顶部继续写'A',如果提前申请动态内存就可以避免堆溢出。而此例由于堆的生长方向与内存的生长方向相反,这些'A’覆盖了堆的老的元素。'EBP ret’都被'A'覆盖了。在main 返回的时候,就会把'AAAA'的ASCII 码:0x41414141 作为返回地址,CPU 会试图执行0x41414141 处的指令,结果出现错误。这就是一次堆溢出!


7. 程序分析技术可分为静态和动态两类,请分别列举每类下常用的工具和技术各三个。

答:

程序静态分析技术常用工具:Meta-Compilation, Klocwork, LDRA Testbed, HP Fortify

程序静态分析技术常用技术:
(1)词法分析:从左至右一个字符一个字符的读入源程序,对构成源程序的字符流进行扫描,通过使用正则表达式匹配方法将源代码转换为等价的符号(Token)流,生成相关符号列表,Lex 为常用词法分析工具。
(2)语法分析:判断源程序结构上是否正确,通过使用上下文无关语法将相关符号整理为语法树,Yacc 为常用工具。
(3)语义分析:对结构上正确的源程序进行上下文有关性质的审查。

动态程序分析:
1)gprof,以某种语言书写的程序为对象,对其内部的运作流程进行分析。
2)PinTools,动态插桩工具法
3)SoftICE,使用系统调试方法。


8. 在传染病模型下,N为机器总数,S(t)表示未感染数,I(t)表示感染数,β表示接触率(接触即染病),每单位时间有百分之二的感染机器的管理员成功修复了病毒问题。请利用传染病模型,绘制感染机器数与时间之间的关系曲线图。

答:

不会


9. SSL/TLS协议的主流加固方案有哪些?请至少列举出4种,并分别简述其工作原理和优缺点。

答:

1) openSSL:首先, OpenSSL 实现了 ASN.1的证书和密钥相关标准,提供了对证书、 公钥、私钥、证书请求以及 CRL 等数据对象的 DER、 PEM 和 BASE64 的编解码功能。 OpenSSL 提供了产生各种公开密钥对和对称密钥的方法、函数和应用程序,同时提供了对公钥和私钥的 DER 编解码功能。并实现了私钥的 PKCS#12 和 PKCS#8 的编解码功能。 OpenSSL 在标准中提供了对私钥的加密保护功能,使得密钥可以安全地进行存储和分发。在此基础上, OpenSSL 实现了对证书的 X.509 标准编解码、 PKCS#12 格式的编解码以及PKCS#7 的编解码功能。并提供了一种文本数据库,支持证书的管理功能,包括证书密钥产生、请求产生、证书签发、吊销和验证等功能。
优点:数据保密性,数据完整性,安全验证。
缺点: Heartbleed 模块存在一个 BUG,当攻击者构造一个特殊的数据包,满足用户心跳包中无法提供足够多的数据会导致 memcpy 把 SSLv3 记录之后的数据直接输出,该漏洞导致攻击者可以远程读取存在漏洞版本的 OpenSSL 服务器内存中长达 64K 的数据。

2) Bouncy Castle: 是一种用于 Java平台的开放源码的轻量级密码术包。它支持大量的密码术算法,并提供 JCE 1.2.1 的实现。
优点:因为 Bouncy Castle 被设计成轻量级的,所以从 J2SE 1.4到 J2ME(包括 MIDP)平台,它都可以运行。它是在 MIDP 上运行的唯一完整的密码术包。
缺点:速度慢。

3) GnuTLS:这是另一个用 C 语言实现的库,支持 SSL 3.0, TLS 1.0/1.1/1.2 以及 DTLS 1.0。主要在 Unix 世界被使用。
优点:由于使用C语言实现,运行速度快。
缺点:安全漏洞较多。

4) NSS:这是最初由网景公司( Netscape)开发的库,支持 SSL 2.0/3.0, TLS 1.0/1.1,现在主要被浏览器和客户端软件使用,比如 Firefox 使用的就是 NSS 库, Chrome 使用的是一个 NSS 库的修正版。
优点:支持范围广。


10. 假如你的手机即将被有关部门控制,有哪些方法可以彻底擦除手机中的数据,保护自己的信息不被泄露?请至少给出两种方法,并考虑其局限性。

答:

方法一:直接通过手机的恢复出厂设置功能,对手机进行还原操作,清除所有数据。局限性:由于大部分手机在进行数据还原和闪存格式化的时候都是使用快速格式化的方法,这种格式化方法只是改变了分区表,并没有对闪存内的所有数据进行擦除,故使用强制磁道扫描的方法很容易进行数据还原。

方法二:先将手机数据用第一种方法进行清空,然后使用大量无关紧要的数据填满闪存。这样所有的闪存磁道都进行过覆盖,无法恢复数据。局限性:由于闪存的读写速度都比较慢,这种方法需要花费大量的时间。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注