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