國產平臺之T507 開發板Android 安全策略漫談
作業系統:Android10.0
從系統安全方面考慮,SELinux是保護神,但是從軟體開發方面,SELinux就是一道牽絆,這是一把雙刃劍。
比如我們開發應用或者增加系統服務的某些許可權的時候,我們必須遵循SELinux的規則,給我們的應用設定對應的安全策略,否則我們的應用就不具備訪問資料或者裝置的許可權。下面我們MAC訪問控制模型開始,簡單的梳理一下飛凌嵌入式 T507 開發板 Android的安全策略,以及自定義飛凌嵌入式 T507 開發板 Android安全策略的方法。
訪問控制模型DAC,MAC
訪問控制是指控制對計算機或者網路中某個資源的訪問。沒有它,所有人都可以訪問任何資源。有了訪問控制,使用者在獲取實際訪問資源或進行操作之前,必須通過識別、驗證、授權。
自主訪問控制(DAC: Discretionary Access Control)系統識別使用者,根據被操作物件的許可權的設定,來決定該使用者對其擁有的操作許可權,read、write、exec。擁有這個物件許可權的使用者,又可以將該許可權分配給其他使用者,此謂之“Discretionary”。缺陷就是對許可權控制比較分散,不便於管理,比如無法簡單地將一組檔案設定統一的許可權開放給指定的一群使用者。
強制訪問控制(MAC: Mandatory Access Control)MAC是為了彌補DAC許可權控制過於分散的問題而誕生的。在MAC這種模型裡,管理員管理訪問控制。管理員制定策略,使用者不能改變它。策略定義了哪個主體能訪問哪個物件。這種訪問控制模型可以增加安全級別,因為它基於策略,任何沒有被顯式授權的操作都不能執行。MAC被開發和實現在最重視保密的系統中,如軍事系統。主體獲得清楚的標記,物件得到分類標記,或稱安全級別。
基於MAC的SElinux
參考連結:
android.google.cn/security/selinux
軟體通常情況下必須以 Root 使用者帳號的身份執行,才能向原始塊裝置寫入資料。在基於 DAC 的傳統 Linux 環境中,如果 Root 使用者遭到入侵,攻擊者便可以利用該使用者身份向每個原始塊裝置寫入資料。從 Android 4.3 起,SELinux 開始為傳統的自主訪問控制 (DAC) 環境提供強制訪問控制 (MAC) 保護功能。作為 Android 安全模型的一部分,Android 使用安全增強型 Linux (SELinux) 對所有程式強制執行強制訪問控制 (MAC),甚至包括以 Root/超級使用者許可權執行的程式(Linux 功能)。例如,可以使用 SELinux 為這些裝置新增標籤,以便被分配了 Root 許可權的程式只能向相關政策中指定的裝置寫入資料。這樣一來,該程式便無法重寫特定原始塊裝置之外的資料和系統設定。藉助 SELinux,Android 可以更好地保護和限制系統服務、控制對應用資料和系統日誌的訪問、降低惡意軟體的影響,並保護使用者免遭移動裝置上的程式碼可能存在的缺陷的影響。
飛凌嵌入式 T507 開發板 Android系統版本為Android10,SELinux預設開啟,即使獲得了該系統的root許可權,也只能向相關策略中指定的裝置寫入資料,從而更好地保護和限制系統服務,保障系統和資料的安全。
標籤、規則和域
SELinux 依靠標籤來匹配操作和策略。標籤用於決定允許的事項。套接字、檔案和程式在 SELinux 中都有標籤。SELinux 在做決定時需參照兩點:一是為這些物件分配的標籤,二是定義這些物件如何互動的策略。
在 SELinux 中,標籤採用以下形式:user:role:type:mls_level,其中 type 是訪問決定的主要組成部分,可通過構成標籤的其他組成部分進行修改。物件會對映到類,對每個類的不同訪問型別由許可權表示。
策略規則採用以下形式:allow domains types:classes permissions;,其中:
Domain - 一個程式或一組程式的標籤。也稱為域型別,因為它只是指程式的型別。
Type - 一個物件(例如,檔案、套接字)或一組物件的標籤。
Class - 要訪問的物件(例如,檔案、套接字)的型別。Permission - 要執行的操作(例如,讀取、寫入)。
策略配置原始檔
1、external/sepolicy
這是獨立於裝置的配置,一般不能針對裝置進行修改
2、device/<vendor>/<product>/sepolicy
這是特定於裝置的配置,基於 BOARD_SEPOLICY_* 變數來選擇對應平臺的策略配置。
以飛凌嵌入式 T507 開發板 為例,T507策略檔案的路徑如下:
OKT507-android-source/android$ ls device/softwinner/common/sepolicy/private vendor
Type Enforcement (TE) 配置檔案
.te 檔案中儲存了對應物件的域和型別定義、規則。通常每個域一個 .te 檔案,例如installd.te。在 device.te、file.te 中宣告瞭裝置和檔案型別。在某些檔案(例如domain.te、app.te)中則儲存著共享規則。
以飛凌嵌入式 T507 開發板 為例,T507 system_app的TE檔案的路徑如下:
device/softwinner/common/sepolicy/vendor/system_app.te
標籤配置檔案
1、file_contexts:檔案安全上下文
2、property_contexts:屬性安全上下文
以飛凌嵌入式 T507 開發板 為例,T507 安全上下文檔案路徑如下:
device/softwinner/common/sepolicy/vendor/property_contexts
device/softwinner/common/sepolicy/vendor/file_contexts
SEAndroid app分類
SELinux(或SEAndroid)將app劃分為主要三種型別(根據user不同,也有其他的domain型別):
1)untrusted_app 第三方app,沒有Android平臺簽名,沒有
system許可權
2)platform_app 有android平臺簽名,沒有system許可權
3)system_app 有android平臺簽名和system許可權
從上面劃分,許可權等級,理論上:untrusted_app < platform_app < system_app
APP的domain和type
檢視seapp_contexts檔案,APP的domain和type由user和seinfo兩個引數決定
system/sepolicy/private/seapp_contexts
isSystemServer=true domain=system_server_startup
user=_app seinfo=platform name=com.android.traceur domain=traceur_app type=app_data_file levelFrom=all
user=system seinfo=platform domain=system_app type=system_app_data_file
user=bluetooth seinfo=platform domain=bluetooth type=bluetooth_data_file
user=network_stack seinfo=network_stack domain=network_stack levelFrom=all
type=radio_data_file
user=nfc seinfo=platform domain=nfc type=nfc_data_file
user=secure_element seinfo=platform domain=secure_element levelFrom=all
user=radio seinfo=platform domain=radio type=radio_data_file
user=shared_relro domain=shared_relro
user=shell seinfo=platform domain=shell name=com.android.shell type=shell_data_file
user=webview_zygote seinfo=webview_zygote domain=webview_zygote
user=_isolated domain=isolated_app levelFrom=al
luser=_app seinfo=app_zygote domain=app_zygote levelFrom=all
user=_app seinfo=media domain=mediaprovider name=android.process.media type=app_data_file
levelFrom=user
user=_app seinfo=platform domain=platform_app type=app_data_file levelFrom=user
user=_app isEphemeralApp=true domain=ephemeral_app type=app_data_file levelFrom=all
user=_app isPrivApp=true domain=priv_app type=privapp_data_file levelFrom=user
user=_app minTargetSdkVersion=29 domain=untrusted_app type=app_data_file levelFrom=all
user=_app minTargetSdkVersion=28 domain=untrusted_app_27 type=app_data_file levelFrom=all
user=_app minTargetSdkVersion=26 domain=untrusted_app_27 type=app_data_file
levelFrom=user
user=_app domain=untrusted_app_25 type=app_data_file levelFrom=user
user=_app minTargetSdkVersion=28 fromRunAs=true domain=runas_app levelFrom=all
user=_app fromRunAs=true domain=runas_app levelFrom=user
user
參考連結:https://blog.csdn.net/huilin9960/article/details/81530568
user可以理解為UID。android的UID和linux的UID根本是兩回事,Linux的UID是用於針對多使用者作業系統中用於區分使用者的,而Android中的UID是用於系統進行許可權管理的。參考連結中的文章對於uid的產生講的很清楚。
seinfo
不同簽名會建立對應的selinux上下文。
Android.mk
LOCAL_CE
RTIFICATE := platform
有platform簽名,所以seinfo是platform。
LOCAL_CERTIFICATE作用
參考文件https://blog.csdn.net/hnlgzb/article/details/107823874
可以檢視Android原始碼build/target/product/security/ 目錄下提供的預設簽名檔案,不同平臺可能會有差異:飛凌嵌入式 T507 開發板 提供了media、networkstack、platform、shared、testkey、verity六種不同許可權的簽名檔案。
以飛凌嵌入式 T507 開發板 為例,檢視當前執行的應用資訊:
console:/ # ps -Z
u:r:system_app:s0 system 15712 1861 1050628 110868 SyS_epoll_wait
0 S forlinx.example.app
u:r:untrusted_app_27:s0:c512,c768 u0_a62 30259 1861 1052120 114132 SyS_epoll_wait
0 S com.forlinx.changelogo
當前執行的兩個APP,forlinx.example.app的UID(user)是system,擁有platform簽名,它的domain和type就是system_app。
com.forlinx.changelogo沒有設定UID使用的預設設定,其UID為u0_a62,並且沒有設定簽名檔案,它的domain和type就是untrusted_app。
T507自定義安全策略
以上面兩個執行的app來說,我們為這兩個APP新增額外的許可權,對應的TE配置檔案分別就是system_app.te、untrusted_app.te,對應路徑為:
device/softwinner/common/sepolicy/vendor/system_app.te
device/softwinner/common/sepolicy/vendor/untrusted_app.te
以forlinx.example.app為例,我們為其新增can裝置的執行許可權:
OKT507-android-source/android$ vi device/softwinner/common/sepolicy/vendor/system_app.te
...
allow system_app vendor_shell_exec:file { getattr open read execute execute_no_trans };
allow system_app shell_exec:file { getattr open read execute execute_no_trans };
allow system_app shell:file { getattr open read execute execute_no_trans };
...
以策略規則配置形式(allow domains types:classes permissions)
分析:domains:system_app
types:vendor_shell_exec
classes:file
permissions:getattr open read execute execute_no_trans
neverallow failures
有時我們增加的許可權,系統預設的配置是不允許的,比如我們上面給forlinx.example.app增加的執行指令碼的許可權,報錯如下:
libsepol.report_failure: neverallow on line 9 of system/sepolicy/private/system_app.te
(or line 41463 of policy.conf) violated by allow system_app shell:file { read open };
libsepol.report_failure: neverallow on line 22 of system/sepolicy/private/shell.te
(or line 40025 of policy.conf) violated by allow system_app shell:file { read open };
libsepol.check_assertions: 2 neverallow failures occurred
系統預設的安全策略的路徑為system/sepolicy/,根據報錯的提示,我們可以修改預設的配置,修改system/sepolicy/private/system_app.te和system/sepolicy/private/shell.te,從而完成許可權的賦予。
以上就是Android 安全策略的脈絡,以及飛凌嵌入式 T507 開發板 Android系統下自定義安全策略的方法了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69989353/viewspace-2845756/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 國產核心板全志T507助力消防系統升級
- 淺談直播教育平臺開發成本
- 如何在全志T507開發板上架設Samba服務Samba
- 在全志T507開發板上新增兩個GPIO按鍵
- 路在何方?漫談國產GalGame的未來GAM
- 搭建直播平臺,Android開發之禁止下拉通知欄的方法Android
- 漫談直播:從零開始認識直播並快速搭建專屬直播平臺
- SAP UI 和 Salesforce UI 開發漫談UISalesforce
- 平臺資產開發數字資產交易系統開發公司
- 2024年好用的5款國產低程式碼開發平臺
- 漫談Android元件化及Web化Android元件化Web
- 這一平臺橫空出世,國產快速開發時代全面開啟
- 00-跨平臺開發之FlutterFlutter
- 11_QT跨平臺執行之把QT程式交叉編譯到ARM開發板QT編譯
- android開發技巧雜談Android
- 淺談 2018 移動端跨平臺開發方案
- Android安全開發之淺談金鑰硬編碼Android
- 數字資產幣幣交易平臺開發區塊鏈合約交易平臺開發區塊鏈
- 淺談資料開發神器——數棧離線開發平臺(BatchWorks)BAT
- 談談力軟快速開發平臺B/S專業報表工具
- 綠茵面家平臺開發(開發平臺)
- FGC青蛙錢包平臺開發(產品案例)GC
- 漫談2020年國產單機:不可避免的陣痛期 前路依然漫長
- FInClip開放平臺:淺談輕應用的發展
- 淺談移動跨平臺開發框架的發展歷程框架
- android 開發淺談(JDK && NDK)AndroidJDK
- OMAP-L138 + FPGA開發板(Pin-To-Pin國產FPGA)FPGA
- 瑞芯微平臺RK3399主機板PCBA開發設計
- 開發經驗漫談 -- Git在開發流程中的運用Git
- 漫談B端SaaS產品方法論
- 吉隆坡開發數字資產交易平臺
- 如何開發直播平臺,直播平臺開發需要CDN嗎
- 設計模式漫談之策略模式設計模式
- 設計模式漫談之模板方法設計模式
- 設計模式漫談之命令模式設計模式
- 設計模式漫談之代理模式設計模式
- flutter跨平臺開發之App升級方案FlutterAPP
- Web快速開發平臺個人之淺見Web