安全

环境与安全

目标威胁
数据机密性:数据持有者可指定谁可以获取数据,系统会强制执行规则数据暴露
数据完整性:改动数据应该需要得到许可数据篡改
系统可用性:没有人可以扰乱系统使之瘫痪拒绝服务

操作系统安全

可信系统

现代操作系统复杂的功能决定了必然不存在某种方式来确保绝对安全

可信计算基(TCB)

实施安全规则所必须的硬件和软件

屏幕截图 2020-12-05 163948

通过访问监视器,接收所有系统请求 由其决定是否运行

必须包含在TCB的功能:

保护机制

制订可以做的事情,描述系统哪些资源需要保护

保护域

系统中有许多对象,域就是(对象,权限)对的集合

进程会在某个域中运行 可以获得对象的权限,需要时,可以切换域,这样对象的权限也会发生改变

屏幕截图 2020-12-05 165044

满足最小权限原则,安全性将达到最好

保护矩阵

系统可以通过保护矩阵来跟踪确定对象属于哪个域

屏幕截图 2020-12-05 165250

访问控制列表(ACL)

对于稀疏的对象权限,矩阵会浪费大量空间,使用ACL:

屏幕截图 2020-12-05 170213

ACL也不仅可以只对用户授权 也可以对用户组进行授权:

UID,GID:permissions;

同时,可以引入通配符来使用户可以访问与当前登录组无关的情况

也可以使用另外一种方式来管理用户和用户组:

File:UID1:RW;UID2:RWX

通过ACL 可以很方便对用户进行赋权收权

权能字

屏幕截图 2020-12-05 171408

防止权能字被修改:

  1. 内存字必须拥有额外的位来判断是否包含权限字
  2. 在操作系统保存权能字列表
  3. 在用户空间对权能字加密管理

相对来说 权能字效率较高 ACL需要进行搜索操作

安全系统的形式化模型

多级安全

强制性的访问控制:确保系统的安全策略被强制执行

屏幕截图 2020-12-08 184525

实现:为用户分配安全级别,shell获取级别,该安全级别随着shell创建的所有子进程继承下去

隐蔽信道

也称为边信道 指应用程序可以通过各种精巧的信道,如CPU使用率 声音等来向外传输信息

隐写术:通过利用某些文件的编码,将信息编入文件,从而携带出去

可信平台模块

TPM:硬件加解密模块

认证

UNIX通过对密码加盐的方式抵御大部分外部攻击

单向散列链:通过初始化对一个密码进行n轮散列运算,第i次登陆的密码散列就是n-i+1次散列运算结果

通过为用户选择一种运算,服务器传递给用户一串参数,用户运算后回传相关结果来进行认证。运算方式可以经常发生变化

物理识别

生物识别

注册部分:提取用户特征后进行存储

识别部分:比对登录用户特征与存储的用户特征

软件漏洞

红皇后效应:不进则退

缓冲区溢出攻击

void A(){  char B[128];  gets(B);}

屏幕截图 2020-12-11 170142

超过缓冲区长度的数据将会直接覆盖到栈上,攻击者可以借此重写返回地址 从而让程序跳转到某个地方

这种类型的漏洞适用于任何复制缓冲区中用户提供的数据且不做任何边界检查的情况

空指令滑行区

如果无法猜测到返回地址,则填充大量无操作的机器指令并最终附带恶意代码,只要代码执行到此处,最终都会被运行

栈金丝雀保护

通过编译器在返回地址下面插入个随机值,函数返回时检查这个随机值 如果不匹配,就停下来

数据执行保护(DEP)

只要禁止在堆和栈执行字节就能避免溢出攻击(但这个措施不现实),现代操作系统通过一个NX位来保证某些区域的数据可写不可执行或者可执行不可写

地址空间布局随机化(ASLR)

随机化程序每次运行所用的函数和数据的地址

ASLR

非控制流转向攻击

此种攻击并非是劫持程序控制流 同样是通过溢出的方式修改栈内变量来改变程序执行结果

格式化字符串攻击

printf(gets())

输入格式化字符串可以覆盖内存

悬垂指针

int *A = (int *)malloc(128);//...free(A);A[0] = xx;

内存空间释放后 这样的操作极有可能将别处缓冲区的数据覆写

空指针间接引用攻击

现代操作系统都会进行内存映射 如果进程的内存空指针真正映射到地址0 那除了进程崩溃之外 攻击者可以通过某种手段进行映射修改 使之映射到某段恶意代码

整数溢出攻击

如图形程序通过整数溢出的方式来修改高度宽度 这样图像的内存也很容易溢出 从而造成跟缓冲区溢出类似的效果

命令注入攻击

可执行空间保护:对于一个进程使用的内存,只把其中的指令部分设置成“可执行”的,对于其他部分,比如数据部分,不给予“可执行”的权限

原理同注入攻击一样,都是由于将用户输入的数据当做代码执行

检查时间/使用时间攻击

假设系统先检查 后打开文件 攻击者利用竞争条件在中间创建一个本不属于自己的符号链接 可能会导致权限验证失效

内部攻击

恶意软件

特洛伊木马

病毒

一个插入到正常程序的恶意程序,称之为感染 让感染的程序被运行,会感染其他程序 从而继续传播

局域网可传播病毒的原因:局域网的计算机通常能直接通过网络登录并执行命令

屏幕截图 2020-12-14 171120

蠕虫

间谍软件

间谍软件的扩散:

间谍软件的行为:

rootkit

试图隐藏自身的存在

除了管理程序或者主动rootkit(会对检测程序进行干扰),其他都可以通过文件散列方式来进行查找rootkit

防御

防火墙

通过一系列的规则来决定是否对网络流量放行

反病毒和反反病毒

通过放出一个不执行任何操作的诱饵程序让病毒感染 获取病毒的完全代码表并上报到数据库

数据库的病毒特征可以下载下来与本地程序进行对比扫描,可以通过记录文件的属性来提高效率,但病毒可能会对程序进行压缩逃避此类扫描

屏幕截图 2020-12-15 161607

病毒为了逃避扫描软件的特征扫描 可能会通过每次感染加解密并使用不同密钥的方式进行变换形态

另外一种方式是交换机器码指令而不影响程序功能来躲避扫描 同时有些病毒会控制系统调用,扫描软件有时就必须跳过操作系统直接操作物理硬盘来进行扫描

通过在信任状态时对系统文件进行求校验和 当下次发现校验和不一致时就能发现被感染 这种情况需要注意对校验和的存放及加密

如覆盖引导扇区的程序几乎可以断定是病毒 但如覆盖可执行程序就是一个特殊操作,反病毒软件应该发出一个警告

代码签名

只允许那些来自可靠厂商的软件

通过公钥密码体系来验证软件是否被篡改过

囚禁

基于模型的入侵检测

通过生成正常程序的系统调用图来检测程序是否被感染

攻击者会使用模拟攻击来生成与原有程序相同的调用图迷惑IDS

对于更多的IDS,使用称为蜜罐的系统来监视攻击并提取相关特征

可下载代码病毒防御