Yama¶
Yama 是一個 Linux 安全模組,它收集核心核心本身不處理的系統範圍內的 DAC 安全保護措施。 這可以在構建時透過 CONFIG_SECURITY_YAMA 選擇,並且可以透過 /proc/sys/kernel/yama 中的 sysctl 在執行時進行控制
ptrace_scope¶
隨著 Linux 越來越受歡迎,它將成為惡意軟體的更大目標。 Linux 程序介面一個特別令人擔憂的弱點是,單個使用者能夠檢查其任何程序的記憶體和執行狀態。 例如,如果一個應用程式(例如 Pidgin)被攻破,攻擊者就可以連線到其他正在執行的程序(例如 Firefox、SSH 會話、GPG 代理等)以提取其他憑據,並在不求助於使用者輔助網路釣魚的情況下繼續擴大其攻擊範圍。
這不是一個理論問題。 SSH 會話劫持 和 任意程式碼注入 攻擊已經存在,並且如果 ptrace 被允許像以前一樣執行,仍然是可能的。 由於非開發人員和非管理員通常不使用 ptrace,因此係統構建者應該被允許選擇停用此除錯系統。
對於解決方案,某些應用程式使用 prctl(PR_SET_DUMPABLE, ...) 專門禁止此類 ptrace 連線(例如 ssh-agent),但許多應用程式沒有這樣做。 一個更通用的解決方案是僅允許從父程序直接 ptrace 到子程序(即直接的“gdb EXE”和“strace EXE”仍然有效),或者使用 CAP_SYS_PTRACE(即“gdb --pid=PID”和“strace -p PID”仍然作為 root 使用者工作)。
在模式 1 中,已定義除錯程序與其下級程序之間的特定於應用程式的關係的軟體(崩潰處理程式等),可以使用 prctl(PR_SET_PTRACER, pid, ...)。 下級可以宣告允許哪個其他程序(及其後代)呼叫針對它的 PTRACE_ATTACH。 對於每個下級程序,一次只能存在一個此類宣告的除錯程序。 例如,KDE、Chromium 和 Firefox 的崩潰處理程式以及 Wine 使用它來僅允許 Wine 程序相互 ptrace。 如果程序希望完全停用這些 ptrace 限制,它可以呼叫 prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY, ...),以便任何其他允許的程序(即使是外部 pid 名稱空間中的程序)都可以附加。
sysctl 設定(僅可使用 CAP_SYS_PTRACE 寫入)為
- 0 - 經典 ptrace 許可權
程序可以
PTRACE_ATTACH到在同一 uid 下執行的任何其他程序,只要它是可轉儲的(即可轉儲意味著沒有轉換 uid,沒有以特權身份啟動,或者已經呼叫了prctl(PR_SET_DUMPABLE...))。 同樣,PTRACE_TRACEME保持不變。- 1 - 受限 ptrace
程序必須與其想要呼叫
PTRACE_ATTACH的下級程序具有預定義的關係。 預設情況下,此關係是隻有其後代滿足上述經典標準時才能建立。 要更改關係,下級程序可以呼叫prctl(PR_SET_PTRACER, debugger, ...)來宣告允許的偵錯程式 PID 以呼叫下級程序上的PTRACE_ATTACH。 使用PTRACE_TRACEME保持不變。- 2 - 僅管理員附加
只有具有
CAP_SYS_PTRACE的程序才能使用 ptrace,無論使用PTRACE_ATTACH還是透過呼叫PTRACE_TRACEME的子程序。- 3 - 禁止附加
任何程序都不能使用 ptrace 和
PTRACE_ATTACH,也不能透過PTRACE_TRACEME使用。 設定後,此 sysctl 值將無法更改。
最初的僅限子程序的邏輯是基於 grsecurity 中的限制。