嵌入式应用中常见的安全威胁

描述

越来越多的嵌入式设备存在互联需求,在安全应用开发中,除功能安全外,应用还需考虑信息安全。

功能安全软件需要很长时间来开发和验证,确保其稳健可靠,因此很少更新。相比之下,安全威胁在不断演变,随着黑客的学习和发展,攻击变得越来越复杂。

本文提供了一个简短的威胁示例列表,以帮助了解为什么信息安全对于嵌入式系统的开发非常重要。

伪造消息

可以访问通信通道(如以太网、CAN、SPI、UART等)的攻击者伪造一个有效的消息。

例如:在带有指纹识别的电子门锁系统中,攻击者绕过指纹识别器直接向门锁发送“开门”信息。

可以通过对所有消息进行身份验证来防止这种攻击。例如,门锁检查电子签名或消息认证码,以确保接收到的消息来自指纹识别器。

重放攻击

攻击者在指纹认证期间记录有效的消息,并在稍后的时间点注入该消息开门。

可以尝试使用不断增加的简单消息计数器来防止这种攻击。如果收到一个与前一个消息相同或更低的计数值,门锁就会检测到伪造的信息。

如果攻击者能够阻止原始消息到达接收方,则计数器方法不再起作用。可以使用每次传输消息时包含时间戳的方法,并且所有系统都需要具有同步时钟。

通过除零错误拒绝服务

假设协议定义有一个整数字段,其值不包括零。攻击者在这样的协议消息中发送一个0值。如果不检查接收的值并将其用于除法运算,则会触发CPU异常。此时系统进入安全状态,停止响应。

缓冲区过读导致的信息丢失

2014年,Heartbleed心脏滴血漏洞(CVE‑2014‑0160)被发现。攻击者将长度字段设置为高于协议允许的数字,利用该漏洞获取信息。

在OpenSSL相应版本实现中缺少长度检查,导致从堆缓冲区中读取并向攻击者发送更多的字节数据,从而泄漏了内存中的敏感信息。

通过缓冲区溢出执行远程代码

CPU将函数调用的返回地址存储在堆栈上,并通过降序方式使用堆栈(如ARM或x86)。

假设调用了一个函数,并在堆栈上分配了一个固定大小的通信缓冲区,通信缓冲区的地址低于存储的函数返回地址。

有缺陷的协议实现将接收的消息复制到该缓冲区时,不验证消息的长度。因此,如果接收的消息长度大于分配的缓冲区,则函数返回地址将被消息内容覆盖。

在函数返回时,将被覆盖的返回地址从堆栈中加载执行。通过猜测或分析固件,攻击者使CPU执行其发送的指令。

针对RSA的定时攻击

一种容易理解的针对私钥操作(生成签名或解密消息)的不良实现的攻击。在算法实现中,有一个提升消息数据私钥的幂操作步骤:

安全威胁

下面的算法有效地实现了这个幂运算:

安全威胁

此操作完成所需的时间与私钥中1的位数成正比。攻击者可以在搜索密钥时使用此时间信息。

故意关闭电源

不可靠的更新机制接收更新文件后,将更新文件保存在flash中,并验证其签名。如果签名无效,更新机制会重新擦除flash内存。

在更新机制擦除flash之前,攻击者可以在验证程序检查签名时切断电源。下次启动时,不安全的软件将被执行。

滥用非标准编码

在unicode中,正斜杠(/)的编码为U+002F。在UTF-8中,编码为0x2F。简单的UTF-8解码器也可能将两字节序列0xC0 0xAF解码为正斜杠。这被称为过长编码,根据RFC 3629(2003年发布,在RFC 2269中没有这样的要求),解码器不应该接受这样的字节序列。

假设有一个系统为文件系统中的一些文件提供服务,只能接收来自一个目录的文件,文件名使用UTF-8编码。为了减少计算时间和软件复杂性,它不会检查过长的编码。

为了强制要求所有请求的文件来自某个特定目录,通信端点拒绝文件名包含正斜杠的所有请求,通过扫描字节0x2F来实现,任何不包含此字节的请求都被接受。

由于通信端点和文件系统在API接口上没有精确地达成一致,攻击者可以使用字节序列‘0xC0 0xAF’将斜杠通过协议验证进入文件系统,并访问文件系统上的任何文件。

在Apache Tomcat中发现了一个类似的错误(CVE‑2008‑2938)。

如今,公司很少对嵌入式软件开发人员进行IT安全方面的培训,开发人员很难想象攻击者在为检测和利用系统中的弱点所做的常规工作。这种知识的缺失导致他们低估了即使是看似微不足道的错误也可能产生的影响。文中列举了嵌入式应用中常见的安全危险,通过这些例子提高人们的安全意识。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分