Permissions

kill -s TERM 有效,kill -s ABRT 得到“不允許操作”

  • December 27, 2012

有一個我擁有的過程,我可以將其文件聲明發送SIGABRT到以獲取一些調試資訊。但是,當我嘗試發送時SIGABRT,我得到“不允許操作”。

我還嘗試向我擁有的其他程序發送相同的信號,以確保沒有一些底層塊阻止我SIGABRT完全發送,但它們以適當的方式響應。這只是一個程序,但它是該程序的每個實例。該程序的系統呼叫跟踪表明它從未收到信號。

我已經嘗試/bin/kill顯式執行以排除我的 shell 內置的任何奇怪之處kill,並且,除了一些小的輸出差異之外,行為沒有任何變化。

root 可以發送SIGABRT到該程序,它可以按我的預期工作。

我在這個遊戲中已經有一段時間了,但我從未見過使用者無法向他擁有的程序發送信號的情況,也沒有見過使用者可以發送信號但不是另一個。

作業系統是 FreeBSD 9.0,該程序是一個 ruby​​ 程序,它是在 Apache 下執行的 Phusion Passenger Ruby-on-Rails 應用程序的一部分。

我目前完全不知所措。有誰知道發生了什麼?

*更新:*根據手冊頁,結果表明security.bsd.conservative_signalssysctl 設置為 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 處理。

來自最新版本的 kill(2) 聯機幫助頁

要讓程序有權向 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 位等相關的程序的狀態究竟是什麼?

引用自:https://unix.stackexchange.com/questions/59583