gRPC 是一個高性能、開源和通用的 RPC 框架,面向移動和 HTTP/2 設(shè)計。目前提供 C、Java 和 Go 語言版本,分別是:grpc, grpc-java, grpc-go. 其中 C 版本支持C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持。
當(dāng)前企業(yè)正在慢慢改用微服務(wù)架構(gòu)來構(gòu)建面向未來的應(yīng)用程序,微服務(wù)使企業(yè)能夠有效管理基礎(chǔ)架構(gòu),輕松部署更新或改進(jìn),并幫助IT團隊的創(chuàng)新和學(xué)習(xí)。它還可以幫助企業(yè)能夠設(shè)計出可以輕松按需擴展的應(yīng)用程序,此外,隨著企業(yè)轉(zhuǎn)換架構(gòu)(從傳統(tǒng)的單片式服務(wù)過渡到微服務(wù)),出現(xiàn)了在微服務(wù)之間進(jìn)行有效通信的需求。客戶端和服務(wù)器應(yīng)用程序之間的這種關(guān)鍵而復(fù)雜的通信可以通過gRPC來處理,該框架促進(jìn)了已連接系統(tǒng)之間的透明和高效的通信。盡管它很新(僅在2015年由Google開發(fā)),但它很快就獲得了普及和采用。
在此文中,趨勢科技將討論開發(fā)人員在轉(zhuǎn)向gRPC并在其項目中實現(xiàn)gRPC時可能面臨的安全隱患。由于安全的gRPC API在整個應(yīng)用程序安全中起著至關(guān)重要的作用,因此趨勢科技提供了有關(guān)如何保護(hù)gRPC實施免受威脅并緩解風(fēng)險的建議。
什么是gRPC?
gRPC可用于設(shè)計要求準(zhǔn)確性、效率和語言獨立性的新協(xié)議,因為它支持服務(wù)器和客戶端的多種語言。這是一個云原生計算(CNCF)項目,并已被各大公司采用,例如流行的視頻流網(wǎng)站Netflix,金融服務(wù)公司Square和平臺即服務(wù)(PaaS)公司Docker。
將gRPC與其他RPC框架(例如SOAP和REST)進(jìn)行了比較,盡管RESTful API被廣泛使用,并且通常使用HTTP在應(yīng)用程序或服務(wù)與JavaScript Object Notation(JSON)數(shù)據(jù)格式之間交換信息,但是它們具有性能和基于文本的方向限制。
許多組織已經(jīng)將其API從REST遷移到gRPC,以利用更適合于服務(wù)間通信的gRPC二進(jìn)制協(xié)議。默認(rèn)情況下,gRPC使用HTTP / 2(基于二進(jìn)制的協(xié)議)作為底層, HTTP / 2在一個TCP連接中支持多個流和請求,與其之前的HTTP / 1.0不同,HTTP / 1.0被設(shè)計為具有“單一請求,單一應(yīng)答”方案。HTTP/1.1中的HTTP管道解決了這個問題,HTTP 2.0仍然具有更好的性能和更受支持。
HTTP / 1.0與HTTP / 2在請求和響應(yīng)方面的不同之處
gRPC建立在協(xié)議緩沖區(qū)(或protobuf)之上,后者是Google的平臺和語言無關(guān)的機制,用于序列化結(jié)構(gòu)化數(shù)據(jù)。序列化是將內(nèi)存中的對象轉(zhuǎn)換為字節(jié)流的過程,可以輕松地將其保存到文件中或通過網(wǎng)絡(luò)傳輸給其他應(yīng)用程序。開發(fā)人員只描述一次數(shù)據(jù)接口,然后使用用于所選語言的協(xié)議緩沖區(qū)編譯器對其進(jìn)行編譯。對于gRPC,協(xié)議緩沖區(qū)也用于定義RPC接口。
gRPC框架如何在在線零售應(yīng)用程序中工作的圖示,該產(chǎn)品具有通過API進(jìn)行交互的產(chǎn)品和支付服務(wù)
發(fā)送字符串消息的gRPC“ HelloWorld”演示示例
gRPC的潛在威脅和風(fēng)險漏洞
gRPC支持多種編程語言,支持的語言中使用兩種類型的實現(xiàn):使用語言本身的實現(xiàn),以及封裝gRPC C-core編寫的代碼。這些封裝程序可以將以不同支持的語言編寫的調(diào)用轉(zhuǎn)換為C調(diào)用。盡管C語言實現(xiàn)通??梢院芎玫貓?zhí)行,但由于需要實現(xiàn)更多功能以及內(nèi)存管理功能,因此開發(fā)人員將漏洞引入系統(tǒng)的可能性更高。另一方面,使用諸如Java或Go之類的語言,這些語言已經(jīng)實現(xiàn)了很多功能,并且還考慮了內(nèi)存管理問題,這降低了開發(fā)人員向系統(tǒng)中引入嚴(yán)重影響的漏洞的機會。值得注意的是,選擇合適的語言的重要性可能在保持系統(tǒng)更安全方面起著重要作用。
注意:1.可以使用純C#實現(xiàn)或圍繞C的C#封裝程序;2.純JavaScript實現(xiàn)以及與gRPC C-core的綁定(使用C ++附加組件)
不安全的數(shù)據(jù)傳輸通道和通道憑證
在遠(yuǎn)程過程調(diào)用期間,數(shù)據(jù)很可能會傳輸?shù)侥繕?biāo)服務(wù)器。這就是為什么開發(fā)人員應(yīng)優(yōu)先考慮為數(shù)據(jù)傳輸設(shè)置安全通道。這樣做不僅可以防止數(shù)據(jù)泄漏,而且可以限制中間人(MiTM)攻擊,因為熟練的攻擊者可能會泄漏服務(wù)數(shù)據(jù)或向連接中注入惡意數(shù)據(jù),這將干擾服務(wù)器。
數(shù)據(jù)泄漏可能會泄露有關(guān)你的服務(wù)或基礎(chǔ)結(jié)構(gòu)的實施詳細(xì)信息,從而可能引發(fā)進(jìn)一步的攻擊,甚至導(dǎo)致服務(wù)或基礎(chǔ)結(jié)構(gòu)受到攻擊。這是從不安全的gRPC調(diào)用捕獲數(shù)據(jù)包的示例:
從不安全的gRPC調(diào)用捕獲數(shù)據(jù)包的示例
gRPC在整個基礎(chǔ)HTTP / 2協(xié)議以及各種身份驗證機制上支持TLS,選擇安全的實施是開發(fā)人員的責(zé)任。出于明顯的原因,應(yīng)避免使用諸如“InsecureChannelCredentials”之類的關(guān)鍵字進(jìn)行復(fù)制和粘貼模式。
趨勢科技已經(jīng)執(zhí)行Github.com代碼搜索
“InsecureChannelCredentials”關(guān)鍵字以及C ++語言限制(這是gRPC使用的常見限制)。搜索產(chǎn)生了超過11000個代碼結(jié)果。趨勢科技相信大量的搜索事件與演示和示例相關(guān)。但是,仍然有一些項目使用它們。
“InsecureChannelCredentials”代碼搜索結(jié)果
程序執(zhí)行漏洞
同樣,對于AWS Lambda函數(shù),最大的漏洞隱藏在實際的遠(yuǎn)程過程實現(xiàn)中。因為gRPC支持多種語言,所以趨勢科技建議新手開發(fā)人員使用內(nèi)存安全的語言,以避免嚴(yán)重影響內(nèi)存管理的漏洞,如緩沖區(qū)溢出或?qū)е逻h(yuǎn)程代碼執(zhí)行(RCE)的UaF 漏洞。
但是,使用內(nèi)存安全語言仍然無法緩解代碼中可能出現(xiàn)的邏輯漏洞。為此,開發(fā)人員應(yīng)為開發(fā)流程設(shè)置高標(biāo)準(zhǔn),始終遵循安全軟件開發(fā)最佳實踐,并通過使用OWASP安全編碼實踐中的OWASP十大主動控制建議來實施主動控制。
即使在隔離的網(wǎng)絡(luò)或私有云內(nèi)部,也強烈建議對系統(tǒng)的關(guān)鍵部分使用集中式身份驗證機制。在配置錯誤的情況下,環(huán)境內(nèi)部的漏洞利用可能作為未授權(quán)訪問的入口點,這可能嚴(yán)重干擾gRPC服務(wù)。
趨勢科技還建議不要將gRPC身份驗證詳細(xì)信息硬編碼或提交給供應(yīng)鏈管理(SCM)系統(tǒng),尤其是面向公眾的系統(tǒng)。與其他任何憑據(jù)信息一樣,這些憑據(jù)信息應(yīng)存儲在安全的位置,并且僅在需要時才進(jìn)行訪問。這是一個gRPC憑證泄漏的示例,趨勢科技只是通過在GitHub上進(jìn)行搜索而發(fā)現(xiàn)的:
在GitHub上找到的gRPC服務(wù)憑證示例
拒絕服務(wù)攻擊
最后,我們想討論趨勢科技的拒絕服務(wù)(DoS)攻擊發(fā)現(xiàn)。gRPC可以充當(dāng)隔離環(huán)境中的“隱藏”消息服務(wù),以及使用JSON格式的API替代面向公眾的REST API服務(wù)。
在此,趨勢科技想警告C / C ++ gRPC用戶一個已知的但仍未修復(fù)的漏洞,該漏洞會在服務(wù)重新啟動之前有效地拒絕服務(wù)調(diào)用。在短時間內(nèi)打開大量連接時會觸發(fā)該漏洞。實際上,這是由于Linux系統(tǒng)上打開的文件描述符的數(shù)量受到限制。
gRPC庫的C / C ++實現(xiàn)內(nèi)部的DoS攻擊示例
根據(jù)我們的研究,當(dāng)套接字連接在很短的時間內(nèi)被打開,甚至在打開的套接字被關(guān)閉之后,這個漏洞就會被觸發(fā)。趨勢科技用Java和Go等非C語言封裝的其他語言測試了此實現(xiàn),發(fā)現(xiàn)它們不受此漏洞的影響。
趨勢科技提出了以下變通辦法,以幫助緩解在無法從一個平臺切換到另一個平臺的情況下發(fā)生DoS攻擊的風(fēng)險:
1、通過執(zhí)行“sudo ulimit -n extendedNumber”來增加文件描述符的限制。
2、使用外部載荷平衡器和服務(wù)監(jiān)視器可以減少單個實例的載荷并關(guān)注服務(wù)狀態(tài)。
針對gRPC的安全建議
由于gRPC框架服務(wù)的可靠性和可伸縮性,使用該框架的企業(yè)數(shù)量不斷增加,因此應(yīng)該有更廣泛的認(rèn)識來保護(hù)該協(xié)議免受攻擊風(fēng)險和威脅。
盡管gRPC支持系統(tǒng)之間的高效通信,但必須強調(diào)的是,確保這些系統(tǒng)之間的通信安全是開發(fā)人員的責(zé)任。gRPC提供了有關(guān)受支持的身份驗證機制的全面指南,該機制將與該協(xié)議一起使用,例如開發(fā)人員應(yīng)遵循的使用SSL / TLS(具有或不具有基于Google令牌的身份驗證)的協(xié)議。另外,開發(fā)人員還可以選擇通過Credentials插件API插入自己的身份驗證系統(tǒng)。
開發(fā)人員還應(yīng)該使用能夠驗證內(nèi)容的安全解決方案,以確保沒有惡意負(fù)載能夠通過從客戶機到服務(wù)器的消息滲透到系統(tǒng)中,反之亦然。
對于企業(yè)來說,確保關(guān)鍵數(shù)據(jù)在傳輸過程中保持安全、密切關(guān)注服務(wù)狀態(tài)并實施身份驗證和授權(quán)以確保數(shù)據(jù)安全的解決方案也至關(guān)重要。
gRPC框架是開發(fā)人員和企業(yè)構(gòu)建API,應(yīng)用程序和微服務(wù)的有效工具。但是,像它的前任一樣,它同樣可以不受風(fēng)險和威脅的侵害。因此,應(yīng)該強調(diào)安全解決方案、檢查和控制的必要性。