kill -s TERM
有效,kill -s ABRT
得到“不允許操作”
有一個我擁有的過程,我可以將其文件聲明發送
SIGABRT
到以獲取一些調試資訊。但是,當我嘗試發送時SIGABRT
,我得到“不允許操作”。我還嘗試向我擁有的其他程序發送相同的信號,以確保沒有一些底層塊阻止我
SIGABRT
完全發送,但它們以適當的方式響應。這只是一個程序,但它是該程序的每個實例。該程序的系統呼叫跟踪表明它從未收到信號。我已經嘗試
/bin/kill
顯式執行以排除我的 shell 內置的任何奇怪之處kill
,並且,除了一些小的輸出差異之外,行為沒有任何變化。root 可以發送
SIGABRT
到該程序,它可以按我的預期工作。我在這個遊戲中已經有一段時間了,但我從未見過使用者無法向他擁有的程序發送信號的情況,也沒有見過使用者可以發送信號但不是另一個。
作業系統是 FreeBSD 9.0,該程序是一個 ruby 程序,它是在 Apache 下執行的 Phusion Passenger Ruby-on-Rails 應用程序的一部分。
我目前完全不知所措。有誰知道發生了什麼?
*更新:*根據手冊頁,結果表明
security.bsd.conservative_signals
sysctl 設置為 1,這會阻止許多信號傳遞到 setuid 程序。將其設置為 0 即可解決問題。雖然在程序鏈的某處有一個 setuid 呼叫——該程序是 Apache httpd 的子程序,並且 Apache 更改其 uid 以放棄 root 權限——但該程序本身不是 setuid,它的 EUID、RUID 和 SVUID 都是與發送信號的使用者相同。我能找到的唯一表明發生任何 setuid 的過程的檢查是“
P_SUGID
標誌ps
”欄位中的標誌。(“自上次執行以來已設置 id 特權”)似乎不應該是這種情況,但它是在 Apache 模組中處理的,我不知道它的確切方法。作為記錄,這是一個 ruby 程序,它作為 Ruby on Rails 應用程序的一部分,由 mod_passenger,AKA mod_rails 處理。
要讓程序有權向 pid 指定的程序發送信號,使用者必須是超級使用者,或者接收程序的真實或保存的使用者 ID 必須與發送程序的真實或有效使用者 ID 匹配。一個例外是信號 SIGCONT,它可能總是被發送到與發送者俱有相同會話 ID 的任何程序。另外,如果 security.bsd.conservative_signals sysctl 設置為 1,使用者不是超級使用者,並且接收者是 set-uid,那麼只能發送作業控制和終端控制信號(特別是,只有 SIGKILL , SIGINT, SIGTERM, SIGALRM, SIGSTOP, SIGTTIN, SIGTTOU, SIGTSTP, SIGHUP, SIGUSR1, SIGUSR2)。
你在什麼意義上擁有這個過程?與真實 uid、有效 uid、正在執行的二進製文件、該二進製文件的所有者和 setid 位等相關的程序的狀態究竟是什麼?