图片传输协议(PTP)
现代单反相机不再使用胶片来捕捉和再现图像,而是使用图片传输协议(PTP)。图片传输协议最初主要涉及图像传输,现在这个协议包含了几十个不同的命令,支持从拍照到升级相机固件的任何操作。
以前大多数用户使用USB数据线将相机连接到个人电脑,但新款相机现在支持WiFi连接。这意味着,曾经只有USB连接设备才能访问的PTP/USB协议,现在也变成了每个近距离支持wifi的设备都可以访问的PTP/IP协议。
在一次演讲中,Daniel Mende (ERNW)展示了佳能EOS相机当时支持的每一种网络协议可能遭受的所有不同的网络攻击。在演讲的最后,Daniel讨论了PTP/IP网络协议,展示了攻击者可以通过从网络嗅探特定的GUID与相机通信,该GUID是在目标计算机与相机配对时生成的。由于PTP协议提供了多种命令,并且没有以任何方式进行身份验证或加密,因此他演示了如何使用协议中存在的功能监视受害者。
在研究中,研究人员的目标是超越访问和使用协议的功能。他们模拟攻击者,希望在协议中找到实现漏洞,希望利用它们来接管相机。这样的远程执行代码(RCE)场景将允许攻击者用相机做任何他们想做的事情,用勒索软件感染相机只是众多选项之一。
从攻击者的角度来看,PTP层看起来是一个很好的攻击目标,因为:
1. PTP是一种未经身份验证的协议,支持许多不同的复杂命令;
2. PTP中的漏洞可以通过USB和WiFi进行同等程度的利用;
3. WiFi支持使研究人员的相机更容易被附近的攻击者访问。
在本文中,研究人员会将PTP作为攻击载体,介绍两种潜在的攻击方法:
1. USB:如果一个攻击者接管了你的电脑,就可以通过USB将恶意软件传播到你的相机中;
2. WiFi:攻击者可以在旅游景点设置一个流氓WiFi接入点,感染你的相机。
攻击目标的设定
研究人员选择佳能EOS 80D单反相机的原因有很多:
1. 佳能是最大的单反相机制造商,控制着超过50%的市场份额;
2. EOS 80D支持USB和WiFi;
3. 佳能配有Magic Lantern,Magic Lantern是佳能单反相机推出的一款扩展包,主要包括Dual ISO捕捉两种不同闪光范围的图像、扩大动态范围、延时摄影、定时曝光控制计等功能,支持扩展API。从而提高相机的扩展功能。
获取固件
这通常是每个嵌入式研究中最棘手的部分,第一步是检查供应商的网站上是否有公开可用的固件更新文件。不出所料,研究人员在短时间的谷歌搜索之后找到了它。下载文件并提取归档文件之后,研究人员遇到了一个令人不快的意外。该文件似乎是加密或压缩的,如图1所示。
在浏览该文件时,研究人员没有找到任何有用的模式,这可能暗示了引导加载程序的汇编代码的存在。在许多情况下,引导加载程序是未压缩的,它包含解密或解压缩文件所需的指令。
尝试使用Binwalk或7Zip等多种解压缩工具都无用,这意味着这是一种专有的压缩方案,甚至是一种专用的加密方案。
在谷歌,研究人员检查了互联网对这个. fir文件的看法,发现固件确实是AES加密的。
由于是开源的,研究人员希望ML(Magic Lantern)能够以某种方式发布这个加密密钥,从而允许解密固件。不幸的是,事实并非如此。ML不仅故意将加密密钥保密,研究人员甚至在互联网上的任何地方都找不到密钥。通过努力,研究人员发现ML开发了一种叫做便携式ROM转储的工具。这是一个自定义固件更新文件,一旦加载,就会将相机的内存转储到SD卡。
使用ML论坛中提供的说明,研究人员成功地卸载了相机的固件,并将其加载到研究人员的反汇编程序(IDA Pro)中。现在研究人员终于可以开始寻找相机的漏洞了。
反转PTP层
此时,查找PTP层就非常容易:
1. PTP层是基于命令的,并且每个命令都具有唯一的数字操作码;
2. 固件包含许多指示字符串,这简化了逆向工程的任务。
通过遍历PTP OpenSession处理程序,研究人员找到了根据操作码注册所有PTP处理程序的主函数。快速检查确保固件中的字符串与研究人员在网上找到的文档匹配。
在查看注册函数时,研究人员发现PTP层的攻击面很多。该函数注册了148个不同的处理程序,表明供应商支持许多专有命令。通过实施近150种不同的命令,在其中一种命令中找到关键漏洞的可能性非常高。
PTP处理程序的API
每个PTP命令处理程序都可以实现相同的代码API。API使用了ptp_context对象,图4显示了ptp_context的一个用例。
可以看到,上下文包含函数指针,用于:
1. 查询输入消息的大小;
2. 接收输入的消息;
3. 处理消息后返回响应。
事实证明,大多数命令都相对简单。它们只接收几个数字参数,因为协议支持每个命令最多有5个这样的参数。在扫描了所有支持的命令之后,148个命令的列表很快缩小到38个接收输入缓冲区的命令。从攻击者的角度来看,研究人员完全控制了这个输入缓冲区,因此,我们可以开始在这么小的命令集中查找漏洞。
幸运的是,每个命令的解析代码都使用普通的C代码,并且非常容易分析。很快,研究人员发现了自己的第一个漏洞。
CVE-2019-5994:SendObjectInfo中的缓冲区溢出(0x100C)
PTP命令名称:SendObjectInfo
PTP命令操作码:0x100c
在内部,协议将支持的文件和图像称为“对象”,在这个命令中,用户更新给定对象的元数据。处理程序在解析应该是对象的Unicode文件名时包含缓冲区溢出漏洞。图5显示了易受攻击的代码片段的简化代码版本:
这是主要全局上下文中的缓冲区溢出,在此上下文中,无需反转不同的字段,研究人员拥有的唯一的直接暗示就是复制之后的Free-Where原语。副本可以将pKeywordsStringUnicode字段修改为任意值,然后触发调用以释放它。
这看起来是一个好方法,但是研究人员要继续寻找一个更容易被利用的漏洞。
CVE-2019-5998:NotifyBtStatus中的缓冲区溢出(0x91F9)
PTP命令名称:NotifyBtStatus
PTP命令操作码:0x91F9
尽管研究人员的相机型号不支持蓝牙,但一些与蓝牙相关的命令显然还存在的,攻击者仍然可以访问它们。在本例中,研究人员发现了一个典型的基于堆栈的缓冲区溢出,如图6所示。
CVE-2019-5999:BLERequest中的缓冲区溢出(0x914C)
PTP命令名称:BLERequest
PTP命令操作码:0x914C
看起来蓝牙命令比其他命令更容易受到攻击,这可能意味着开发团队缺乏经验。这一次研究人员发现了一个基于堆的缓冲区溢出,如图7所示。
现在总共有3个漏洞:
· 全局结构上的缓冲区溢出;
· 缓冲区溢出堆栈;
· 堆上的缓冲区溢出。
如前所述,研究人员将尝试利用基于堆栈的漏洞,这可能是最容易的。
代码执行
研究人员首先使用USB线把相机和电脑连接起来,研究人员之前使用的USB接口与佳能的“EOS实用程序”软件,似乎很自然地试图利用USB传输层。在搜索PTP Python库时,研究人员发现了ptpy。
在编写代码执行漏洞之前,研究人员先从一个小的概念验证(PoC)开始,它将触发研究人员发现的每个漏洞。图8显示了相机如何崩溃,供应商将其描述为“Err 70”。
现在,是时候开始真正的漏洞利用了。
漏洞利用
研究人员的计划是使用Sleep()函数作为断点,并测试在给定的秒数之后是否可以看到设备崩溃。这将确认他们接管了执行流程并触发了对Sleep()的调用。大多数情况下,易受攻击的任务只是在没有触发崩溃的情况下停止的,从而导致相机停止工作。目前研究人员无法区分停止工作、睡眠和运行挂起的情况,这使得研究人员的断点策略毫无意义。
研究人员决定改变策略,通过寻找一个总是触发Err 70的代码地址。从现在开始,研究人员的断点将是对该地址的调用,崩溃意味着研究人员击中了断点。
研究人员逐渐构建研究人员的漏洞,直到最终研究人员能够执行研究人员自己的程序集片段——现在研究人员有了代码执行。
恶意加载
研究人员通常使用基本的TCP加载器进行Scout,这需要网络连接。虽然研究人员可以使用一个文件加载器来从SD卡加载Scout,但是稍后需要为Scout提供相同的网络连接,所以研究人员最好现在就解决这个问题。
查看了不同设置后,研究人员意识到WiFi不能在USB连接的时候使用,很可能是因为它们都是PTP层的,不支持同时使用,所以研究人员决定只使用WiFi。
在研究人员再次查看了PTP命令处理程序的列表,这次更彻底地查看了每个命令处理程序。令研究人员大为欣慰的是,研究人员发现了更多的漏洞。
CVE-2019-6000:SendHostInfo中的缓冲区溢出(0x91E4)
PTP命令名称:SendHostInfo
PTP命令操作码:0x91E4
查看易受攻击的代码,如图9所示,研究人员第一眼就很明显地忽略了这个漏洞。
这一次,开发人员虽然记得要检查消息的预期固定大小为100字节。然而,他们却忘记了一些至关重要的事情。非法数据包只会被记录,但不会被删除。在快速检查了研究人员的WiFi测试环境后他们确实看到了崩溃。
虽然这个漏洞正是研究人员一直在寻找的,但是他们决定继续寻找更多的漏洞,特别是这种漏洞很可能会在多个命令中找到。
CVE-2019-6001:SetAdapterBatteryReport中的缓冲区溢出(0x91FD)
PTP命令名称:SendAdapterBatteryReport
PTP命令操作码:0x91FD
研究人员不仅发现了另一个具有相同代码模式的漏洞,而且这是列表中的最后一个命令,为研究人员提供了很好的结果。图10显示了易受攻击的PTP处理程序的简化版本。
在本例中,由于堆栈缓冲区相当小,因此研究人员将继续使用以前的漏洞。
注意:在WiFi设置中测试这个漏洞时,研究人员发现它在函数返回之前也崩溃了。所以,研究人员只能通过USB连接来利用它。
第二次尝试寻找恶意载荷
既然发现了漏洞,研究人员就可以执行攻击,并成功地在相机上加载了Scout。现在,研究人员有了一个网络调试器,可以开始转储内存地址,以便在逆向工程过程中帮助执行攻击。
但是,研究人员的目标是展示使用图片传输协议从USB和WiFi中劫持相机。虽然这两个传输层之间有一些细微的差异,但最终研究人员使用的漏洞在两种情况下都有效,从而证明了他们的观点。然而,接管相机只是研究人员发起攻击的第一步。现在是时候创建一些勒索软件了。
加密
任何勒索软件都需要加密功能来加密存储在设备上的文件,如上所述,固件更新过程提到了AES加密,这看起来是个一次性完成所有任务的好机会。
这个逆向工程任务比研究人员想象的要简单得多,因为研究人员不仅找到了AES函数,还找到了固件更新过程的验证和解密密钥。因为AES是对称密码,所以同样的密钥也可以用于加密恶意固件更新,然后对其签名,使其通过验证检查。
研究人员使用了Scout实现了所有复杂的密码算法,并实现了一条模拟固件更新过程的新指令,然后最终返回算法计算的密码签名。使用此指令,研究人员可以知道固件更新文件中每个部分的正确签名是什么,从而有效地获取相机本身的签名原语。
在图11中,你可以看到研究人员的自定义ROM转储程序,它是通过修补Magic Lantern的ROM转储程序创建的。
CVE-2019-5995:恶意固件在后台悄悄进行更新
这是有一个用于远程固件更新的PTP命令,它不需要任何用户交互。这意味着即使所有的漏洞都已修复,攻击者仍然可以使用恶意固件更新文件来感染相机。
勒索目标的实现
在完成固件更新过程之后,就可以实现勒索目标了。勒索软件使用与固件更新过程相同的加密函数,并在固件中调用相同的AES函数。加密SD卡上的所有文件后,勒索软件会向用户显示勒索消息。
先设置一个流氓WiFi接入点可以很容易地实现,首先是嗅探网络,然后伪造一个AP,使它的名称与相机自动尝试连接的名称相同。一旦攻击者与相机位于同一局域网内,就可以发起攻击。
以下是佳能发布的官方安全建议链接:
日语版本的链接:https://global.canon/ja/support/security/d-camera.html
英语版本的链接:https://global.canon/en/support/security/d-camera.html