1. 程式人生 > >root權限後,不要忘了還有selinux

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

系統 oid 你會 pytho android netd sock ima python

下面的例子運行在中興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修改個別政策。

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