黑科技:看我如何利用多个漏洞黑掉一台机器人系统
工业机器人:从传统机械到协同机器人的演变与挑战
传统的工业机器人,如同独行的战士,在制造和生产的战场上执行着重复、程序化的任务。它们犹如冷硬的战士,承担着危险或人类难以承受的工作负荷,常常在隔离的环境中默默奋战。但新一代协同机器人,即Cobots,却带来了不一样的风貌。
Cobots不仅仅是执行自动化的任务,它们在符合安全标准的前提下,更与人类或其他机器共同在同样的环境中工作。它们与人类并肩作战,协助我们完成各种任务,而不仅仅是执行危险操作。Cobots的大脑灵活多变,它们可以学习移动,通过高清摄像机“观察”环境,用麦克风“聆听”指令。这使得它们的应用场景变得更为丰富和有趣。
技术的革新总是伴随着安全的挑战。在去年的研究中,我们发现多款Cobots存在关键的安全漏洞。以Rethink Robotics的Baxter和Sawyer,以及Universal Robots的UR系列为例,这些工业机器人的领导者同样面临着安全危机。身份验证漏洞、不安全的通信传输、默认的部署配置等问题频发,使得Cobots易受攻击。
黑客可能会利用这些漏洞远程修改机器人的安全设置,造成严重的后果。即使是相对较小的UR5模型,其力量也足以在慢速移动中造成严重的伤害。那么,这些机器人真的会对人类造成伤害吗?答案是肯定的。尽管它们配备了安全功能,但在黑客的入侵下,这些安全措施可能形同虚设。
Universal Robots制造的UR机器人部署在全球各地的多个生产环境中。真正确保机器人系统安全的并不是制造商,而是负责集成和安装这些机器人的公司——集成商。集成商有责任确保整个系统的安全,包括风险评估、连接其他机器和安全装置,以及在软件控制面板中设置相应的安全设置。
技术的演进总是双刃剑,它既为我们带来了便捷与高效,也带来了新的挑战。我们希望通过对Cobots的安全研究,能够推动其安全性不断发展,使我们能够更安全地使用现在的机器人以及未来的更多代机器人。我们期待与各方共同努力,确保这些智能伙伴在为我们带来便利的不会成为安全的隐患。Universal Robots公司深知集成商在机器人应用中必须警惕潜在的重大风险,如机械伤害和未经授权的安全配置更改等。为了应对这些风险,该公司设计了一系列安全功能,包括力和功率限制、动量限制、刀具定向限制、速度限制和安全边界等。这些功能都是为了确保机器人和操作员的安全。尽管有这些安全设置,仍然存在潜在的安全风险。如果有人恶意绕过这些安全措施,操纵机器人进行恶意行为,后果将不堪设想。安全配置的更改必须谨慎进行。根据集成商的风险评估进行更改,并且一旦安全参数被修改,整个系统应被视为全新系统,需要重新进行风险评估和安全审批流程。现在让我们深入探讨一下远程更改安全配置的具体步骤及其潜在的安全漏洞。通过远程更改安全配置,机器人系统可能面临多种风险。逆向分析发现机器人的系统镜像中可能存在多个漏洞,攻击者可以利用这些漏洞来操纵机器人。攻击者可以通过身份验证漏洞确认远程机器人系统的版本信息。接着,利用基于堆栈的缓冲区溢出漏洞获得对系统的控制权限,并以root身份执行命令。一旦获得控制权,攻击者可以修改security.conf文件,该文件包含了所有安全限制参数,包括通用限制、接头限制、边界和安全输入输出值限制等。攻击者还需要绕过校验和机制并上传新文件以改变安全配置。在这个过程中,攻击者可能会利用认证问题以危险的方式操作机器人。对于这种情况的演示,虽然使用了供应商提供的模拟器来展示攻击效果更为清晰,但攻击过程本身是真实的,并且已经在Linux机器上进行了部分代码修改验证。URControl这个二进制文件中导出了许多网络服务,这些网络服务的私有协议在认证机制上存在的缺陷使得网络上的任何用户都可以向服务发出命令并获取操作系统信息。例如,UR Modbus TCP服务就存在基于堆栈的缓冲区溢出漏洞。由于该服务不支持对命令源的认证机制,因此网络攻击者可以利用这一漏洞破坏机器人系统。攻击者可以向缓冲区写入超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序执行其他指令。这是一个常见的堆栈缓冲区漏洞攻击方式。在进行漏洞利用之前,需要注意机器人的Linux内核具有一些安全特性,如堆栈随机化、VDSO和内存区域共享等。内核的"No eXecute"(NX)位被置位,使得内核文件不可写也不可执行。尽管如此,我们仍需要保持警惕并持续加强安全措施以防止潜在的安全风险。通过深入研究并了解机器人的系统架构和漏洞情况,我们可以更好地保障机器人和操作人员的安全。在进行目标缓冲区的溢出操作时,我们同样需要对指向函数参数的指针进行细致的操控。这些函数参数在函数调用过程中扮演着至关重要的角色,它们在函数返回之前被频繁使用,影响着其他函数的运行。为了确保程序的正常运行,我们必须为这些函数调用提供准确的实参。否则,我们将无法追踪函数的返回点,更无法掌控函数的执行流程,整个程序的运行将陷入混乱之中。这一过程需要高度的谨慎和精确的操作,以确保程序的安全性和稳定性。