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 欄位可以是 allocateddeallocated

allocated 狀態是同一審計事件的一部分,並遵循域的第一個記錄的 AUDIT_LANDLOCK_ACCESS 記錄。 它標識呼叫 sys_landlock_restrict_self() 時的 Landlock 域資訊,其中包含以下欄位

  • domain ID

  • 強制執行 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))。

其他文件