Ptrace on Linux

2019-04-15 security Ptrace Linux

一直都有想要寫相關的紀錄但一直都沒有時間,直到又看到類似應用的工具才想到把之前想要紀錄的通通寫上來

ptrace 在 Linux 上是一個強大的存在,允許一個 process 除錯另外一個 process,像是 GDB 就是基於 ptrace 來運作的

How

看到了有人分享類似 sudohulksudo_inject 這種工具, 起初看到描述的時候覺得很神,於是去看了 code 了解一下原理,終究發現是需要使用 ptrace 來達到這種效果,但仍然受限於 Yama Security Module,可以透過更改kernel.yama.ptrace_scope的數值來決定 ptrace 可以附加的對象,數值及對應效果如下表

數值 效果
0 只要有相同的 uid,所有的 process 都可以被 debug
1 只有 parent process 可以 debug 自己的 child process
2 只有管理者可以用 ptrace,需要有 CAP_SYS_PTRACE 能力
3 沒有 process 可以被 ptrace,啟用後就改不回來了(root 也不行)除非重開機

在我慣用的 Linux 發行版裡 (Arch, Ubuntu) 預設至少都有 1,難道有發行版預設是 0 ?

Why

還真的有,一番找尋後發現 debian 8 kernel.yama.ptrace_scope 預設為 0,可能是在這個之後的 debian 預設都是 0

主要是因為三個理由

  1. 該設定不算是真正的保護,要能用到 ptrace 照理說已經有 shell 存取權限了,在擁有 user 權限的 shell 情況底下,已經可以做多事情了
  2. 該設定可能會在某些情況下影響除錯應用程式或是 strace 的運作,且在錯誤訊息又不明確與文件不充足的情況下對 bug 回報產生更多阻礙(連用 Google 都可以搜到一堆建議將其設成 0)
  3. 要是為了安全的話,還是有其他的保護機制可以做到,像是敏感的 process 不要被 attach 到,如同 ssh-agent 那樣

Conclusion

工具縱然有用處,但是前提要是在 kernel.yama.ptrace_scope=0 之下才有可能實現,不過倒是在 sudo_injectexploit_v3.sh 中學到一點

在 sudoers 中最後一行通常是 #includedir /etc/sudoers.d,首先 sudoer 是有自己的語法的,這裡的 # 並不是註解而是類似 directive,所以代表會將 /etc/suders.d 的內容載入,該攻擊在資料夾中加入一個檔案,設定如下

Defaults !tty_tickets
Defaults timestamp_timeout=-1

如此一來所有的 terminal 將會共用一個 sudo token 並且不會過期,不失為一個維持權限的方法

References