SELinux權限問題解決方法

前言

之前做系統應用操作設備節點的時候,出現SELinux權限的問題,即SELinux Policy Exception,查看log可以看到諸如此類的提示

avc: denied { read } for name="u:object_r:serialno_prop:s0" dev="tmpfs" ino=11725 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:object_r:serialno_prop:s0 tclass=file permissive=0

查了下資料,發現這篇博文介紹的比較全面,這裏引用下該博文並做個簡要的記錄:https://blog.csdn.net/bsxiaomage/article/details/51126826

 

DAC

  • SELinux出現之前,Linux的安全模型採用的是DAC(Discretionary Access Control,自主訪問控制)
  • 自主訪問控制,系統只提供基本的驗證,完整的訪問控制由開發者自己進行控制
  • DAC的不足在於,一旦root權限被拿到,可以任意改動系統文件

MAC

  • 強制性訪問控制,系統針對每一項訪問都進行嚴格的限制,任何進程訪問每一個文件資源都需要進行鍼對性的驗證
  • 在Linux kernel,所有MAC機制都搭建在linux security modules的基礎上,MAC可以彌補DAC的缺陷

SEAndroid

  • SEAndroid有permissive和enforce兩種模式
  • permissive模式只打印異常的LOG,但並不拒絕請求,enforce打印異常LOG,同時也可以拒絕請求
  • SEAndroid嚴格限制了ROOT權限,降低了關鍵進程遭受攻擊的風險,進一步強化了APP的沙箱操作,確保APP難以做出異常或者攻擊行爲,使得APP動態權限調整成爲可能
  • SEAndroid基本架構和原理:是典型的MAC實現,對系統中每一個對象都生成安全上下文,每一個對象訪問系統資源都需要進行安全上下文審查
  • 流程:進程通過系統調用訪問某個資源,進入kernel後會做基本的檢測,然後進行DAC審查,然後調用Linux kernel module的hooks進行MAC驗證,訪問真正的系統資源,返回用戶態
  • SEAndroid分爲內核空間和用戶空間,內核空間的實現基於LSM;而在用戶空間,涉及到安全上下文(security context)、安全策略(SEAndroid policy)和安全服務(security server)這三個模塊
  • 安全上下文:分爲subject主體以及object訪問對象,主體通常以進程爲單位,客體就是進程的訪問資源,通常是以文件爲單位;執行ls -Z就能夠查看安全上下文;一般爲u:object_r:touch_device:s0;u代表SELinux user,object_r代表文件資源,touch_device代表文件資源的type,s0代表MLS的級別,進程的SContext通過ps -Z進行查看,標準格式爲user:role:type[:range]
  • SEAndroid安全策略主要使用對象安全上下文的基礎進行描述,通過主體和客體的安全上下文去定義主體是否有權限訪問客體,稱爲TypeEnforcement,簡稱TE,在external/sepolicy,所有.te後綴的文件通過編譯之後,都會生成一個sepolicy文件;TE一般放在evice/mediatek/common/sepolicy/和external/sepolicy中,包括如下文件
    • 針對attribute的策略:unconfined.te、domain.te、CTS.te、bluetooth.te、net.te、file.te
    • 針對daemon domain的策略:adbd.te、gpsd.te、netd.te、bluetoothd.te、zygote.te、ueventd.te、installd.te、vold.te、dbusd.te、keystore.te、debuggerd.te、mediaserver.te、rild.te、drmserver.te、surfaceflinger.te、qemud.te、servicemanager.te、su.te、shell.te、wpa_supplicant.te
    • 針對系統其他模塊的策略:
      • app.te:在這一文件裏將安裝在系統上的第三方app分類爲受信任的app和不受信任的app,分別用不同的type表示,再分別爲這兩種app在訪問網絡,bluetooth,sdcard,數據,緩存,binder等等名感位置時設置相應權限
      • system.te: 這一文件主要針對的是系統app和system server進程。對系統app訪問binder、systemdata files、dalvikcatch、keystone等進行權限控制,對system server訪問網絡、bluetooth、netlink、app、binder、device、data files、socket、cache files等進行權限控制
      • init.te: 在這一文件中聲明瞭init擁有無限權限
      • nfc.te: 在這一文件中制定了nfc domain對nfc設備和相關數據文件的訪問權限
      • kernel.te: 在這一文件中聲明瞭kernel擁有無限權限
      • radio.te: 在這一文件中制定了radio
      • radio.te: 在這一文件中制定了radio domain對init、rild和相關數據文件的訪問權限
      • device.te: 在這一文件中定義了所有跟設備相關的type,並將這些type都歸到了dev_type屬性中

 

SELinux問題解決方法

  • 主要通過查看SELinux Policy Exception,關鍵字"avc"的log
  • 例子
avc: denied { write } for pid=4663 comm="om.zte.engineer" name="brightness" dev="sysfs" ino=9451 scontext=u:r:radio:s0 tcontext=u:object_r:sysfs:s0 tclass=file permissive=0
  • 分析
    • 缺少的權限:{write/read}
    • 誰缺少權限:scontext=u : r : radio : s0
    • 哪個文件的權限:tcontext=u:object_r:sysfs:s0
    • 文件的類型:tclass=file
  • 解決
    • allow radio sysfs:file write
    • 公式:allow + scontext + tcontext + “:” + file + permission
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章