GAE相关
Google App Engine for Java是可以在Google托管服務器基礎架構上托管和運行用戶Web應用程序。出于安全原因,這些應用程序在沙盒環境中執行。
沙箱本身由兩層組成。第一層是GAE Java沙箱,它建立在底層Java SE軟件之上。第二層是本機OS沙箱,它限制了操作系統對用戶應用程序和GAE環境本身的暴露。
標準Java SE安全沙箱以及GAE沙盒層的存在對GAE環境中執行的用戶應用程序強制實施了若干限制。
默認情況下,用戶應用程序無法訪問基礎本機OS的文件系統。用戶代碼只對其唯一的應用程序部署目錄及其所有子目錄具有只讀訪問權限。用戶應用程序無法將任何數據寫入文件系統。他們需要使用App Engine數據存儲區API進行任何持久數據存儲
網絡套接字僅適用于GAE付費應用程序,只能創建出站,客戶端(非監聽)TCP或UDP套接字,不能綁定到特定地址或端口
用戶應用程序是Web應用程序,因此它們通過Servlet API或JSP文件處理Web請求。用戶代碼通常在關聯的HTTP請求時生成。 GAE確保在完成請求處理后終止與給定HTTP請求關聯的所有線程。同時在處理HTTP請求后沒有用戶代碼被執行。這其中包括各種系統Java處理程序和終結程序。雖然GAE中提供了對所謂的后臺線程和cron任務的支持,但它們并未實現為經典后臺Java線程。
大多數java.lang.System API不適用于用戶應用程序。因此,用戶代碼無法隱式觸發GC操作。但GAE使用戶代碼可以創建任意類加載器。因此,用戶應用程序可以成功定義和創建java.lang.ClassLoader類的子類實例來實現自定義類的加載邏輯。類加載器可以為JVM提供類定義及其權限(保護域和權限)。GAE允許對應用程序自己的類(由應用程序類加載器或自定義的用戶定義的類加載器定義的類)進行完全和不受限制的Reflection API訪問。
為了最大限度地降低JRE中存在的安全漏洞帶來的風險,GAE采用了JRE Class White List的概念。它的目標是限制用戶代碼可以訪問的JRE類集。只有在環境中允許所請求的類時,任意類加載或鏈接才會成功(它存在于被視為安全JRE類的列表中的JRE類白名單)。
GAE Java Runtime沙箱在native和Java類級別實現。其依賴于兩個通信通道來服務和處理特定的RPC請求。兩個通道都是沙盒啟動過程的一部分。native Java Runtime層依賴于C1通道。非原生層使用C2通道。
GAE Runtime實現了虛擬文件系統給任意文件訪問,并再native層實現攔截與代理(LibcProxy和FDProxy組件)。通過GAE的代理庫調用實現C1通信通道將它們分派給適當的RPC服務。
在GAE中,用戶應用程序加載的所有類都需要在定義JVM中的給定類之前執行強制驗證步驟(掃描)。掃描是通過UserClassLoader類的代碼及其特定的findClass方法進行的。類掃描構成了GAE Java沙箱的基本安全機制。類加載器,反射API,JRE類白名單幾個關鍵GAE安全概念的實現依賴于它。檢查過程本身依賴于類文件的靜態分析,使用ASM(Java字節碼操作和分析框架)實現類掃描。如果給定的Class文件不滿足GAE沙箱的某些安全要求(即無效的子類化),則類掃描可能引發異常。如果已完成,則輸入的Class字節將被復制到輸出流而不進行任何修改,或者根據特定規則進行轉換。
GAE實現了一種允許任意修改或完全攔截JRE類的機制。 API注入機制使得在調用另一個方法之前調用給定方法成為可能。 API攔截允許調用給定方法來代替另一個方法。攔截API可以應用于方法,字段和構造函數。 Interjection API僅支持方法。 GAE Class Sweeper對檢查類的代碼應用適當的轉換,以實現API插入和攔截功能。如果用戶代碼中引用的給定類具有鏡像,則對它的每個引用都將替換為對該鏡像的引用。類似地,在鏡像類中具有相應實現(定義)的類的方法(字段)的實例調用被鏡像方法(字段)的靜態調用(訪問操作)替換。 截至2014年10月,GAE針對160個JRE類實施了API攔截。 API Interjection僅針對4個類進行。
由于攔截機制,本地GAE環境難以完全復現Google的生產環境,在本地GAE環境中開發和測試的所有POC,在本地運行良好,但其中許多在生產環境中失敗了。
GAE存根類包含虛擬方法和初始化程序,除了在調用時拋出異常之外沒有太多作用。
GAE Java運行時創建了幾個Class Loader名稱空間,它們在用戶,運行時和系統代碼之間提供了自然的隔離。用戶應用程序代碼加載始終由com.google.apphosting.runtime.security.UserClassLoader類的實例處理。此類加載器也設置為當前Thread的上下文類加載器。 UserClassLoader命名空間始終是Class Sweeping的主題。這在類加載器級別為GAE沙箱層形成安全邊界。UserClassLoader還依賴于兩個額外的類加載器來進行類加載。 com.google.apphosting.runtime.security.RuntimeClassLoader類的實例用于加載GAE Java Runtime實現類。還有一個PrivilegedClassLoader類的實例,它是UserClassLoader的一個內部類。它處理實現Class Sweeper的API Interjection和Interception層的類(所有攔截/插入的類定義)。
轉載于:https://www.cnblogs.com/joeat1/p/11428220.html
總結
- 上一篇: python中ix用法_Python P
- 下一篇: antd FormItem嵌套FormI