概述
本文中,研究人員主要介紹了一些LinkedIn外部API的隱私問題,并演示了如何通過電子郵件地址找到與其關(guān)聯(lián)的LinkedIn個人資料。此外,也可以通過LinkedIn個人資料進(jìn)行反向搜索,找到某人的電子郵件地址。在此次去匿名化攻擊中,研究人員利用了LinkedIn與Outlook和YahooMail的集成功能。
功能
研究人員最初注意到在使用Outlook郵件客戶端時,頁面上有多個顯示與該聯(lián)系人相關(guān)的其他信息的標(biāo)簽。其中的一個標(biāo)簽是該聯(lián)系人的LinkedIn個人資料,里面包含了聯(lián)系人的公司名稱、職務(wù)、過去的經(jīng)歷和位置等。看到這些,研究人員開始好奇郵件客戶端是如何找到這些個人資料的?
研究人員通過查看HTTP請求,注意到Outlook客戶端在顯示個人的詳細(xì)信息時,將通過WebSocket交換數(shù)據(jù)。請求或響應(yīng)的消息采用一種不常見的格式進(jìn)行編碼,如下圖所示:
該請求是通過WebSocket向https://sfnam.loki.delve.office.com發(fā)出的。通過查看啟動通信的JavaScript代碼,可以找到負(fù)責(zé)上述編碼格式的代碼。Chrome中的“網(wǎng)絡(luò)”標(biāo)簽將顯示用于啟動給定WebSocket通信的JavaScript文件和源代碼,如下圖所示:
查看Chrome突出顯示的源代碼,研究人員發(fā)現(xiàn)該代碼可以處理新的請求和響應(yīng)。在以下的代碼片段的onMessage回調(diào)處理程序中,我們可以看到,接收到的消息將轉(zhuǎn)換為UInt8數(shù)組,并使用inflateRaw方法從Pako模塊解壓縮。Pako是一個支持LZip壓縮算法的庫。InflateRaw()函數(shù)使用LZip壓縮,不包含文件名和修改日期的元數(shù)據(jù)標(biāo)頭。
}, e.prototype.onMessage = function (e) {
var t = this;
this.inflateData(e.data, function (n) {
try {
t.setServerPingTimerIfEnabled();
var r = JSON.parse(n), o = k()(r.Key, 10);
if (-1 === o) return;
if (r.Headers = r.Headers && q(r.Headers), o in t.activeRequestsMap) {
var i = t.activeRequestsMap[o];
i && (clearTimeout(i.timeout), setTimeout(function () {
return i.onSuccess(r, e.timeStamp)
}, 0)), delete t.activeRequestsMap[o]
} else t.logError("WebSocket-onMessage-UnableToFindResponseKey", {Key: o.toString()})
} catch (e) {
t.logError("WebSocket-onMessage-ReceiveFailure", {Exception: e.message})
}
})
}, e.prototype.inflateData = function (e, t) {
return G(this, void 0, void 0, function () {
var n, r, o;
return W(this, function (i) {
switch (i.label) {
case 0:
return this.compressionDisabled ? (t(e), [3, 4]) : [3, 1];
case 1:
return i.trys.push([1, 3, , 4]), [4, this.getPako()];
case 2:
return n = i.sent(), r = n.inflateRaw(new Uint8Array(e), {to: "string"}), t(r), [3, 4];
case 3:
return o = i.sent(), this.logError("WebSocket-inflateData-PakoInflateFailure", {Exception: o}), t(""), [3, 4];
case 4:
return [2]
}
})
})
知道編碼格式后,研究人員創(chuàng)建了一個簡單的ZAP插件,如果請求和響應(yīng)的消息與LZip或GZip格式匹配,ZAP將自動對其進(jìn)行解碼,如下圖所示:
從以下代碼中,我們可以看出有些請求是為LinkedIn終端制作的,這些請求負(fù)責(zé)在JSON消息中使用/api/v1/linkedin/profiles/full路徑加載LinkedIn個人資料。發(fā)送到sfnam.loki.delve.office.com的請求大多都是以JSON格式包裝的HTTP請求。JSON屬性網(wǎng)址類似于HTTP路徑,且所有標(biāo)頭都在標(biāo)頭屬性下。研究人員在沒有WebSocket連接的情況下,直接在HTTP中測試該請求,也可以訪問相同的功能。
{
"Key": "15",
"Url": "https://sfnam.loki.delve.office.com/api/v1/linkedin/profiles/full?PersonaDisplayName=Peter%20Gibbons&ExternalPageInstance=332c2687-71f7-49df-8b7c-b2402ccbf473&UserLocale=en-US&OlsPersonaId=&AadObjectId=&Smtp=kmitnick%40mitnicksecurity.com&UserPrincipalName=&PersonaType=User&RootCorrelationId=2933990e-0cc2-4406-8103-0cba160e7047&CorrelationId=2933990e-0cc2-4406-8103-0cba160e7047&ClientCorrelationId=0d3bf626-18d0-46bf-8ce4-667b7bb485b4",
"Verb": "GET",
"Headers": {
"Accept": "text/plain, application/json, text/json",
"X-ClientType": "OwaMail",
"X-ClientFeature": "LivePersonaCard",
"X-LPCVersion": "1.20201124.2.1",
"authorization": "Bearer EwAYA9[...]",
"X-HostAppCapabilities": "{}"
}
該功能正在使用指定的名稱和電子郵件地址,查找已注冊的LinkedIn個人資料。此處將名稱“Peter Gibbons”和電子郵件“peter.gibbons aol.com”作為參數(shù)傳遞。
研究人員使用另外一個陌生的電子郵件地址替換上訴地址,服務(wù)器將返回以下所示的JSON消息,其中包含與該地址相關(guān)的用戶的完整LinkedIn個人資料。
{
"Key": "4",
"StatusCode": 200,
"ReasonPhrase": "OK",
"Headers": {
"X-WebSocketCorrelationId": "9cb14592-5728-******",
"Cache-Control": "no-store",
"Server": "Microsoft-HTTPAPI/2.0",
"X-BEServer": "_Loki_10716",
"X-DataCenter": "PROD_NORTHCENTRALUS",
"X-ServerVersion": "0.20201202.4.1",
"X-Content-Type-Options": "nosniff",
"X-TokenTtl": "86390",
"X-InboundDuration": "14",
"X-CorrelationId": "9cb14592-5728-47c5- ******,
"Access-Control-Allow-Origin": "https://sfnam.loki.delve.office.com",
"Access-Control-Allow-Credentials": "true",
"Access-Control-Expose-Headers": "X-ServerVersion,X-InboundDuration,X-BEServer,X-TokenTtl,X-SocialDistance,X-CorrelationId,X-DataCenter,x-azure-ref,Retry-After",
"Date": "Mon, 07 Dec 2020 16:26:01 GMT"
},
"Body": "<<JSON escaped string>>"
}
響應(yīng)體屬性中包含如下所示的JSON對象,數(shù)據(jù)中包含全名、公司、位置、專業(yè)經(jīng)驗、學(xué)校出勤率和個人資料地址。
{\"resultTemplate\":\"ExactMatch\",\"bound\":true,\"bindUrl\":\"https://login.live.com/accountbind.srf?provider=linkedin.com&redirect_uri=https://loki.delve.office.com/linkedInAuthRedirect.aspx&client_id=000000004C1E916B&dualbind=1&mkt=en-US&external_app=Owa&dualbindmobile=True\",
\"persons\":[{\"id\":\"urn:li:person:DgEN90FFXdpXh-OCiFTGl3l0pTo6d4ub6h19lWlc7mE\",\"displayName\":\"Kevin Mitnick\",\"headline\":\"The World's Most Famous Hacker | CEO | Author | Professional Speaker\",\"companyName\":\"Mitnick Security Consulting\",\"location\":\"Henderson, Nevada, United States\",
\"photoUrl\":\"https://media.licdn.com/dms/image/C4E03AQEKmI4XcvU8nQ/profile-displayphoto-shrink_800_800/0?e=1613001600&v=beta&t=o8EaQb4TeZn9JhUOTJJOS3PA9uzaewnHWO7n7nJNDfw\",\"linkedInUrl\":\"https://www.linkedin.com/in/kevinmitnick\",
//... JSON messages also include schools, work experience, company details,
}
值得注意的是,該操作無需與LinkedIn用戶進(jìn)行任何交互?,F(xiàn)在,我們已經(jīng)通過任意電子郵件地址獲取LinkedIn個人資料了。
總結(jié)
該功能可以被惡意攻擊者用于進(jìn)行去匿名化攻擊、憑證填充,以及網(wǎng)絡(luò)釣魚攻擊等惡意活動。為了避免遭受到此類攻擊,建議用戶禁止任何人可以通過電子郵件地址查看個人資料,并拒絕與不認(rèn)識的用戶建立連接或向所有人隱藏聯(lián)系信息。