产品中你不想存在的固件漏洞
插图:© IoT For All --> 固件漏洞是指在设备固件中发现的安全弱点或缺陷。固件是一种嵌入在硬件设备中的软件,为设备提供低级控制和功能。它在硬件和高层软件之间起到桥梁的作用。这些漏洞可能被攻击者利用,以未经授权的方式访问设备,并控制或操纵设备。在过去十年中,我们目睹了针对商业和工业物联网设备的众多安全漏洞。例如,网络罪犯曾关闭了芬兰拉彭兰塔市的两座建筑中的供暖系统,其他像 Shamoon、纽约水坝、以及 Mirai Botnet 等攻击均影响了工业物联网设备,如德国电信路由器,导致服务中断。尽管人们普遍知道物联网设备的安全性是一个弱点,但在去年俄罗斯对乌克兰发动袭击之前,很少有人采取措施来解决这个问题。这次袭击展示了网络攻击的真实威力,匿名组织黑客入侵了克里姆林宫的闭路电视系统,而俄罗斯则攻击了乌克兰的电网。这些事件发生后,美国和欧盟表示有意规范物联网/工业物联网(IIoT)的安全状况,这是一个急需的措施。然而,问题仍然存在:我们应该从哪里开始?哪些是最危险的漏洞可能导致此类攻击?是否存在能够保护制造商免受这些攻击的“万能良药”?让我们看看一些最危险的漏洞及其潜在的缓解措施。漏洞的“圣杯”:远程代码执行(RCE) 大多数IT专业人士都熟悉远程代码执行(RCE)的概念,这是最令人担心的固件安全威胁之一。如果攻击者能够利用RCE漏洞,他们将获得对设备的完全控制权,并可能创建僵尸网络(botnet)。此外,攻击者可以窃取用户数据,或者对各种制造商进行间谍活动。本质上,攻击者可以实现他们想要的任何目标。接下来的问题是:攻击者如何在设备中发现RCE漏洞?哪些类型的漏洞可能导致RCE?我们来看看最常见的几种。认证绕过(Authentication Bypass): 攻击者可以绕过物联网设备中的认证机制,这些设备使用弱密码或默认密码。有时,他们可以利用逻辑漏洞或绕过特定的安全检查。多种技术可导致认证绕过,包括默认密码、暴力破解攻击、网络漏洞,或固件漏洞。缓冲区溢出(Buffer Overflows): 缓冲区溢出漏洞发生时,程序试图将比缓冲区容量更多的数据存入缓冲区,从而导致数据溢出到相邻的内存位置。攻击者可以利用该漏洞,通过构造输入数据使缓冲区溢出,并用恶意代码覆盖相邻的内存位置。注入漏洞(Injection Flaws): 注入漏洞发生在攻击者通过不安全的输入或接口(例如网页表单或API)向物联网设备中注入恶意代码时。我们将在下文深入探讨每种漏洞。认证绕过 认证是嵌入式系统中的关键安全要素。它确保只有授权人员才能访问设备及其功能。认证绕过是指攻击者在没有提供必要认证凭据(如用户名和密码)的情况下访问设备。这种安全漏洞允许攻击者控制设备及其功能,可能造成对设备的损害,或访问敏感数据。攻击者可以利用多种技术实现认证绕过。一种常见方法是利用默认或弱密码。许多物联网设备都设有默认登录凭据,这些凭据广为人知,很容易在网上找到。攻击者可以利用这些信息绕过认证过程访问设备。他们还可以使用暴力破解攻击来猜测弱密码。另一种方法是利用固件漏洞。例如,这可能通过利用开放源代码软件的易受攻击版本,或利用认证流程中的逻辑漏洞来实现。此外,网络漏洞也可能被利用来绕过认证。攻击者可以拦截网络流量以获取登录凭证,或使用中间人攻击来假冒设备并绕过认证。认证绕过缓解措施 更改默认登录凭据并使用强密码非常重要。强密码应包含大写和小写字母、数字和符号,并且长度至少为12个字符。其次,要确保产品中使用的所有第三方开源组件都保持最新。第三,确保网络安全对于缓解认证绕过至关重要。可以通过实施安全通信协议(如HTTPS或TLS)来加密网络流量,从而实现这一目标。最后,定期对每个新发布的产品进行渗透测试。缓冲区溢出 缓冲区溢出是软件系统中最知名且最常见的漏洞之一。这些漏洞可能因多种原因发生。一种常见原因是程序中缺乏输入验证,这允许攻击者输入比分配缓冲区大小更大的数据。这可能导致额外数据覆盖相邻内存位置,从而导致意外行为或崩溃。另一个导致缓冲区溢出漏洞的原因是使用了不安全的函数,这些函数未执行边界检查,例如 strcpy 和 strcat。我们将在实际场景中演示一个缓冲区溢出漏洞。为此,我们将使用 DVRF(Damn Vulnerable Router Firmware)作为目标。将固件导入我们的平台后,它将提取映像并反编译每个二进制文件以搜索潜在的漏洞。我们选择这个目标是因为它对所有人都可访问,并且我们不想破坏任何公开可用的制造商固件。BugProve 在这里,程序接收两个整数参数 param_1 和 param_2,并声明了一个名为 local_200 的局部变量,类型为 undefined2(2 字节或 16 位无符号整数)。它还显示了一个名为 auStack510 的数组,大小为 502 字节。程序随后使用 memset() 函数将 auStack510 中的所有字节设置为零。之后,它检查 param_1 的值是否小于 2。如果是,程序会打印一个使用信息,并以错误代码 1 退出。如果 param_1 大于或等于 2,程序会打印欢迎信息,并使用 strcpy() 函数将由第二个参数 _(*(char)(param_2 + 4))_ 指向的字符串内容复制到 local_200。这就是缓冲区溢出漏洞所在之处。如果第二个参数指向的字符串长度超过 16 字节(local_200 的大小),strcpy() 函数将超出 local_200 缓冲区的结尾写入,并覆盖相邻的 auStack510 缓冲区的内容。这可能导致不可预测的行为,包括程序崩溃,或者允许攻击者从固件漏洞中执行恶意代码。为了防止这种缓冲区溢出攻击,使用限制写入缓冲区数据量的函数非常重要,如 strncpy() 或 snprintf()。此外,程序应使用缓冲区溢出保护措施进行编译,例如 stack canaries 和地址空间布局随机化(ASLR, fASLR)。命令注入 命令注入是一种攻击,攻击者通过命令行注入恶意代码,以在目标设备上执行任意命令。这种攻击可以通过多种方式进行,包括通过网页界面、输入字段和 API。在固件中,命令注入通常通过网页界面或 API 进行,因为这些是用户与设备交互的常见方式。命令注入在固件中的影响可能是严重的。成功将代码注入命令行的攻击者可以在目标设备上执行任意命令。这可以使攻击者访问敏感数据、控制设备,甚至向网络上的其他设备发起攻击。此外,命令注入可能难以检测,因为它通常看起来像是正常流量。BugProve 这段代码看起来是一个名为 wsc_generate_pin 的函数,用于生成 Wi-Fi Protected Setup(WPS)PIN。WPS PIN 是一个八位数字,用于将无线设备认证到 Wi-Fi 网络。然而,这段代码中存在一个潜在的命令注入漏洞。该漏洞源于使用 system 函数,该函数执行一个 shell 命令。具体来说,通过 sprintf 函数构造了一个命令字符串,然后在未对输入进行适当验证或清理的情况下将其传递给 system。漏洞代码位于高亮的那一行:BugProve 这段代码构造了一个将 local_18 的值写入 /dev/random 文件的 shell 命令。如果攻击者可以控制 local_18 的值,他们可以将额外的 shell 命令注入 acStack141 缓冲区,从而实现任意代码执行。由于该变量来自用户(WPS Pin),该漏洞是可利用的。为了防止这种漏洞,必须对用于构造 shell 命令的所有输入进行适当的验证和清理。可以通过正则表达式或白名单过滤进行输入验证。白名单过滤包括定义输入可以包含的允许字符集或值。开发人员还应限制输入的字符数,以防止缓冲区溢出攻击,如上所述。物联网安全的挑战 我们理解物联网安全是一项重大挑战,许多制造商在招聘该领域的安全专家方面面临困难。通过实施上述缓解措施,您可以大大加强设备的安全性。此外,我们强烈建议使用编译时的加固标志,作为提高安全性的第一步。定期进行安全审计和测试也很重要,以识别并及时解决任何潜在漏洞。为实现这一点,我们建议利用第三方安全实验室,或者至少使用固件分析工具。推文分享 邮件分享 网络安全 IT 与安全 安全 --> 网络安全 IT 与安全 安全
查看全文
评论0条评论