IoT上的缓冲区溢出漏洞

在过去N年里,缓冲区溢出一直是网络攻击中最常被利用的漏洞。 看一下缓冲区是如何创建的,就能知道原因所在。

下面是C语言的一个例子:

第一步,程序员使用 malloc 函数并定义缓冲区内存的数量(例如32位)

第二步,返回指针,指示内存中缓冲区的开始位置

第三步,当程序员需要读取或写入该缓冲区时,程序员都会使用该指针

有了指针,程序员很容易忘记分配给指定缓冲区的实际内存量。编译器在程序中使用元数据来分配适当的缓冲区大小,但是这个元数据通常在构建时被丢弃了。

如果在程序内或程序之间传输的数据随后超出原定义的缓冲区大小,则数据信息将覆盖相邻的内存。这会导致内存访问错误或崩溃,以及安全漏洞。

缓冲区溢出和漏洞利用

黑客可以使用堆栈缓冲区溢出替换带有恶意代码的可执行文件,这样他们就可以利用系统资源,比如堆内存或者调用堆栈的本身。例如,控制流劫持利用堆栈缓冲区溢出,将代码执行重定向到正常操作中以外的位置。

图1 控制流劫持

一旦掌握了控制流程,一个控制流程的劫持者可以修改指针和重用现有代码,同时还可能替换代码。控制流的命令还允许攻击者修改用于间接调用、跳转和函数返回的指针,这些指针会留下一个有效图来隐藏它们的行为。

在发生代码执行之前,动态位址空间配置的随机载入(ASLR)机制和用于检测并防止缓冲区溢出的堆栈金丝雀,这些仍然是一个挑战。

安全: 软件还是芯片负责?

ASLR和堆栈金丝雀是基于软件的缓冲区溢出保护机制,这些机制确实使攻击者更难利用缓冲区溢出。例如,ASLR,动态地重新定位内存区域,以便黑客有效地猜测目标组件的地址空间,如基础可执行文件、库、堆栈内存。不幸的是,最近像 Spectre 和 Meltdown 这样的漏洞泄露了CPU分支预测器的信息,这些明显的原因限制了ASLR的有效性。

另一方面,堆栈金丝雀在内存中的返回指针之前插入小整数。检查这些整数以确保它们没有改变,一个进程就可以使用相应的返回指针。尽管如此,如果黑客们确信包含了正确的金丝雀值,那么黑客们还是有可能读懂这些金丝雀,然后简单地重写它以及随后的缓冲区。此外,虽然金丝雀保护控制数据不被更改,但它们不能保护指针或任何其他的数据。

当然,基于软件的安全解决方案的另一个挑战是,它们极易受到漏洞的影响。据不完全统计,每1000行代码中就有15-50个漏洞,这意味着解决方案中存在的软件越多,漏洞的数量就越大。

当处理这种问题而不仅仅是缓冲区溢出的症状时,一个更加健壮的方法是在芯片中实现安全性,而堆栈缓冲区溢出开发是为了操纵软件程序。了解这类攻击的根本原因,首先要认识到处理器无法确定某个程序是否正确执行。

除了减轻软件缺陷的影响之外,芯片不可能被远程改变。但是一个处理器或者一块芯片必须在运行时识别试图写入内存或外围设备的指令是合法执行还是非法操作。

运行时的芯片安全性

Dover Microsystems 开发了一种叫做 CoreGuard 的技术,这是一个可以与RISC 处理器架构集成在一起的IP core,用于在运行时识别无效的指令。作为RTL交付,解决方案可以针对各种功率和区域需求进行优化,或者修改并支持自定义的处理器扩展。

图2 CoreGuard的体系结构

如图2所示,CoreGuard 体系结构包括一个硬件关联锁,控制主机处理器和系统其他部分之间的所有通信。硬件连接将这些通信汇集到一个政策执行者。

另外,CoreGuard 使用称为micropolicy 的可更新安全规则,这些规则是在高级别专有语言中创建的简单管理策略。 这些规则安装在一个安全的、无法访问的内存区域,与其他操作系统或应用程序代码隔离开来。此外,CoreGuard 还为编译器通常丢弃的应用程序元数据保留一个小的内存分配,用于为系统中的所有数据和指令生成唯一的标识符。这些组件在系统启动时加载。

当一个指令试图在运行时执行的时候,CoreGuard策略执行核心或主机处理器在特权模式下运行时,将指令的元数据与定义的micropolicy交叉引用。 硬件交互只能确保处理器输出有效的内存或外设指令,从而防止无效代码的执行。应用程序会被告知类似于一个零除错误的策略违规,并通知用户。

与主机处理器集成,支持指令跟踪输出、失速输入、非可屏蔽中断(NMI)输入和中断输出所需的所有功能。对于非芯片设计者来说,其CoreGuard技术正被某些 NXP 处理器所设计采用。

消除各种攻击

在缓冲区溢出的情况下,像 CoreGuard 这样的技术的好处是显而易见的。作为经常丢弃的编译器元数据的一部分而捕获的缓冲区大小可以被合并,以限制攻击者在网络上操作系统上访问堆栈的能力。进一步说,同样的原理可以应用于一般的控制流劫持,因为来自内存中不同点的返回值可以在发生之前受到限制。

实际上,这种实时意识也为安全行业创造了一个新的竞争环境。通过在损坏发生之前识别错误或者攻击,用户可以选择动态地重新分配内存,在继续运行相同程序的同时切换到单独的、更安全的程序或日志事件。如何执行代码完全取决于应用程序或业务案例的需要。

何时才能看到zero-day 漏洞的终结呢?!

(本文编译自 http://www.embedded-computing.com/iot/eliminating-buffer-overflow-vulnerabilities-on-the-iot)

原文发布于微信公众号 - 喔家ArchiSelf(wireless_com)

原文发表时间:2018-09-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

对自助提卡系统的一次代码审计

并非有意愿要审计该站,前面的走的黑盒没有过于精彩部分就不在贴上了,对于此系统站你们懂的,多说无益,这套程序是开源的,像这种自助提卡系统相信大家已经不在陌生了,很...

1873
来自专栏陈树义

面对海量请求,缓存设计还应该考虑哪些问题?

1113
来自专栏漫漫全栈路

Python爬虫学习之旅-从基础开始

知其然,知其所以然。使用爬虫,必须要先理解爬虫的原理,先说下爬虫的基本流程和基本策略。

31310
来自专栏FreeBuf

高级CORS利用技术分享

在正式开始分享我的内容前,我要极力推荐大家去看下Linus Särud和Bo0oM发表的两篇,关于Safari特殊字符处理被滥用,导致XSS或Cookie注入的...

1210
来自专栏JackieZheng

AngularJS入门心得2——何为双向数据绑定

  前言:谁说Test工作比较轻松,最近在熟悉几个case,差点没疯。最近又是断断续续的看我的AngularJS,总觉得自己还是没有入门,可能是自己欠前端的东西...

2068
来自专栏Golang语言社区

golang插件化方案

业务线的活动,每一次新活动都做独立项目开发,有大量重复代码,并且浪费数据服务的连接资源;排序服务也许要经常添加业务代码,目前是停服务发布……这些场景为了开发维护...

2363
来自专栏影子

一张图解析 编译器编译流程

39615
来自专栏IT技术精选文摘

如何设计一个 RPC 系统

2108
来自专栏carven

使用yeoman快速搭建前端项目结构

最近在慕课网上观看@Materliu老师的课程React实战–打造画廊应用, 接触到了新的东西–yeoman。前端工程师可以通过yeoman快速的搭建好一个项目...

1050
来自专栏Java成神之路

【转】JAVA之网络编程

网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习。

1797

扫码关注云+社区

领取腾讯云代金券