第二章 系统安全

前言

系统安全版块中的技术,一般是指攻击发生在终端之上,与操作系统息息相关。


二、系统安全

1.栈溢出攻击

栈溢出攻击历史悠久,也是发生在系统侧最基础的攻击。
现代计算机基本上都是建立在 冯-诺伊曼 体系之上,而这一体系有一个最大的问题就是数据和指令都保存在存储器中。
在这里插入图片描述

在计算机的内存中,既包含了程序运行的所有代码指令,又包含了程序运行的输入输出等各种数据,并没有一种强制的机制将指令和数据区分。因为对于计算机来说它们都是一样的二进制0和1,大部分时候都是靠程序按照既定的“规则”去解释理解内存中的这些0和1。而一旦这些“规则”理解错误,事情就变得糟糕起来。
具体到我们现代CPU和OS,不管是x86/x64处理器,还是ARM处理器,均采用了 寄存器堆栈式 的设计,而这个堆栈中,既包含了程序运行各个函数栈帧中的变量数据等信息,还保存了函数调用产生的返回地址。
在这里插入图片描述

所谓栈溢出攻击,则是通过一些手段输入到栈中的缓冲区中,冲破缓冲区原有的界限,
将存储返回地址的位置覆盖为一个数值,使其指向攻击者提前布置的恶意代码位置,
劫持了程序的执行流程。

2.整数溢出攻击

和栈溢出攻击一样,整数溢出攻击也是属于溢出类攻击,不一样的是溢出的目标不是栈中的缓冲区,而是一个整数。
在这里插入图片描述

我们知道,计算机数值以补码的方式表示和存储。在表示一个有符号数时,最高位是用来表示这是一个正数(0)还是一个负数(1),比如对于一个16位的short变量而言,+1和-1的表示方法如下:

+1: 0000 0000 0000 0001
-1: 1111 1111 1111 1111

一个16位的short变量表示的范围是-32768~32767,现在思考一个问题,假如一个short变量的值现在是32767:

32767: 0111 1111 1111 1111

如果现在对其执行+1操作,将变成:

1000 0000 0000 0000
而这正是-32768的补码形式!
试想一下,如果这个变量名字叫length作为strcpy参数,
或是叫index作为数组的下标,
整数的溢出将导致可怕的后果,轻则进程崩溃,服务宕机,
重则远程代码执行,拿下控制权。

3.空指针攻击

空指针一般出现在指针没有初始化,或者使用new进行对象创建/内存分配时失败了,而粗心的程序员并没有检查指针是否为空而进行访问导致的攻击。
在这里插入图片描述

大多数情况下,这将导致内存地址访问异常,程序会崩溃退出,造成拒绝服务的现象
而在一些特殊的情况下,部分操作系统允许分配内存起始地址为0的内存页面,
而攻击者如果提前在该页面准备好攻击代码,则可能出现执行恶意代码的风险。 

4.释放后使用攻击

释放后使用 Use After Free 意为访问一个已经释放后的内存块。较多的出现在针对浏览器的JavaScript引擎的攻击中。
在这里插入图片描述

	正常情况下,一个释放后的对象我们是没法再访问的,
	但如果程序员粗心大意,在delete对象后,没有即时对指针设置为NULL,
	在后续又继续使用该指针访问对象(比如通过对象的虚函数表指针调用虚函数),
	将出现内存访问异常。

	在上面的场景中,
	如果攻击者在delete对象后,马上又new一个同样内存大小的对象,
	在现代操作系统的堆内存管理算法中,
	会有很大概率将这个新的对象放置于刚刚被delete的对象的位置处。
	这个时候还通过原来对象的指针去访问,将出现鸠占鹊巢,出现可怕的后果。
	
	养成好的编程习惯,对象delete后,指针及时置空。

5.HOOK攻击

	HOOK原意钩子的意思,在计算机编程中时常用到,用来改变原有程序执行流程。
	
	在那个互联网充斥着流氓软件的年代,流行着一种键盘记录器的木马,
	用于记录用户键盘的输入,从而盗取密码,这其中QQ曾经是重灾区。

在这里插入图片描述

	而实现这一功能的技术就是用到了HOOK技术,钩到了键盘敲击的事件消息。
	
	除了消息HOOK,用得更多的是程序执行流程层面的HOOK。
	恶意代码被注入目标程序后,在函数入口处添加跳转指令,
	导致执行到此处的线程转而执行攻击者的代码,实现修改参数、过滤参数的目的。

在这里插入图片描述

HOOK技术不仅为黑客使用,安全软件用的更多,安全软件需要守护整个系统的安全防线,
通过HOOK技术在各处敏感API处设立检查,从而抵御非法调用攻击行为。

另外,软件补丁技术中也时常用到HOOK技术,软件厂商发现原来程序漏洞后,
通过HOOK,修改既有程序的执行逻辑,从而达到修复漏洞的目的。

6.权限提升

现代操作系统都对运行于其中的进程、线程提供了权限管理,因为安全攻击无可避免,而权限的限制作为一道颇为有效的屏障将程序被攻击后的影响减少到最小。

换句话说,即便我们的程序因为漏洞原因被攻击执行了恶意代码,但因为操作系统的权限控制,恶意代码能干的事情也有限。
在这里插入图片描述

	就像一枚硬币总有两个面,有权限限制,自然而然就有权限提升。
	攻击者想要做更多事情,就得突破操作系统的限制,获取更高的权限。
	
		在Windows上,经常叫获得管理员权限。
		在Linux上,经常叫获得Root权限,手机Root也是这个意思。
		在iOS上,经常叫“越狱”。
	
	权限提升的方式五花八门,总体来说,程序执行的时候,
	所属进程/线程拥有一个安全令牌,用以标识其安全等级,
	在访问资源和执行动作的时候由操作系统内核审核。
	
	权限提升的目标就是将这个安全令牌更改为高等级的令牌,
	使其在后续访问敏感资源和执行敏感动作时,凭借该令牌可以通过系统的安全审核。

在这里插入图片描述

而更改这个安全令牌的惯用伎俩便是利用操作系统内核漏洞
(如前面所述的栈溢出、整数溢出、释放后使用等)执行攻击者的代码,
实现安全令牌的篡改。

7.可信计算

安全攻击无处不在,不仅应用程序的环境不可靠,甚至连操作系统内核的环境也充满了风险。
在这里插入图片描述
如果一段程序(比如支付)必须在一个极度绝密的环境下执行,该怎么办?

可信计算的概念被安全研究者提了出来,根据百科的解释:

	可信计算/可信用计算(Trusted Computing,TC)
	是一项由可信计算组(可信计算集群,前称为TCPA)推动和开发的技术。
	可信计算是在计算和通信系统中广泛使用基于硬件安全模块支持下的可信计算平台,以提高系统整体的安全性 [1]。
	签注密钥是一个2048位的RSA公共和私有密钥对,它在芯片出厂时随机生成并且不能改变。
	这个私有密钥永远在芯片里,而公共密钥用来认证及加密发送到该芯片的敏感数据。

在这里插入图片描述

	可信计算中一个非常重要的概念是可信执行环境TEE(Trusted Execution Environment),
	简单来说就是在现有的计算机内部的世界里,再构建一个秘密基地,专门用于运行极度机密的程序。
	该秘密基地甚至连操作系统都轻易无法访问,更别说操作系统之上的应用程序了。
	
	在移动端,ARM芯片占据了主流市场,ARM芯片提供了名为TrustZone技术的技术,
	在硬件层面新增一个可信计算环境,包含一个可信OS,和一些可信APP,和普通环境在硬件层面隔离,
	处理器内部进行通信完成两个世界的交互。

posted @ 2022-09-09 11:44  天堂在左我在右  阅读(207)  评论(0)    收藏  举报