现代操作系统:安全

安全目标

从安全性角度来讲,计算机系统有3个主要目标:

  • 数据保密性
  • 数据完整性
  • 系统可用性:没有人可以扰乱系统使之瘫痪,避免拒绝服务

如果有一台计算机作为Internet服务器,那么不断地发送请求会使该服务器瘫痪,因为单单是检查和丢弃进来的请求就吞噬掉了所有的CPU资源。

密码学原理

加密的目的是将明文通过某种手段变为密文,只有经过授权的人才知道如何将密文恢复为明文。
加密算法中使用的加密参数叫做密钥,把明文和加密密钥作为参数,加密算法就可以把明文变为密文。
加密和解密算法(函数)应该是公开的,而密钥则是应该严格保密的。
解密时,把密文和解密密钥作为参数,解密算法就能把密文变为明文。

私钥加密技术

类似字母表单字母替换这样的密钥系统,给定了加密密钥就能容易找到解密密钥(或者加密密钥就是解密密钥),属于私钥加密技术或对称密钥加密技术
如果密钥有足够的长度,对称密钥机制还是相对比较安全的,但对政府部门来说确实不安全的。

公钥加密技术

公钥加密技术的特点是:加密密钥和解密密钥是不同的,并且不可能根据加密密钥推出对应的解密密钥。在这种特性下,加密密钥可被公开,而只有解密密钥处于秘密状态。
互为逆运算(如平方和求平方根)的两种运算,其复杂性大大不同。这种不对称性构成了公钥密码体系的基础:加密运算比较简单,而没有密钥的解密运算却十分繁琐。
使用公钥密码体系时,每个人都有一对密钥(公钥和私钥),并把其中的公钥公开。

数字签名

在电子交易等场景中,为了防止双方抵赖,使用数字签名。其中一种常用的方法是首先对文档进行一种单向散列运算,产生一个固定长度的结果值。

最常用的散列函数有MD5,一种可以产生16个字节结果的算法;SHA-1则可以产生20个字节结果的算法。

下面,假设我们使用一个私钥密码,将得到的散列值进行运算得到D,该值称为签名块,它被附加在文档后传送给接收方。

这一过程类似进行散列解密,但并不是真正意义上的解密,因为散列值没有被事先加密。


接收方收到文档和散列值后,首先使用事先获知的MD5或SHA算法计算文档的散列值,然后用收到的公钥对签名块进行运算得到E。这实际上是对解密后的散列进行“加密”,目的是解密—加密相抵消,以恢复原有的散列。
如果E不等于接收方自己计算的散列值,说明文档或签名块被篡改过了。
注意:
这里要求加密函数和解密函数是可交换的,即

E(D(x))=D(E(x))=x

认证

每个安全的计算机一定会要求所有的用户在登录的时候进行身份认证。企图入侵系统的人称为黑客黑客分为不从事非法活动的白帽子黑客和从事破坏活动的黑帽子黑客(骇客)。

使用口令认证

最广泛使用的认证方式是要求用户输入登录名和口令。实现方式是保存一张包含登录名和口令的列表。

一次性口令

单向函数y=f(x),给定x我们很容易计算出y,但是给定y却很难计算出x。输入和输出必须是相同的长度,如256位。
用户选取一个口令s,以及一个整数n,该整数确定了算法所能够生成的一次性口令的数量。例如考虑n=4,那么通过单向函数计算n次得到的第一个口令为:P1=f(f(f(f(s)))),第二个口令为P2=f(f(f(s))),第三个口令运算2次,第四个运算1次。
给定任何序列的口令,我们很容易计算出口令序列中的前一个值,但不可能计算出后一个值

使用实际物体认证

磁条卡、储值卡和智能卡

使用生物识别认证

一个典型的生物识别系统由两部分组成:注册部分和识别部分。
注册部分将用户的特征数字化储存,并把最重要的识别信息抽取后存放在用户记录中。
识别部分要求用户输入登录名和进行系统识别。仅仅根据检测到的识别信息来判断是不严格的。
常用的识别手段有虹膜、指纹、签名、声音测定。

内部攻击

内部攻击来自一些公司的编程人员或使用这些受保护的计算机、编制核心软件的员工。

逻辑炸弹

逻辑炸弹是某些当前被雇佣的程序员写的程序代码,被秘密地放入产品的操作系统中,平时相安无事,一旦程序员被解雇了,逻辑炸弹就会因为得不到口令而发作。

后门陷阱

后门陷阱由系统程序员跳过一些通常的认证过程并插入一段代码造成的,如程序员可以在登陆程序中插入一小段代码,使所有用“zzzzz”登陆的用户成功登录而无需密码。
防止后门的一个方法是代码审查

登录欺骗

这种内部攻击的实施者是系统的合法用户,而这些合法用户却试图通过伪造登录窗口的手段获取他人的密码。

利用代码漏洞

外部人员通过互联网,利用操作系统或被广泛使用的软件(如IE和OFFICE)中的漏洞进行攻击和破坏。

缓冲区溢出攻击

操作系统和其他应用程序都是用C语言写的,但没有一个C编译器可以做到数组边界检查
这里写图片描述

主程序运行时局部变量是放在栈里的,当调用过程A时,标准的调用步骤是先把返回地址压入栈,然后把控制权交给A。当攻击者提供了一个超出数组边界的数据时,当过程A把数据复制到缓冲区时,数据溢出,并覆盖了返回地址。当覆盖返回地址的部分数据被设计成另一个过程的地址时,当A结束运行时,过程B就会开始运行。
更糟的是,恶意代码可以通过互联网下载程序或脚本,创建进程,监听IP端口,从而等待攻击者的命令。

格式化字符串攻击

当程序读入一个格式化字符串时,任何格式化标识符都会起作用。一旦用户有了输入格式化字符串的机会,打印一个格式化字符串就可能导致内存被重写。这就为覆盖栈中printf函数的返回地址提供了一种方法。通过重写这个返回地址,可以使得函数在printf函数返回时跳到任何位置,例如刚刚输入的格式化字符串。这种攻击方式叫做格式化字符串攻击

返回libc攻击

缓冲区溢出攻击和格式化字符串攻击都要求向栈中加入必要的数据,并将函数返回的地址指向这些数据。一种防止方法是设定栈页面为读/写权限,而不是执行权限。
还有一种在栈不能被执行的条件下也能奏效的攻击方式,叫做返回libc攻击。
几乎所有的C程序连接了libc库,这个库包括了C程序几乎所有的关键函数,其中一个就是strcpy。该函数将一个任意长度的字符串从任意地址复制到另一地址。这种攻击的本质,是欺骗strcpy函数将恶意程序复制到数据段并在那里执行。
攻击者将调用过程A的返回地址改写成strcpy的地址,当A执行完毕后,实际上进入了strcpy。在strcpy中,栈指针将strcpy的返回地址又伪造成为攻击者的恶意代码的地址。strcpy负责将恶意代码复制到可执行的数据段,并在结束时跳到恶意代码处执行。

整数溢出攻击

计算机进行定长整型数的运算,如果相加或相乘的结果超过了整型数可以表示的最大值,就称溢出发生了。
例如,两个16位无符号整数的值都是40000,如果将其相乘的结果存入另一个16位的无符号整型变量中,其结果将是4096。
由于这种溢出不会被检测,因此可能被用作攻击的手段。一种方式就是给程序传入两个合法的参数,他们的和或乘积将导致溢出。

代码注入攻击

使得目标程序执行它所不期望的代码是一种攻击形式,如攻击者将Cp abc xyz中的第二个参数xyz替换为xyz;rm -rf,命令就变成了Cp abc xyz;rm -rf。当调用system执行这条命令时,分号后面的字符也会执行。

恶意软件

木马、病毒和蠕虫被统称为恶意软件。当一台机器被感染,恶意软件被安装,并且向控制者的机器报告了地址,以便犯罪者可以随时向该机器发送指令,以这种方式被控制的机器叫做僵尸机器。所有被控制的机器合起来称作僵尸网络

特洛伊木马

木马指的是人们自愿下载的软件中所隐藏的恶意软件
含有木马的程序运行时,它调用函数将恶意代码写入磁盘成为可执行程序并启动该程序。恶意代码还包括一些指令使得它在计算机每次重新启动时自动启动。

病毒

病毒是一种特殊的程序,它可以通过把自己植入到其他程序中来“繁殖”,就像真正的病毒那样。

病毒工作原理

病毒制造者可能用汇编或C写了一段很小的病毒,然后利用一个叫做dropper的工具把病毒插入到自己的计算机程序里,然后人们下载这一病毒程序。
病毒可感染7种不同的文件,分别是:共事者、可执行程序、内存、引导扇区、驱动器、宏以及源代码病毒。

共事者病毒

在MS-DOS中,当用户输入

prog

MS-DOS先查找叫做prog.com的程序,如果没有找到就查找叫做prog.exe的程序。大多数程序都是.exe文件,.com文件很少了。但如果骇客编写了一个叫做prog.com的病毒,当人们试图运行prog的时候,病毒就先运行了,当prog.com运行完毕后,它再让prog.exe运行以迷惑用户。

可执行程序病毒

更复杂的一类病毒是感染可执行程序的病毒。有相当多的病毒把自己附在正常程序里,在病毒发作的同时让原来的程序正常运行,这种病毒称为寄生病毒
寄生病毒可以附在可执行文件的前端、后端或者中间。大多数病毒是后端装入的,并且把文件头的起始地址指向病毒。

内存驻留病毒

内存驻留病毒总是驻留在内存中,要么藏在内存上端,要么藏在下端的中断变量中,聪明的病毒还能避免自己被其他程序覆盖。
典型的内存驻留病毒通过将自身的地址放入陷阱或中断向量中的位置,系统俘获陷阱或中断向量时运行病毒。

引导扇区病毒

大多数计算机开机时,BIOS读引导磁盘的主引导记录放入RAM并运行,引导程序读取活动分区的引导扇区,并装入系统。
这种病毒首先把引导记录扇区复制到磁盘的安全区域,这样就能在完成操作后正常引导操作系统。

设备驱动病毒

宏病毒

在Word和Excel等软件中,宏可以包含程序段,因此可以做任何事情。

源代码病毒

寄生病毒和引导区病毒对操作系统平台有很高的依赖性,最具移植性的病毒是源代码病毒,它不是寻找可执行的二进制文件,而是寻找C语言程序并加以改变。
感染过程可以是在源程序的文件头插入:

#include<virus.h>

还可以插入下面一行来激活病毒:

run_virus();

间谍软件

间谍软件是一种快速扩散的恶意软件,在用户不知情的情况下加载到PC上并在后台做一些超出用户意愿的事情。
间谍软件的常见行为有:

  • 更改浏览器主页
  • 修改浏览器收藏页
  • 在浏览器中增加新的工具条

以上三条改变了浏览器的行为,叫做劫持浏览器

  • 更改用户默认的媒体播放器
  • 更改用户默认的搜索引擎

这两条修改了Windows注册表的设置。

防御

全面防御是指你必须有多层的安全性,以便于当其中的一层被破坏,仍然还有其它层可以防御。

防火墙

中世纪的城堡周围有护城河,这样的设计强制每个进出城堡的人都要经过唯一的吊桥,对于一个公司而言,所有进入或离开公司的网络流都要强制地通过一个电子吊桥——防火墙。
防火墙分为硬件防火墙和软件防火墙。有局域网需要保护的公司通常选择硬件防火墙,而家庭个人用户通常会选择软件防火墙。

硬件防火墙

外网的连接(电缆或光纤)被插到防火墙上,防火墙则连接到局域网上。不经过防火墙的允许任何包都不能进入或者离开局域网。
这里写图片描述
防火墙定义一些规则,允许包进入或丢弃它。最简单的防火墙是无状态防火墙,它只会检查通过的包的头部,包括源和目的的IP地址、端口、服务的类型和协议。例如,服务器207.68.160.190的端口80被Web使用,那么,只有当包是发送到207.68.160.190的端口80时,包才允许进入。
但即使有了防火墙,局域网还是可能遭受攻击。例如攻击者给Web服务器发送一个很长的URL,然后制造一个缓冲区溢出,进而控制该服务器发动对局域网内其他机器的攻击。

软件防火墙

软件防火墙(个人防火墙)和硬件防火墙具有同样的功能,只不过是附加在操作系统内核的网络代码上的过滤器。

反病毒和抑制反病毒技术

当防火墙失败时,下一道防线是杀毒软件。

病毒扫描器

杀毒软件的工作原理:

  1. 让病毒感染不执行任何操作的程序(诱饵文件),获取病毒的完整内容;
  2. 列出病毒的完整代码表把它输入病毒数据库;
  3. 杀毒软件扫描硬盘里所有可执行文件,看是否发现病毒库里已知的病毒;

当用户的文件很多,病毒库也很大时,高效的匹配是必要的。已知病毒总是不断变化的,所以人们需要一种模糊查询方法。

完整性检查程序

另一种病毒检测方法是完整性检查,杀毒软件首先扫描硬盘上的病毒,确信硬盘是干净的,然后为每个可执行文件计算一个校验和,并把目录中的所有相关文件的校验写到一个文件中去,下次运行时,程序重新计算校验值。

行为检查程序

杀毒软件在系统运行时驻留在内存里,并自己捕捉所有的系统调用,如果出现覆盖引导扇区等可疑操作,就能发现可能的病毒。

代码签名

一种完全不同的防御方法是只运行那些来自可靠的软件厂商的软件,验证的方式是代码签名。
代码签名也是基于公钥密码体系的,软件厂商将公钥公开,私钥保存。供应商先将代码进行(MD5或SHA-1等)散列函数运算,然后通过私钥加密取得散列值的数字签名。这个数字签名附在软件里。
用户得到软件后,也计算散列值,然后将附带的数字签名用公钥进行解密,如果解密后的值和自己刚才计算出的散列值相等,这个软件就被接受。

Java安全性

Java是一种在类型上安全的编程语言,Java没有指针变量,类型转换,用户控制的存储单元分配(malloc和free),并且所有的数组引用都要在运行时进行校验。
Java程序被编译成一种叫做JVM(Java Virtual Machine,Java虚拟机)字节码的中间形态二进制代码。JVM有大约100个指令,大多数指令是把不同类型的对象压入栈、弹出栈或是合并栈里的对象。这些JVM程序通常是解释执行程序。
通过Internet发送到远程计算机上运行的Applet是JVM程序。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值