Landlock:系統級管理¶
- 作者:
Mickaël Salaün
- 日期:
2025 年 3 月
Landlock 可以利用審計框架來記錄事件。
使用者空間文件可以在這裡找到:Landlock: 非特權訪問控制。
審計¶
如果啟用了 audit,預設情況下,沙盒程式被拒絕的訪問請求將被記錄。可以使用 sys_landlock_restrict_self() 標誌更改此預設行為(參見 Landlock: 非特權訪問控制)。 Landlock 日誌也可以透過審計規則遮蔽。 Landlock 可以生成 2 種審計記錄型別。
記錄型別¶
- AUDIT_LANDLOCK_ACCESS
此記錄型別標識對核心資源的被拒絕的訪問請求。
domain欄位指示阻止該請求的域的 ID。blockers欄位指示此拒絕的原因(以逗號分隔),以下欄位標識核心物件(類似於 SELinux)。 每個審計事件可能存在多個此記錄型別。檔案連結請求生成同一事件中的兩個記錄的示例
domain=195ba459b blockers=fs.refer path="/usr/bin" dev="vda2" ino=351 domain=195ba459b blockers=fs.make_reg,fs.refer path="/usr/local" dev="vda2" ino=365
- AUDIT_LANDLOCK_DOMAIN
此記錄型別描述 Landlock 域的狀態。
status欄位可以是allocated或deallocated。allocated狀態是同一審計事件的一部分,並遵循域的第一個記錄的AUDIT_LANDLOCK_ACCESS記錄。 它標識呼叫sys_landlock_restrict_self()時的 Landlock 域資訊,其中包含以下欄位domainID強制執行
mode域建立者的
pid域建立者的
uid域建立者的可執行路徑(
exe)域建立者的命令列(
comm)
示例
domain=195ba459b status=allocated mode=enforcing pid=300 uid=0 exe="/root/sandboxer" comm="sandboxer"
deallocated狀態是其自身的事件,它標識 Landlock 域的釋放。 在此類事件之後,保證相關域名 ID 在系統的生命週期內永遠不會被重用。domain欄位指示已釋放的域的 ID,denials欄位指示被拒絕的訪問請求的總數,根據審計規則和sys_landlock_restrict_self()的標誌,這些請求可能沒有被記錄。示例
domain=195ba459b status=deallocated denials=3
事件樣本¶
以下是兩個日誌事件的示例(請參閱序列號)。
在此示例中,沙盒程式 (kill) 嘗試向 init 程序傳送訊號,由於訊號範圍限制 (LL_SCOPED=s) 而被拒絕
$ LL_FS_RO=/ LL_FS_RW=/ LL_SCOPED=s LL_FORCE_LOG=1 ./sandboxer kill 1
此命令生成兩個事件,每個事件都使用時間戳之後的唯一序列號標識 (msg=audit(1729738800.268:30))。 第一個事件(序列 30)包含 4 個記錄。 第一個記錄 (type=LANDLOCK_ACCESS) 顯示了域 1a6fdc66f 拒絕的訪問。 此拒絕的原因是訊號範圍限制 (blockers=scope.signal)。 本應接收此訊號的程序是 init 程序 (opid=1 ocomm="systemd")。
第二個記錄 (type=LANDLOCK_DOMAIN) 描述了 (status=allocated) 域 1a6fdc66f。 此域由執行 root 使用者啟動的 /root/sandboxer 程式的程序 286 建立。
第三個記錄 (type=SYSCALL) 描述了 syscall、其提供的引數、其結果 (success=no exit=-1) 以及呼叫它的程序。
第四個記錄 (type=PROCTITLE) 以十六進位制值顯示命令名稱。 這可以使用 python -c 'print(bytes.fromhex("6B696C6C0031"))' 進行翻譯。
最後,最後一個記錄 (type=LANDLOCK_DOMAIN) 也是來自第二個事件(序列 31)的唯一一個。 它不與直接的使用者空間操作相關聯,而是與非同步操作相關聯,以釋放與 Landlock 域相關的資源 (status=deallocated)。 這對於瞭解以下日誌將不再涉及域 1a6fdc66f 很有用。 此記錄還總結了此域拒絕的請求數 (denials=1),無論它們是否被記錄。
type=LANDLOCK_ACCESS msg=audit(1729738800.268:30): domain=1a6fdc66f blockers=scope.signal opid=1 ocomm="systemd"
type=LANDLOCK_DOMAIN msg=audit(1729738800.268:30): domain=1a6fdc66f status=allocated mode=enforcing pid=286 uid=0 exe="/root/sandboxer" comm="sandboxer"
type=SYSCALL msg=audit(1729738800.268:30): arch=c000003e syscall=62 success=no exit=-1 [..] ppid=272 pid=286 auid=0 uid=0 gid=0 [...] comm="kill" [...]
type=PROCTITLE msg=audit(1729738800.268:30): proctitle=6B696C6C0031
type=LANDLOCK_DOMAIN msg=audit(1729738800.324:31): domain=1a6fdc66f status=deallocated denials=1
這是另一個展示檔案系統訪問控制的示例
$ LL_FS_RO=/ LL_FS_RW=/tmp LL_FORCE_LOG=1 ./sandboxer sh -c "echo > /etc/passwd"
相關的審計日誌包含來自同一域 1a6fdc679 建立的 3 個不同事件(序列 33、34 和 35)的 8 個記錄
type=LANDLOCK_ACCESS msg=audit(1729738800.221:33): domain=1a6fdc679 blockers=fs.write_file path="/dev/tty" dev="devtmpfs" ino=9
type=LANDLOCK_DOMAIN msg=audit(1729738800.221:33): domain=1a6fdc679 status=allocated mode=enforcing pid=289 uid=0 exe="/root/sandboxer" comm="sandboxer"
type=SYSCALL msg=audit(1729738800.221:33): arch=c000003e syscall=257 success=no exit=-13 [...] ppid=272 pid=289 auid=0 uid=0 gid=0 [...] comm="sh" [...]
type=PROCTITLE msg=audit(1729738800.221:33): proctitle=7368002D63006563686F203E202F6574632F706173737764
type=LANDLOCK_ACCESS msg=audit(1729738800.221:34): domain=1a6fdc679 blockers=fs.write_file path="/etc/passwd" dev="vda2" ino=143821
type=SYSCALL msg=audit(1729738800.221:34): arch=c000003e syscall=257 success=no exit=-13 [...] ppid=272 pid=289 auid=0 uid=0 gid=0 [...] comm="sh" [...]
type=PROCTITLE msg=audit(1729738800.221:34): proctitle=7368002D63006563686F203E202F6574632F706173737764
type=LANDLOCK_DOMAIN msg=audit(1729738800.261:35): domain=1a6fdc679 status=deallocated denials=2
事件過濾¶
如果您收到與 Landlock 相關的垃圾郵件審計日誌,這要麼是攻擊嘗試,要麼是安全策略中的錯誤。 我們可以透過兩種互補的方式設定一些過濾器來限制噪音
如果我們能夠修復沙盒程式,則可以使用
sys_landlock_restrict_self()的標誌,或使用審計規則(參見 auditctl(8))。