作者:开心123 | 来源:互联网 | 2023-10-10 08:53
没有一款软件或平台敢说自己是绝对安全的。
软件漏洞永远存在,我们的目的是通过细致的软件设计,良好的编码,发现漏洞后快速的响应来尽量减少软件漏洞的产生,以及降低漏洞被利用后所带来的危害。
下面介绍一下iOS中(当然也适用于其他平台)中几种常见的漏洞的来源。
一:缓冲区溢出(buffer overflows)
缓冲区溢出是软件安全漏洞的主要来源。所谓缓冲区溢出,指的就是代码写入的数据超过了缓冲区的边界,比如向大小10KB的缓冲区写如12KB的数据,那么这个缓冲就溢出了。当然,前向溢出也算溢出,也就是写入的数据写入到了缓冲区的起始边界之前。
缓冲区溢出是一种比较常见的编码错误,特别是在字符串处理过程中。缓冲区造成的危害也是比较多样的。比较轻微的就是程序直接崩溃,除了用户体验也没什么大损失;比较严重的就是错误的写入覆盖了其他敏感数据,造成数据的丢失;最严重的莫过于执行恶意代码,因为数据写入越界,恶意代码可以将原先正常的函数返回地址修改为自己的代码,从而获得整个软件的执行权。
缓冲区溢出根据溢出的内存类型分为:
栈内的数据溢出。
堆内的数据溢出,
根据溢出的类型可分为overflow及underflow
- overflow,写入的数据超过了缓冲的边界
- underflow, 缓冲中有用数据的大小小于缓冲区长度,这有可能造成脏数据的问题
二:未验证输入(Unvalidated Input)
一款应用往往需要接收各种各样的输入,针对一款iOS应用,主要的输入有读取文件,读取用户输入,读取网络传输数据,或通过URL被启动(URL Schema)。各种类型的输入都有可能是非法的,甚至是恶意的,所以针对所有类型的输入,应用都要进行检验,确保输入的数据是符合程序要求的,合理的,合法的数据。
非法输入可能造成的危害主要有:
- 输入的数据大于接收缓冲,会造成缓冲溢出
- 格式化字符串注入,对这些字符串进行处理时,如果不小心会造成程序的崩溃,或某些敏感数据被篡改
- URLSchema中的命令为恶意命令,执行了恶意的命令
- 代码注入,输入的URL或命令中带有脚本、代码等恶意片段
三:竞争条件(Race Condtions)
如果一个任务的完成需要几个特定的子任务以特定的顺序完成来完成,那么这个任务就是存在竞争条件这个漏洞的。黑客可以通过修改事件完成的顺序来改变应用的行为。
竞争条件类型的漏洞主要有以下两种:
- Time of Check Versus Time of Use (TOCTOU)
应用运行的过程中,在某个操作之前,比如写文件,都会检查一下文件是否存在,在检查与真正的写入之间的间隔就是一个可以被利用的Race Condition,恶意软件可以将用户检查的文件替换成自己的文件,这样数据就泄露了。
处理信号的过程中,是随时可以被另一个信号的处理打断的,如果在处理一个信号的过程中另一个信号到来,那么这个过程会被马上中断,这样,系统就会处于一种未知的状态。
四:进程间通信(Interprocess Communication)
进程间通信采用的方法很多,共享内存,管道,油槽等,由于通信管道两端的应用的不同,那么,有可能存在这钟管道被恶意利用的肯能性,也就是说,进程间通信也是软件漏洞的一个来源,当与另一个应用通信的时候,要默认此应用是不安全的,要对通信的内容进行安全方面的验证。
五:不安全的文件操作(Insecure File Operation)
应用对文件进行处理时,若果没有进行进行有效的验证,那么有可能处理的文件已经是被恶意软件修改过的,是不安全的。所以,进行有效的验证是安全处理文件的重要保证。不安全文件操作类型有以几种:
- 读取或写入一个位于其他应用也拥有读写权限路径下的文件。
- 对文件信息,例如权限等信息没有进行有效验证便进行处理。
- 对文件操作的返回结果没有进行有效利用
- 假定一个拥有本地文件名的文件就是真正的本地文件。
六:权限控制问题(Access Control)
很多情况下,权限控制是安全机制保证的核心,同时也是漏洞的主要来源。每个应用都有与其匹配的权限,应用申请的权限应该物尽其用,不能申请超过自身需求的权限,而很多的软件漏洞就是因为应用申请了超过自身需求的权限,比如root权限,然后被恶意软件利用,也就有了对整个系统执行所有操作的权限。
很多情况下,对权限的申请进行验证是明智的选择,例如输入用户名及密码来提升权限。注意,在采用验证机制时,最好使用系统内置的权限验证方法,而不是自己取实现,这里需要额外提一下,权限控制是操作系统级别的,当硬件设备被控制时,各种权限的控制也就显得无力,这种情况下,数据的加密保护就显现出了其价值。
七:文件的安全存储与加密(Secure Storage and Encryption)
iOS系统提供了多种机制保证用户的数据安全,具体细节在我的另一篇译文: iOS安全机制概览中有较详细的描述,这里不在重复,不过有一点需要额外说明,安全机制方面尽量使用系统自带的机制,在安全性与可靠性上,系统提供机制往往比自身实现的加密保护机制要可靠的多。
八:社会工程(Social Engineering)
用户往往是安全保证机制中那薄弱的一环。即使提供再强大的安全保全机制,如果用户安全意识薄弱,同样会出现问题。很简单的例子,比如用户将密码设置的非常复杂,服务器端数据库的安全保证也很周全,黑客完全无法通过技术手段窃取用户密码,可黑客一个伪装客服的电话就完全有可能将用户的密码从用户的口中骗取到。这就是所谓的“社会工程”. 在界面,使用习惯上教育,引导用户进行安全的操作,也是软件设计的重中之重