如何在嵌入式软件中搜索漏洞
导语:嵌入式软件是黑客攻击的热门目标,因为嵌入式系统几乎存在于所有现代设备中。
嵌入式软件是黑客攻击的热门目标,因为嵌入式系统几乎存在于所有现代设备中。保护嵌入式软件的安全需要专业的开发技能,因为嵌入式设备可以运行的代码量受到严重限制,并且有时无法在发布后更新安全配置。这就是为什么开发人员在搜索潜在漏洞时必须非常注意的原因。
在我们之前的一篇文章中,我们讨论了对嵌入式系统的常见攻击(上、下)。这一次,我们的一位专家分享了他关于如何对基于 Linux 的嵌入式软件进行快速漏洞搜索、自动化此过程以及验证安全问题是否确实威胁到您的软件的知识。
本文对从事嵌入式软件和固件的安全测试人员、QA 工程师和软件开发人员很有用。
嵌入式软件漏洞的利用有多危险?
嵌入式软件是控制嵌入式系统操作的代码。创建此类系统是为了在更大的机制中执行特定功能。它们体积小、节能且能够实时工作。这就是为什么此类系统广泛用于现代设备的原因:交通信号灯、汽车、计算机、飞机、冰箱、起搏器等。
嵌入式系统的广泛使用使其软件成为黑客攻击的热门目标。网络犯罪分子在嵌入式软件代码中寻找已公布的0 day漏洞,以控制设备或窃取他们收集的数据。
让我们看一下在广泛使用的嵌入式系统中发现的几个漏洞示例,并探讨其漏洞利用的可能后果:
· Urgent//11 — 安全研究人员在 VxWorks 固件中发现了 11 个0 day漏洞。这种实时操作系统 (RTOS) 用于大约 20 亿台设备,包括医疗和制造设备、基础设施元素和电话。这些漏洞允许黑客远程执行代码并控制设备。
· 小米米家智能安全——小米制造的智能相机的一个安全问题允许其所有者(和犯罪分子)观看他人家中的视频流。由于小米智能摄像头被用于安全系统,这个有缺陷的摄像头固件让业主的家变得不安全。
· 汽车控制系统——一组安全研究人员进行了一项实验来测试汽车控制系统的安全性。这些系统管理现代汽车中几乎所有设备的操作。研究人员在与汽车电气控制单元的通信中引入了一系列虚假数据包。在那之后,他们能够激活和停用刹车并干扰发动机、锁、仪表板、灯和收音机。
· 高通的移动站调制解调器——该芯片用于 31% 的智能手机中,用于处理语音通话、短信和高清录音。一组安全研究人员发现,它容易受到安装在用户手机上的恶意应用程序执行的堆溢出攻击。黑客可以利用它来监听用户的电话或访问通话和短信历史记录。
这些案例清楚地表明了漏洞搜索和安全测试的重要性。让我们看看如何检测嵌入式软件开发中使用的嵌入式固件和库中的漏洞。我们将通过获取有关基于 Linux 的系统中的1 day漏洞利用的更多信息来开始这个过程。
收集有关1 day漏洞的报告
1 day漏洞是已经发现和报告的漏洞。搜索此类漏洞通常从发现和检查设备固件使用的库开始。
使用基于 Linux 的固件,我们可以简单地写下固件核心中的所有库及其版本。最好尽可能多地识别库,以确保我们不会错过任何漏洞。但是,有经验的安全研究人员只能寻找他们知道可能包含漏洞的特定库。
如果我们使用单片固件,我们必须分析常量以发现使用的库。例如,我们可以通过检查调试消息或在代码中查找具有库版本的行来找到其中一些库。
一旦我们有了固件中实现的库列表,我们就可以使用以下资源中的数据搜索这些库中的已知漏洞:
· 美国漏洞数据库
· 日本漏洞说明
· CVE 详细信息
· 常见漏洞和暴露
当用户发现新问题时,他们可以创建漏洞报告并将其上传到这些数据库。报告可以包含任何代码中的安全问题数据:固件、操作系统、驱动程序等。由于任何人都可以注册安全问题,因此这些数据库中的漏洞报告并不总是质量最好的。例如,报告可能包含单个库版本的漏洞描述,而没有其他版本的信息。
设备漏洞也是如此,尤其是智能手机。由于设备种类繁多,几乎不可能针对特定漏洞测试所有设备版本,因此研究人员对他们可以访问的几个模型进行测试。
这就是为什么我们必须寻找有关漏洞的其他数据源,例如错误跟踪系统。
在错误跟踪系统中搜索数据
有时,开发人员发现嵌入式软件中的漏洞,但没有将它们注册到上述数据库中,因为他们将这些漏洞视为小错误。例如,如果开发人员检测到缓冲区溢出等问题,他们可以修复它们并继续前进,而无需创建报告。了解此类漏洞的唯一方法是检查错误跟踪系统。
例如,我们可以使用单个 JQL 请求在专用错误跟踪系统中搜索Qt平台错误:
此请求将帮助我们找到 Qt 5.3.1 中可能导致该平台崩溃的关键漏洞。
一旦我们完成了对潜在安全问题的搜索,就该评估来自已发现漏洞的危险级别了。让我们看看如何确定哪些错误需要立即修复,哪些可以稍后处理。
验证发现的漏洞
一旦我们有了可能的软件漏洞列表,下一步就是验证哪些是对我们设备的实际威胁。
以下是验证至关重要且不能跳过的三个原因:
1.漏洞报告可能包含错误、不准确或过时的数据。
2.我们的库版本可能与安全研究人员测试的版本不同。即使它具有相同的版本号,库也可以从不同的源编译或使用不同的编译设置。
3.报告的漏洞可能仅与具有特定架构的应用程序相关,因此在我们的应用程序中生成的命令集可能根本不存在此漏洞。
验证已发现漏洞的原因
验证漏洞对您的软件可能产生的影响的一种可靠方法是检查其在漏洞数据库中的分数。大多数数据库都有一个系统来对每个漏洞的严重性进行排名,例如通用漏洞评分系统(CVSS) 分数,它可以帮助软件开发人员确定他们应该首先关注哪些安全问题。
例如,允许黑客远程执行代码或提升权限的漏洞在 CVSS 中得分为 10 分(满分 10 分)。如此高分的 bug 非常少见,这就是为什么在大多数情况下,我们仍然需要在 bug 修复阶段之前分析报告。
然而,我们的经验表明,分数低于 7 的漏洞通常描述了难以重现和利用的漏洞。此类漏洞不允许黑客控制代码执行或要求他们将漏洞插入到确切的内存地址。安全测试人员需要花费数小时试图重现此类漏洞。这就是为什么最好专注于更有害的攻击。
这是您可以通过四个步骤验证嵌入式软件漏洞的方法:
1.过滤得分为 7 或更高的漏洞报告列表,并从列表中排除所有得分较低的报告。
2.排除包含很少或没有技术信息的报告。如果软件供应商禁止发布有关其产品的技术数据,他们的漏洞报告将不会包含代码中使用的函数的名称、指向源代码中可以修复检测到的问题的更改的链接、即用型漏洞等. 此类报告仅向我们提供了漏洞的一般描述,没有关于如何检测和重新创建它的线索。
3.最终确定最可能和最危险的安全问题列表,并开始在您的代码中验证它们。在这个阶段,您需要使用反汇编程序来找到导致每个漏洞的确切代码,并检查它是否包含修复程序。
4.重现使漏洞影响您的架构的环境。如果您发现代码中确实存在漏洞,请着手修复它。
如何验证发现的漏洞
即使对于经验丰富的开发人员来说,搜索漏洞并验证它们是否会威胁到您的嵌入式软件也是一个耗时的过程。幸运的是,我们可以通过自动化来显着加速它。让我们看看几个至少可以部分自动化发现代码漏洞的工具。
自动化漏洞搜索
自动化工具为寻找安全问题的人节省了数小时的工作时间。通常,他们会定位一个已知漏洞或可疑代码,之后 QA 专家或开发人员必须对其进行分析,并确定此代码是否真的造成了漏洞并需要修复。
使用自动化工具时,重要的是要记住它们并没有为安全测试人员完成所有工作。此外,他们可能无法发现软件中的所有潜在漏洞,并可能返回误报。
漏洞搜索自动化的三个工具
固件分析和比较工具(FACT) 是我们在 Apriorit 经常使用的工具之一,用于在查找嵌入式项目中的漏洞时节省时间。FACT 为各种类型的架构检查基于 Linux 的固件:x86、ARM、MIPS 和 PowerPC。它可以使用固件映像或内部带有 rootfs 存档的 tar.gz 存档作为输入。输出是固件内所有文件的版本列表以及来自国家漏洞数据库的所有相应漏洞。
· FACT 无法 100% 准确确定文件版本,也不会验证发现的漏洞。但是,它会自动执行漏洞搜索的初始阶段。例如,FACT 需要大约半小时来分析包含 3,000 个文件并占用 1 GB 磁盘空间的固件。一般的开发人员至少需要几个小时来手动分析此类固件并起草一份可能的漏洞列表。
· Emba是另一个有用的工具,它允许安全测试人员分析基于 Linux 的嵌入式设备和基于 RTOS 的系统的固件映像。它还可以分析内核配置。在分析过程中,emba 会突出显示固件中可能导致漏洞的可疑代码。该工具显着加快了安全测试人员的漏洞搜索速度,因为他们不必自己分析固件。
· FwAnalyzer是一个分析文件系统镜像的工具。它适用于 ext、FAT、SquashFS 和 UBIFS 文件系统。FwAnalyzer 将文件系统映像与开发人员创建的包含固件文件和目录的各种规则的比较文件进行比较。它还可以帮助开发人员检查文件的内容,从中提取数据,并检测不同版本的文件和文件树的变化。作为其分析的结果,FwAnalyzer 创建一个报告,其中包含它发现的所有差异或开发人员请求的数据。
结论
尽可能多地收集有关披露的漏洞的信息是保护嵌入式软件的第一步。尽管似乎有很多关于此类安全问题的数据,但存在花费太多时间研究它们或遗漏重要信息的风险。这就是为什么开发人员和安全研究人员需要一种算法来验证发现的漏洞并确定其优先级。
发表评论