토이톡은 픽사 전 임원들이 설립한 인공지능 장난감 스타트업 회사입니다. 그들이 디자인하는 스마트 장난감은 시각적 추적, 음성 인식, 네트워크 확장 기능을 갖추고 있어 아이들이 앱을 통해 음성으로 장난감과 소통할 수 있습니다. 행동 반응 인식을 통해 어린이가 가상 캐릭터와 대화하는 능력을 자극하고 장난감과 상호 작용하는 재미를 더 잘 실현할 수 있습니다.
ToyTalk는 2015년 7월 "토마스와 친구들 Talk To You"라는 유료 앱을 출시했습니다. 이 앱은 어린이들이 유명한 만화 캐릭터 "기관차 토마스"(Thomas the Tank Engine)와 상호작용할 수 있는 대화형 채팅을 제공합니다. Thomas와 그의 친구들 Percy, Gordon, Henry, James, Edward, Toby 및 Mr. "The Fat Controller" Topham Hay와 함께 Sodor 섬(Topham Hatt 경)의 8개 스토리 투어를 통해 양방향 대화를 나눕니다. 토이톡 장난감 제품의 보안과 홈 네트워크 환경 접속으로 인한 보안 위험을 테스트하기 위해 토이톡 제품은 모두 동일한 코드를 사용하기 때문에 "토마스와 친구들 채팅" 앱에 대한 분석을 하기로 했습니다. 기본이며 Thomas Talk 앱은 설치 및 제거가 쉽고 테스트가 편리하며 Hello Barbie 및 Barbie와 같은 다른 ToyTalk 제품에도 동일한 취약점이 있을 수 있습니다
.취약점 상황
#취약성 1: - 인증 메커니즘이 부족하여 공격자는 쉽게 어린이인 척하여 토마스 장난감과 대화할 수 있습니다.#취약성 2: - support@toytalk.com 또는 다른 사람인 것처럼 가장할 수 있습니다.
APP 작동 방식 분석
다음으로 해당 앱의 네트워크 브라우징 차단 분석을 진행해보겠습니다. 분석 중 이 앱은 인증을 위한 인증서, 즉 인증서를 제공한다는 점에서 다른 앱과 다르다는 것을 발견했습니다. 즉, APP와 웹 서버 간에 상호 인증 프로세스가 있을 것입니다. 이를 기반으로 먼저 클라이언트 인증서의 작동 메커니즘과 관련 비밀번호 확인을 살펴봐야 합니다.
나중에 리버스 엔지니어링을 통해 알아냈습니다. 다음 두 가지 기능이 더 흥미롭습니다.
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 후크 기능과 함께 다음 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)을 수행하는 데 사용할 수 있으며, 흥미롭게도 Toystalk.12 파일은 어떤 비밀번호로도 보호되지 않습니다
이제 . 클라이언트 인증서를 사용할 수 있지만 인증서 고정 메커니즘은 여전히 우회해야 합니다. 이를 달성하는 방법은 여러 가지가 있지만 가장 쉬운 방법은 apk에서 인증서를 삭제하고 프로그램을 다시 빌드한 후 다시 설치하는 것입니다. 클라이언트 인증서를 Burpsuite로 가져와 인증서 잠금 기능을 비활성화한 후 대부분의 APP 프로그램 테스트의 첫 번째 단계인 트래픽 차단에 들어갈 수 있습니다.
취약점 분석
취약점 1 - 인증 메커니즘 부족
또한 앱은 덜 명확한 기능을 제공합니다. 즉, 캡처된 대화 오디오 파일은 부모가 나중에 재생할 수 있도록 온라인에 저장됩니다. 이전 동의에 사용된 이메일 주소. 단, 이 이메일 주소는 부모가 비밀번호를 재설정할 때만 사용됩니다.
虽然其中的发送内容涉及很多变量值,但通过把当前用户ID更改为其它用户ID后,就能把音频文件发送到指定的用户账户名下,这将会允许一些恶意攻击者向儿童父母发送一些淫秽音频信息。
在这种情况下,虽然用户ID是一个随机的全局惟一标识符(GUID),但我们可以根据邮箱地址等已知线索来发现一些有效的用户ID信息。
此外,通过在ToyTalk代码库上运行“strings”命令,我们也可以找到一些线索:
所以,根据上图信息,一旦客户端证书被安装到浏览器中后,通过访问地址:
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 - 漏洞赏金发放并关闭漏洞报告
几天过后,我的朋友建议我学习一下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官方发送的:
漏洞报送进程:
2017.12.4 - 提交漏洞
2017.12.12 - 官方致谢
2017.12.18 - 官方修复漏洞
2017.12.18 - 发布赏金并关闭漏洞报告
整体来说,两个漏洞的利用方式都存在一定的受限条件,但也侧面说明了大量APP在开发过程中忽视了全面的安全考虑。
위 내용은 '기관차 토마스' 스마트토이 앱의 채팅 애플리케이션 취약점 발견 사례 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!