如何發(fā)現(xiàn)Google云平臺(tái)漏洞
谷歌運(yùn)行有一個(gè)名為Google Service Management的管理服務(wù),谷歌通過(guò)它來(lái)管理各種應(yīng)用谷歌系統(tǒng)的內(nèi)外部接口和用戶(hù)自行創(chuàng)建的云端服務(wù)。在Google Service Management下,用戶(hù)可以在自己的云平臺(tái)項(xiàng)目中對(duì)使用到的Maps API、Gmail API、private APIs等個(gè)人接口服務(wù)進(jìn)行個(gè)性化啟用關(guān)閉,并且能通過(guò)接口配置文件對(duì)各種服務(wù)進(jìn)行實(shí)時(shí)管理控制。
通常來(lái)說(shuō),作為開(kāi)發(fā)人員的我們一般不會(huì)直接使用Google Service Management服務(wù),大多交互操作都是通過(guò)云端控制臺(tái)Google Cloud Console或命令行(如啟用/關(guān)閉服務(wù)),或通過(guò)API管理接口Google Cloud Endpoints來(lái)完成,但值得一提的是,Google Service Management服務(wù)的一個(gè)有意思的API接口。
該API接口不僅能實(shí)現(xiàn)上述服務(wù)管理功能,在谷歌官方說(shuō)明文檔中還記載說(shuō),可以使用該API接口去訪(fǎng)問(wèn)一些谷歌服務(wù)的隱藏功能。
這些隱藏功能可以用多種方式來(lái)發(fā)現(xiàn),但最簡(jiǎn)單最容易的一種就是,在用戶(hù)的谷歌云平臺(tái)項(xiàng)目Google Cloud Platform project中,啟用Service Management的API接口,并開(kāi)啟用于項(xiàng)目流量過(guò)濾的組合框。步驟如下:
在以上最后一張圖中,可以看到各種通過(guò)API來(lái)實(shí)現(xiàn)的功能方法,其中就包含了一些紅框標(biāo)注的隱藏方法。所謂隱藏方法就是,不允許非谷歌客戶(hù)端對(duì)其進(jìn)行訪(fǎng)問(wèn),當(dāng)非谷歌客戶(hù)端嘗試對(duì)其進(jìn)行訪(fǎng)問(wèn)時(shí),就會(huì)返回404錯(cuò)誤。非常有意思的是,這種404錯(cuò)誤不是以HTML頁(yè)面一般那種‘這里出錯(cuò)’的提示出現(xiàn),而是以JSON方式被給出的,它會(huì)提示該方法不存在。
同樣,在API本身中也存在一些隱藏方法,它們是一些公開(kāi)方法中接收的隱藏參數(shù),但相對(duì)來(lái)說(shuō),這些隱藏更難發(fā)現(xiàn)。
對(duì)隱藏方法和隱藏參數(shù)來(lái)說(shuō),它們都使用了一種叫做“Visibility”的谷歌服務(wù)功能,該功能記錄可從公開(kāi)文檔中查詢(xún),但只作為谷歌內(nèi)部使用。
提示:谷歌自身API的隱藏部分可以通過(guò)多種方式來(lái)發(fā)現(xiàn),大多數(shù)時(shí)候它們也有一些隱藏的文檔記錄,而且,谷歌不認(rèn)為這種隱藏的API功能泄露,或隱藏的API記錄文檔存在是一種安全漏洞。(我曾經(jīng)報(bào)告過(guò)這些給谷歌)。
但是,也有一些隱藏功能,如果可成功利用,就會(huì)被認(rèn)為是一種安全漏洞,比如我在一年前發(fā)現(xiàn)的某隱藏參數(shù),成功利用后形成漏洞,谷歌獎(jiǎng)勵(lì)了我00美金。由于目前該漏洞還處于修復(fù)期,現(xiàn)暫不方便透露。
前期分析
了解了上述知識(shí)后,我嘗試用一種方法去訪(fǎng)問(wèn)這些谷歌的隱藏功能,說(shuō)來(lái)也不難,只是在訪(fǎng)問(wèn)谷歌云端控制臺(tái)Google Cloud Console時(shí),去仔細(xì)分析其中產(chǎn)生的HTTP請(qǐng)求。
谷歌云端控制臺(tái)(Google Cloud Console)使用多個(gè)公開(kāi)和私有的Google API,和自己的客戶(hù)端程序,以及API密鑰AIzaSyCI-zsRP85UVOi0DjtiCwWBwQ1djDy741g,來(lái)實(shí)現(xiàn)云端項(xiàng)目的信息訪(fǎng)問(wèn)。
谷歌云端控制臺(tái)(Google Cloud Console)客戶(hù)端的常見(jiàn)請(qǐng)求如下所示:
GET /v1/services?key=AIzaSyCI-zsRP85UVOi0DjtiCwWBwQ1djDy741g HTTP/1.1 Host: servicemanagement.clients6.google.com Authorization: SAPISIDHASH X-Origin: https://console.cloud.google.com Cookie:
我們來(lái)看看其中的名部分含義:
“clients6.google.com”:是請(qǐng)求”googleapis.com”的另外一種表示方法,由于其中的cookie只能訪(fǎng)問(wèn)到google.com的子域名,所以這種方式是必須的;
“SAPISIDHASH” :據(jù)StackOverflow論壇解釋?zhuān)恰盩IMESTAMP_HASH”(時(shí)間戳_哈希)的值,論壇中其它多種生成SAPISIDHASH的方式,與本漏洞無(wú)關(guān);
“X-Origin”:也稱(chēng) “Origin”, 是這里SAPISIDHASH部分和客戶(hù)端對(duì)訪(fǎng)問(wèn)網(wǎng)站進(jìn)行受信驗(yàn)證不可缺少的頭信息;
Cookie:包括SID、HSID、SSID、APISID和SAPISID等,谷歌用戶(hù)需要登錄才能獲取到這些Cookie信息。
由此看來(lái),要偽造谷歌云端控制臺(tái)(Google Cloud Console)的請(qǐng)求非常簡(jiǎn)單,而且由于它是谷歌自身的客戶(hù)端程序,因此它可以訪(fǎng)問(wèn)到多個(gè)Google API,甚至是一些私有Google API的某些內(nèi)部功能,其中就包括Service Management的API。
谷歌云端控制臺(tái)(Google Cloud Console)客戶(hù)端的多個(gè)功能之一就是,創(chuàng)建一個(gè)從一開(kāi)始就附加了配置項(xiàng)的服務(wù)(一般的客戶(hù)端通常會(huì)忽略 “serviceConfig”參數(shù),因?yàn)樵搮?shù)是隱藏的,而且在創(chuàng)建服務(wù)時(shí)不產(chǎn)生初始配置操作),其簡(jiǎn)單的配置請(qǐng)求如下:
POST /v1/services?key=AIzaSyCI-zsRP85UVOi0DjtiCwWBwQ1djDy741g HTTP/1.1 Host: servicemanagement.clients6.google.com Authorization: SAPISIDHASH X-Origin: https://console.cloud.google.com Cookie: Content-Length: { "serviceName": "", "producerProjectId": "", "serviceConfig": { "name": "", "producerProjectId": "", "configVersion": 3 } 漏洞分析
通常來(lái)說(shuō),參數(shù)”serviceName”和”serviceConfig.name”必須與指定了兩者的請(qǐng)求發(fā)生匹配,但在實(shí)際的服務(wù)創(chuàng)建過(guò)程中,當(dāng) “configVersion” 變量值被設(shè)置為1或2,或者是2147483648至4294967295之間的值時(shí)(相當(dāng)于后端發(fā)生了一個(gè)整型溢出),這種匹配的受限條件并不會(huì)被檢查實(shí)行,因此,任意用戶(hù)都可以使用真實(shí)的名稱(chēng)(如“the-expanse.appspot.com”)來(lái)創(chuàng)建服務(wù),只需在其配置文件中聲明它其中還存在另一個(gè)不同的服務(wù),如”my-private-secure-api.appspot.com”。Note:出于兼容性的某個(gè)特殊設(shè)置,該漏洞不會(huì)對(duì)一些舊版本的谷歌服務(wù)造成影響。
該漏洞的出現(xiàn)會(huì)對(duì)谷歌服務(wù)產(chǎn)生重要影響,一些重要的流程使用服務(wù)配置中的服務(wù)名稱(chēng)來(lái)執(zhí)行除權(quán)限檢查之外的任意操作,所以,如果配置中加入了不同的服務(wù)名稱(chēng)后,攻擊者就可以在不同的服務(wù)中執(zhí)行一些重要的操作。這些操作包括:
1#啟用其它服務(wù)
如果我擁有服務(wù)”the-expanse.appspot.com” ,和其在配置項(xiàng)中對(duì)應(yīng)的”very-important-api.example.com” ,當(dāng)啟用 “the-expanse.appspot.com”運(yùn)行某項(xiàng)谷歌的云端項(xiàng)目時(shí),谷歌服務(wù)會(huì)繼續(xù)運(yùn)行,因?yàn)槲覔碛袉⒂谩眛he-expanse.appspot.com” 的權(quán)限,但是,最終操作會(huì)實(shí)現(xiàn)在”very-important-api.example.com”的執(zhí)行上,因此,最終可以啟用”very-important-api.example.com”。
如果用戶(hù)設(shè)置了具備Google API 密鑰或Google認(rèn)證令牌的API,來(lái)對(duì)合法客戶(hù)進(jìn)行認(rèn)證,那么,攻擊者可以繞過(guò)這種身份驗(yàn)證機(jī)制。
由于谷歌本身使用了這種方法來(lái)認(rèn)證合法客戶(hù)端,因此,攻擊者可以使用一些用于開(kāi)發(fā)的私有Google API,獲取到一些僅供白名單用戶(hù)(可信測(cè)試人員、Google My Business API等)才能訪(fǎng)問(wèn)的內(nèi)部信息。
2#訪(fǎng)問(wèn)隱藏功能
Service Management API中的一個(gè)隱藏方法是“PatchProjectSettings”,這允許服務(wù)的所有者配置針對(duì)特定服務(wù)項(xiàng)目的某些隱藏設(shè)置,在這些設(shè)置中,可以選擇配置可見(jiàn)性標(biāo)簽來(lái)對(duì)隱藏功能的訪(fǎng)問(wèn)進(jìn)行管理。
例如,如果我有服務(wù)“the-expanse.appspot.com”,和其配置項(xiàng)中的“cloudresourcemanager.googleapis.com”,我可以發(fā)送以下請(qǐng)求訪(fǎng)問(wèn)我的云端項(xiàng)目(the-expanse)中,由少數(shù)可信測(cè)試人員測(cè)試的功能。
PATCH /v1/services/the-expanse.appspot.com/projectSettings/the-expanse?updateMask=visibilitySettings&key=AIzaSyCI-zsRP85UVOi0DjtiCwWBwQ1djDy741g HTTP/1.1 <..SAME HEADERS AS BEFORE...> { "visibilitySettings": { "visibilityLabels": [ "TRUSTED_TESTER" ] }} 3#關(guān)閉他人云端項(xiàng)目的服務(wù)功能
利用上述同樣的方法,我們可以對(duì)某云端項(xiàng)目是否啟用或關(guān)閉某項(xiàng)服務(wù)進(jìn)行控制,但是,要注意的是,這種方法只能禁用其他人項(xiàng)目中的服務(wù),不能執(zhí)行服務(wù)啟用操作。
比如,如果我有服務(wù)”the-expanse.appspot.com” ,以及配置項(xiàng)中的”cloudresourcemanager.googleapis.com” ,我可以發(fā)送以下請(qǐng)求去禁用位于Cloud SDK中的谷歌云端資源管理API:
PATCH /v1/services/the-expanse.appspot.com/projectSettings/google.com:cloudsdktool?updateMask=usageSettings&key=AIzaSyCI-zsRP85UVOi0DjtiCwWBwQ1djDy741g HTTP/1.1 <..SAME HEADERS AS BEFORE...> { "usageSettings": { "consumerEnableStatus": "DISABLED" } } 漏洞影響
該漏洞可導(dǎo)致很多問(wèn)題,如啟用私有API、訪(fǎng)問(wèn)隱藏功能、禁用其他人項(xiàng)目中的服務(wù),進(jìn)而導(dǎo)致客戶(hù)對(duì)谷歌云端服務(wù)的使用問(wèn)題。我沒(méi)一一進(jìn)行過(guò)驗(yàn)證,但我可以肯定的是,該漏洞可以實(shí)現(xiàn)以下操作,對(duì)客戶(hù)服務(wù)造成影響:
訪(fǎng)問(wèn)各種處于開(kāi)發(fā)階段尚未公開(kāi)的Google API和其中的內(nèi)置功能;
免費(fèi)使用一些收費(fèi)的Google API功能;
訪(fǎng)問(wèn)那些使用谷歌云端服務(wù)來(lái)進(jìn)行開(kāi)發(fā)的私有API;
訪(fǎng)問(wèn)一些谷歌自身未向公眾開(kāi)放的API隱藏功能;
繞過(guò)一些特殊限制條件;
在該漏洞基礎(chǔ)上,對(duì)其它潛在漏洞形成威脅利用;
對(duì)關(guān)鍵API的禁用導(dǎo)致的重要服務(wù)中斷(如Cloud SDK無(wú)法訪(fǎng)問(wèn)項(xiàng)目,Android的YouTube應(yīng)用無(wú)法檢索視頻的元數(shù)據(jù)等等)
漏洞上報(bào)進(jìn)程
2018-01-27 發(fā)現(xiàn)漏洞
2018-01-27 漏洞初報(bào)
2018-01-29 谷歌開(kāi)發(fā)團(tuán)隊(duì)修復(fù)了服務(wù)創(chuàng)建過(guò)程的漏洞
2018-01-29 漏洞報(bào)告分類(lèi)
2018-01-30 與serviceName/serviceConfig.name不匹配的所有服務(wù)都被從谷歌系統(tǒng)中清除,該漏洞也不能再被利用
2018-01-30 谷歌安全團(tuán)隊(duì)不能復(fù)現(xiàn)第3#種威脅,但其測(cè)試工程師還能收到401 錯(cuò)誤
2018-01-30 谷歌安全團(tuán)隊(duì)發(fā)現(xiàn)了疑似與該漏洞相關(guān)的入侵事件,并緊急發(fā)布了修復(fù)補(bǔ)丁
2018-01-31 谷歌方面告知我其開(kāi)發(fā)團(tuán)隊(duì)在我的漏洞報(bào)告之后一小時(shí),也獨(dú)立發(fā)現(xiàn)了該漏洞, 但我的漏洞報(bào)告還是被發(fā)往谷歌安全團(tuán)隊(duì)以評(píng)估賞金
API 安全
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。