root權限后,不要忘了還有selinux


下面的例子運行在中興android 5.0手機上。

當我們使用root權限的python去創建socket監聽端口8088時,selinux向kmsg輸出了下面的記錄

python-android5 對 socket 的操作 create, setopt, bind, listen等都是denied不允許的,因為目標(target)需要權限在tcontext=u:r:init:s0,但是我們的python運行在root權限下,所以scontext=u:r:init:s0滿足了tcontext,我們的操作被允許permissive=1,但不是selinux子系統所希望的,並記錄在kmsg。

我們既然成功在8088端口上監聽了,那么是否就等同於可以接收incoming連接呢,可能你會想到防火牆過濾,我們就看一下防火牆策略 (8088端口放開了)。

那么我們向上面打開的監聽端口8088發起連接,會怎么樣呢?結果失敗了,請看kmsg輸出。

防火牆netd以scontext=u:r:netd:s0,應該是想向端口8088的socket的backlog寫入,但是無奈操作socket需要權限tcontext=u:r:init:s0,防火牆對listen的sokcet的操作 { read write }被selinux子系統拒絕 permissive=0,selinux向kmsg輸出日志記錄。防火牆不是運行在高權限下,即使你的程序提升到root權限了,也無能為力。換句話說,如果你的程序依賴了其它進程的服務,那么你所依賴的進程的selinux權限,也將制約着你的程序。這時只好關閉selinux,但是這樣就比較不安全了。

關閉selinux后,我們再次向8088端口發起連接,結果成功了,看kmsg輸出。

首先我們的python程序在root權限下創建了socket,同時沒有權限的防火牆netd也隨selinux子系統的關閉,對socket的操作被允許,這一切都是selinux子系統所不希望的,必須在kmsg記錄下日志。后面就是正常的tcp建立連接三次握手,selinux同時也在kmsg記錄下日志,日志輸出如下。

 

又一例就是screencap,你在root權限下也不能截屏。

selinux卻在kmsg輸出記錄。

 

解決就是關閉selinux,通過setenforce 或 /sys/fs/selinux。這樣很不安全,另外就是使用supolicy修改個別政策。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM