过去几个月来,VDOO安全研究团队一直在进行安全和安全领域领先物联网产品的广泛安全研究。在大多数情况下,为了提高效率和透明度,研究与设备供应商一起进行。
作为这项研究的一部分,VDOO的研究人员在几家供应商的设备中发现了零日漏洞。根据负责任的披露最佳实践,这些漏洞向供应商披露,并将在披露期结束后逐步分享。
我们发现易受攻击设备的供应商之一是Foscam,当时我们的团队发现了Foscam安全摄像头中的一个关键漏洞链。结合发现的漏洞,如果对手成功获取相机地址,他可以远程(通过LAN或互联网)获得对受影响相机的root访问权限。VDOO负责任地披露了这些漏洞(CVE-2018-6830,CVE-2018-6831和CVE-2018-6832),并与Foscam安全团队合作解决此事。
VDOO团队享有充分的协作和透明度,并且非常感谢Foscam与安全社区共享以下信息的开放性,以帮助整个物联网行业并为其客户的隐私和安全带来益处。
据我们所知,这些漏洞没有被广泛利用,因此没有导致任何具体的隐私侵犯或对Foscam客户的安全威胁。Foscam团队迅速采取行动修补这些漏洞并将其推向易受攻击的产品。
我们强烈建议未更新相机的Foscam客户立即采取措施或以其他方式降低风险。请参阅下面的FAQ部分
我们还建议其他相机供应商在本报告结尾处遵循我们的建议,以避免和减轻类似的威胁。
关于VDOO
VDOO是一家技术驱动的公司,致力于改变未受保护的连接设备的现实。VDOO正在构建一系列产品,以支持设备制造商在开发阶段将安全性嵌入到其连接的设备中,并实现后期开发安全性。
除了开发产品和服务之外,VDOO还在连接设备的广泛研究方面投入了大量精力。安全和安全产品是本研究的两个焦点组。
VDOO的研究目标是贡献知识和工具来降低风险,并鼓励设备供应商为其产品实施正确的安全措施。我们VDOO认为适当实施安全要点将大大降低利用设备漏洞的机会。
这是一系列博客中的第一篇,将涵盖技术深度潜水作为我们广泛研究的一部分。敬请关注。
技术概述
foscam相机运行在Linux操作系统,所有进程都以root权限运行。Web服务器是一个带有附加供应商代码的lighttpd,它通过使用FastCGI协议将API请求转发到其内部的CGIProxy.fcgi进程。
所述CGIProxy.fcgi可执行转发请求(通过使用一个专有的IPC机构)的web服务方法-用于验证用户的凭证(如果需要)并运行所需的API命令中的处理程序。
根据命令的不同,处理程序可能会调用devMng进程中的其他代码,这些代码通常使用system()或popen()函数运行shell命令,库调用来配置系统服务。当一个守护进程重新启动后,它就终止了。
网络可访问摄像头的攻击情况如下:
• 步骤1:攻击者必须先获取相机的IP地址或DNS名称。它可以通过几种方式实现,其中包括:
• 如果相机和网络由用户配置,以使相机具有与互联网的直接接口,则其地址可能由某些互联网扫描仪显示。
• 如果攻击者获得了未经授权(远程或本地)访问相机所连接的网络,他可能会找到相机的本地地址。
• 如果用户启用了动态DNS,攻击者可能会找到解决设备名称的方法
• 步骤2: 攻击者随后使用 CVE-2018-6830(一种任意文件删除漏洞)来删除某些重要文件,这些文件将在webService进程重新加载时导致身份验证绕过。
• 步骤3:攻击者将崩溃webservice通过利用过程CVE-2018-6832,在一个基于堆栈的缓冲区溢出漏洞的webservice的过程。崩溃后, webService进程将自动由看守程序守护进程重新启动,并且在进程重新加载期间,步骤2中的更改将生效。对手现在可以获得管理凭证。
• 步骤4: 攻击者通过利用CVE-2018-6831执行根命令。这是一个需要管理员凭据的shell命令注入漏洞。由于攻击者在前一阶段获得了管理员凭据,因此他现在可以使用此漏洞以root用户身份执行命令以执行特权升级。完整的详细信息在下面的深度技术探究中展示。
更深入的技术研究
本节提供每个漏洞的详细信息并说明完整的攻击顺序。
CVE-2018-6830 – 任意文件删除漏洞
此漏洞允许攻击者通过为相机的Web管理界面制作特殊的GET请求来删除相机文件系统中的任意文件; 不需要用户凭证。
此漏洞与添加到开源lighttpd Web服务器代码的自定义供应商代码有关。此代码的功能是在从相机上传到用户后立即删除使用snapPicture API命令拍摄的临时快照照片(将相同功能分配给exportConfig API命令)。
当GET请求发送到Web服务器(通过端口88)时,在处理请求之后,搜索请求的URI路径组件(con> request.uri-> ptr)或者搜索字符串/ configs / export /或/ snapPic /。如果请求包含这些字符串中的一个,则服务器使用strncat函数将文档根路径/tmp/www与URI的路径组件组合以形成完整路径。然后验证文件的存在(通过调用access(path,F_OK))并继续通过调用remove(path)来删除文件。
此代码存在路径遍历漏洞攻击,攻击者可以在GET请求中使用点划线(’../‘)序列,该请求将以con> request.uri-> ptr组件结束。由于/ snapPic /目录已存在于服务器的文档根目录中,因此攻击者可以使用/ snapPic / URI作为有效路径,该路径也会触发该代码分支的执行。然后,攻击者继续添加点划线序列,沿着目录树向上移动,直到到达根目录(’ / ‘),然后添加要删除文件的路径。例如,URI /snapPic/../../../tmp/abc表示该文件/ tmp / abc,如果存在,将被删除。
POC
此PoC显示我们如何使用此漏洞从设备中删除任意文件。该_FILE_TO_DELETE shell变量持有文件的绝对路径。
CVE-2018-6832 – 基于攻击的缓冲区溢出漏洞
此漏洞允许攻击者崩溃设备的webService进程。它通过向相机的Web管理界面发送特制的GET请求来触发,而不需要任何用户凭据。
相机的网络服务器提供了带有许多命令的FastCGI API。可能的命令包括getSWFlag命令,该命令通过向/CGIProxy.fcgi?cmd=getSWFlag发送未经身份验证的HTTP GET请求来调用。GET请求参数从CGIProxy.fcgi进程转发到webService的getSWFlag函数代码(我们称之为getSWFlag_func)。getSWFlag_func可以选择接收名为callbackJson的查询字符串参数。
getSWFlag_func首先将callbackJson参数的值读取到堆栈上大小为0x400字节的本地变量callbackJson_var。这是通过引用callbackJson_var调用get_param函数完成的,最大大小限制为0x400个字符。
之后,getSWFlag通过引用callbackJson_var来调用prepare_reply_func函数。这个函数准备一些将被发回给用户的HTTP响应。
如果callbackJson_var不是空字符串 – prepare_reply_func使用strcat将各种字符串数据附加到位置(在getSWFlag_func堆栈的原始位置)的callbackJson_var字符串。总共添加了大约0x48个字符。(附加的字符串是:’({“key”:“<CGI_Result> <result> 0 </ result> <flag> 0011 </ flag> </ CGI_Result>”})’)。
因此,如果攻击者设置查询字符串参数的值,callbackJson将保留足够多的字符(超过某个阈值),那么由prepare_reply_func生成的结果串联将导致getSWFlag_func的堆栈中的callbackJson_var溢出。写入大量字节将导致覆盖保存的堆栈寄存器(包括PC寄存器)并导致崩溃。因此,攻击者可能会崩溃webService进程,这会导致/usr/bin/
watchdog进程几秒钟后重新启动此进程。
CVE-2018-6831 – Shell命令注入漏洞
此漏洞需要管理员凭据,这在以前的阶段中已经实现。它允许攻击者以root用户的身份执行命令,以提升权限。它绕过了2017年6月由思科Talos披露的一个较旧的漏洞补丁CVE-2017-2879。
摄像机的Web服务器FastCGI的 API包括设置自定义NTP服务器的命令(/CGIProxy.fcgi?cmd= setSystemTime)。该命令需要管理员凭证。此命令所需的参数ntpServer包含用于设置NTP_Server_URL的字符串值 。该参数未被特殊字符过滤,甚至可以包含空格和分号。
当调用API命令setSystemTime时,CGIProxy.fcgi
将请求转发给webService进程,该进程读取其参数并发送调用devMng函数OnDevMngMsgSetSystemTime(命令0x6034)的IPC消息。
除此之外,OnDevMngMsgSetSystemTime在全局结构中设置新的NTP_Server_URL。
一个单独的线程,NTP更新线程,内devMng,运行setSystemTimeNTP功能每秒一次在一个无限循环。
setSystemTimeNTP采用全局结构(前面设置)中的NTP_Server_URL值,并使用此值调用gethostbyname(NTP_Server_URL)。如果主机名已成功解析,则继续调用以下易受攻击的代码:sprintf(buf,“ntpclient -h%s -c 3 -s”,NTP_Server_URL); 和popen(buf,“r”); (请参阅下面的IDA截图)。
所述POPEN函数运行通过运行外壳命令的sh -c与所提供的字符串参数。如果我们将NTP_Server_URL设置为; SOME_COMMAND ;,并且可以绕过gethostbyname(NTP_Server_URL)调用 – popen然后会调用sh -c“ntpclient -h; SOME_COMMAND; -c 3 -s“。分号有助于破解shell命令并导致命令注入。由于devMng进程以root 身份运行,我们将能够以root用户身份运行任何命令。
如前所述,我们的理解是,只有在成功执行gethostbyname()调用后才会执行代码,以修补CVE-2017-2879漏洞。我们的猜测是,补丁作者认为使用gethostbyname()调用将是一个足够的解决方案来净化NTP_Server_URL的输入。我们驳斥了这个假设,因为我们观察到uclibc(相机的C标准库)gethostbyname()实现不会无法解析包含分号或空格的主机名。
为了绕过gethostbyname 调用,我们执行以下步骤(参见下面的’CVE-2018-6831步骤’图中相应的步骤编号):
- 我们预先设置了我们自己的DNS服务器,并将其配置为响应任何带有预定义静态IP地址(例如1.2.3.4)的DNS查询(即使它包含空格和分号)。
- 然后,我们用设置相机的DNS服务器地址到我们自己的DNS服务器/CGIProxy.fcgi?cmd= setIpInfo API命令。
- 然后,我们通过使用NTP_Server_URL “; SOME COMMAND;” 构建对setSystemTime API命令的恶意请求来触发此漏洞。
- 在此阶段,gethostbyname运行,导致摄像机发送“; SOME_COMMAND;”的DNS查询。
- 我们的DNS服务器发送一个有效的响应,使得gethostbyname()调用成功。
- 代码继续执行命令注入,使攻击者能够以root身份执行命令。
PoC
0 此漏洞的准备工作 – 使用以下配置设置Bind9 DNS服务器:
1 将相机的DNS服务器设置为指向我们的DNS服务器:(使用管理员的用户名和密码)
2 触发漏洞(我们选择执行远程登录服务器,然后连接到它):
以下也是Wireshark的屏幕截图 – 显示整个攻击期间发射的DNS流量。
设备制造商的建议
我们希望涉及本研究中分析的摄像机中发现的一些漏洞,使攻击者能够更轻松地发现和利用漏洞。我们鼓励设备制造商考虑以下建议。
• 所有设备的进程都以root身份运行。这违反了特权分离的概念(https://en.wikipedia.org/wiki/Privilege_separation),其中规定应该将程序分成若干部分 – 每个部分都被限制为自己所需的特权。虽然系统中的每个进程都以root身份运行,但任何系统进程中的代码执行错误都会使攻击者升级到root权限。另一方面,如果较少的进程使用高权限运行 – 攻击者必须发现更多受限进程中的漏洞才能升级权限,这是一项艰巨的任务。具体而言,面向网络的进程(如Web服务器)应该以最小权限集而不是root身份运行。
• 执行外部进程来执行任务(如配置设备或其操作系统),而不是使用编程语言(库函数)的现有API(如果存在)。执行外部进程,特别是运行shell命令,会给程序带来新的漏洞类型。开发人员应该意识到这些漏洞类型并保护它们。严格的输入校验可以阻止CVE-2018-6831成为shell命令注入漏洞 ,在实际运行shell命令时,要求设备制造商对所有shell控制符号进行过滤。另一个例子是攻击者能够替换程序即将运行的可执行文件 – 使其能够在更加特权的环境中运行代码。
• 未能对正常输入的校验,是导致CVE-2018-6831漏洞产生的成因,主要原因是代码作者未能使用合适的方法对输入进行校验,而开发者依赖gethostbyname库调用 – 更确切的说是由此导致该漏洞的形成。防止不良输入的一种更好的方法是使用白名单 – 只允许在输入字段中找到特定的字符范围。
• 在实践中,供应商固件文件使用短可猜测的模式作为openssl命令的关键字加上aes-128-cbc的事实使我们能够快速掌握固件内容。然后我们可以立即开始分析固件的安全问题。此外,该设备包含具有函数名称之类的符号未经剥离的二进制文件。这有助于我们理解代码如何工作。另一方面,值得注意的是,固件内容的隐匿方式的安全性可能会导致存在问题但由于固件被正确加密而未被发现和修复的情况。供应商应仔细考虑这种权衡。
感谢
我们要感谢Foscam的安全团队高效,及时地处理这个安全问题。
荣誉
Or Peles(@peles_o),VDOO
FAQ部分
Q1。我如何知道我的设备是否易受攻击?
您需要检查您的相机固件是否至少是下面“表I”中出现的版本以及相关的安全补丁。要查看相机使用的固件版本,可以执行以下操作:
方法1
- 使用网络浏览器访问您的相机。地址线通常如下所示:192.168.0.1:88(用相机的实际地址替换“192.168.0.1”)。
- 输入你的用户名与密码
- 点击“设置”,然后点击“设备信息”
- 在右侧窗格中,查找“应用程序固件版本”。
方法2
如果您有多个设备,则可能需要通过发出以下命令以编程方式检索固件:
curl“<Camera IP Address>:88 / cgi-bin / CGIProxy.fcgi?cmd = getDevInfo&usr = admin&pwd = <Password>
例如:
curl“192.168.0.200:88/cgi-bin/CGIProxy.fcgi?cmd=getDevInfo&usr=admin&pwd=abc1234
响应如下所示:
<CGI_Result>
<result>0</result>
<productName>FI9816P+V3</productName>
<serialNo>0000000000000001</serialNo>
<devName>Acme</devName>
<mac>00626E860232</mac>
<year>2018</year>
<mon>5</mon>
<day>25</day>
<hour>19</hour>
<min>40</min>
<sec>19</sec>
<timeZone>0</timeZone>
<firmwareVer>2.81.2.29</firmwareVer>
<hardwareVer>1.12.5.2</hardwareVer>
<pkgTime>2017-06-15_17%3A21%3A35</pkgTime>
</CGI_Result>
Look for the line with “firmwareVer”.
表I – 最新的易受攻击固件版本。
这些是最新的易受攻击的固件版本。添加相应的补丁可缓解这些漏洞。
相机型号 | 应用程序固件版本 |
---|---|
C1 Lite V3 | 2.82.2.33 |
C1 V3 | 2.82.2.33 |
FI9800P V3 | 2.84.2.33 |
FI9803P V4 | 2.84.2.33 |
FI9816P V3 | 2.81.2.33 |
FI9821EP V2 | 2.81.2.33 |
FI9821P V3 | 2.81.2.33 |
FI9826P V3 | 2.81.2.33 |
FI9831P V3 | 2.81.2.33 |
FI9851P V3 | 2.84.2.33 |
FI9853EP V2 | 2.84.2.33 |
C1 | 2.52.2.47 |
C1 V2 | 2.52.2.47 |
C1 Lite | 2.52.2.47 |
C1 Lite V2 | 2.52.2.47 |
FI9800P | 2.54.2.47 |
FI9800P V2 | 2.54.2.47 |
FI9803P V2 | 2.54.2.47 |
FI9803P V3 | 2.54.2.47 |
FI9815P | 2.51.2.47 |
FI9815P V2 | 2.51.2.47 |
FI9816P | 2.51.2.47 |
FI9816P V2 | 2.51.2.47 |
FI9851P V2 | 2.54.2.47 |
R2 | 2.71.1.59 |
C2 | 2.72.1.59 |
R4 | 2.71.1.59 |
FI9900EP | 2.74.1.59 |
FI9900P | 2.74.1.59 |
FI9901EP | 2.74.1.59 |
FI9961EP | 2.72.1.59 |
FI9928P | 2.74.1.58 |
FI9803EP | 2.22.2.31 |
FI9803P | 2.24.2.31 |
FI9853EP | 2.22.2.31 |
FI9851P | 2.24.2.31 |
FI9821P V2 | 2.21.2.31 |
FI9826P V2 | 2.21.2.31 |
FI9831P V2 | 2.21.2.31 |
FI9821EP | 2.21.2.31 |
FI9821W V2 | 2.11.1.120 |
FI9818W V2 | 2.13.2.120 |
FI9831W | 2.11.1.120 |
FI9826W | 2.11.1.120 |
FI9821P | 2.11.1.120 |
FI9831P | 2.11.1.120 |
FI9826P | 2.11.1.120 |
FI9805W | 2.14.1.120 |
FI9804W | 2.14.1.120 |
FI9804P | 2.14.1.120 |
FI9805E | 2.14.1.120 |
FI9805P | 2.14.1.120 |
FI9828P | 2.13.1.120 |
FI9828W | 2.13.1.120 |
FI9828P V2 | 2.11.1.133 |
Q2。如何判断我的设备是否被破坏?
由于僵尸网络恶意软件通常被制造为不被发现,因此没有简单的方法可以确切知道。对设备的任何可疑更改都可能表示设备上存在僵尸网络恶意软件。
几种检查方法:
- 您的密码不再生效 (而不是因为您忘记了) – 这强烈表示设备已被他人接管。
- 您的设备设置已被修改 – 例如,视频现在被发送到不同的服务器。
- 网络流量中的峰值 – 如果可能,请检查您的路由器网络统计信息。僵尸网络可能会增加摄像头发起的网络流量。任何峰值都应该值得引起你的注意,因为除非你从摄像机传输视频,否则这个数字应该相对较低。
Q3。如果违规,我的设备是否有补救措施?
在发布时,我们不知道有任何恶意软件在滥用此问题。如果您怀疑设备被破坏,请将相机恢复到出厂设置。这样做会将配置恢复到默认设置,允许您连接和升级固件。请记住,如果您使用的是易受VDOO检测到的漏洞的固件,则该设备可能成为攻击目标,并可能很快再次受到感染。因此,在重置设备之后,请确保在将相机直接连接到互联网之前立即执行固件升级。
Q4。如果我无法更新相机的固件,如何减轻风险?
为了减少相机的暴露和远程管理的能力,建议将设备置于防火墙阻挡端口88和443(或相机配置中指定的端口)后面,并考虑不允许相机启动任何出站连接(请记住,这可能会影响Foscam云服务)。另一种选择是将设备置于反向代理之后,该代理将阻止我们用于漏洞利用的URL(请参阅上面的其他详细信息)。如果需要额外的帮助,请联系security@vdoo.com。
Q5。如何升级相机中的固件?
点击此处查看 供应商的固件更新说明。
发表评论
您还未登录,请先登录。
登录