SIGABRT
デバッグ情報を取得するために文書を送信できるプロセスがあります。しかし、送信しようとすると、SIGABRT
「操作は許可されていません」というメッセージが表示されます。
また、私が所有している他のプロセスに同じシグナルを送信し、シグナルを完全に送信するのを妨げる基本ブロックがないことを確認しましたが、SIGABRT
適切な方法で応答することを確認しました.それはただ一つのプログラムですが、そのプログラムのすべてのインスタンスです。プロセスのシステムコールトレースは、信号を受信しないことを示しています。
/bin/kill
シェル組み込みの奇妙な点を排除するために明示的に実行してみましたが、わずかなkill
出力差を除いて、動作に変化はありませんでした。
SIGABRT
ルートはプロセスに転送でき、期待どおりに機能します。
私はしばらくこのゲームをプレイしてきましたが、ユーザーが自分の所有するプロセスに信号を送信できない場合、またはユーザーが1つの信号しか送信できず、他の信号は送信できない場合を見たことがありません。
オペレーティングシステムはFreeBSD 9.0で、プロセスはApacheで実行されているPhusion Passenger Ruby-on-Railsアプリケーションの一部であるRubyプロセスです。
私は今完全に迷っています。何が起こっているのか知っている人はいますか?
修正する:マニュアルページによると、security.bsd.conservative_signals
sysctlが1に設定され、多くのシグナルがsetuidプロセスに渡されるのを防ぐことがわかりました。 0に設定すると問題が解決します。
プロセスチェーンのどこかにsetuid呼び出しがありますが、プロセスはApache httpdの子プロセスであり、Apacheはroot権限を放棄するためにuidを変更します。プロセス自体はsetuidではなく、対応するEUID、RUID、およびSVUIDはユーザーと同じです。シグナルの送信者。 setuidが発生したことを示す唯一のプロセスチェックは、P_SUGID
「フラグ」フィールドのフラグです。ps
(「最後の実行以降にID権限が設定されています。」)それはできないようですが、Apacheモジュールで処理され、正確な方法がわかりません。
明確に言うと、mod_passenger(mod_railsとも呼ばれます)によって処理されるRuby on Railsアプリケーションの一部として実行されるRubyプロセスです。
ベストアンサー1
プロセスがpidで指定されたプロセスにシグナルを送信する権限を持つには、ユーザーがスーパーユーザーであるか、受信プロセスの実際のユーザーIDまたは保存されたユーザーIDが、転送プロセスの実際のユーザーIDまたは有効ユーザーIDと一致する必要があります。 1 つの例外はシグナル SIGCONT です。このシグナルは、常に送信者と同じセッションIDを持つすべてのプロセスに送信できます。また、security.bsd.conservative_signals sysctlが1に設定されている場合、ユーザーはスーパーユーザーではなく、受信者はset-uidです。、これはジョブ制御および端末制御信号のみを送信できます(特にSIGKILL、SIGINT、SIGTERM、SIGALRM、SIGSTOP、SIGTTIN、SIGTTOU、SIGTSTP、SIGHUP、SIGUSR1、SIGUSR2のみを送信できます)。
どのような意味でプロセスを所有していますか?実際のuid、有効なuid、実行中のバイナリ、そのバイナリの所有者、setidビットなどに関連するプロセス状態は正確に何ですか?