Linuxでプロセスを殺さないようにする


14

私はパスワードマネージャーアプリケーションに取り組んでおり、セキュリティ上の理由から、殺せないプロセスを立ち上げたいと思っています。

さらに、標準入力から読み取り、書き込む必要があるため、このプログラムをデーモンにしたくないのです。

これを行う方法はありますか?


11
「セキュリティ上の理由から、私は殺せないプロセスを立ち上げたい。」ちょっとした注意-これが許可されていれば、人々は悪名高い理由で簡単にそれを悪用する可能性があります-例えば、止められないフォーク爆弾を発射します。
VLAZ

32
これはXY問題のように聞こえます。あなたが本当に達成しようとしていることは何でも、殺せないプロセスはそれをする方法ではないと思う。「セキュリティ上の理由から」は非常にあいまいです。ユーザーが何をしないようにしたいのですか?彼らはどのようなアクセス権を持っていますか?
ネイト・エルドリッジ

4
すべての意図と目的に対して殺せないプロセスはすべてウイルスです。
ナフトゥリケイ

3
@NateEldredge:むしろ、プログラムにシグナルを無視させます。それがそれを行う典型的な方法です。そうしないと、端末をバイパスして、SIGINTまたはSIGTSTPをプロセスに直接送信できます。
ノアスプリアー

2
@NoahSpurrier:私はあなたがコンソール上で何かをタイプできるユーザーがいるが、そうでなければコンピューター上でコードを実行できない状況を想像しています(キオスクのように)。入力できるキーが予期しない効果をもたらさないように設定します。他のコードを実行できる場合、SIGINTとSIGTSTPとSIGQUITを無視しても役に立ちません。これらのシグナルをプロセスに直接送信できるユーザーは、無視できないSIGKILLまたはSIGSTOPを送信することもできます。
ネイト・エルドレッジ

回答:


41

別のユーザーとハンドルの下でパスワードマネージャの実行を行います/無視/ブロックターミナル-生成された信号(SIGINTSIGQUITSIGHUPSIGTSTPSIGTTIN、およびSIGTTOU)。

実効IDが0(ルート)でない限り、別のユーザー(実際のuidとsaved-set uidの両方が実効uidと異なるユーザー)で実行される(= kill)プロセスにシグナルを送信することはできません。

すべてのプロセスはルートによって強制終了されます。

詳細については、kill(2)を参照してください。


15

プロセスを強制終了できないようにする唯一の方法は、プロセスをカーネルスレッドとして実装することです。これは簡単なことではありません。

あなたはまだそれを殺すことができますが、それはOSのシャットダウンの付随的な損害になるでしょう。

SIGNAL_UNKILLABLEプロセスにフラグを設定するカスタムカーネルモジュールを開発することもできます。このフラグは、無条件のキルに対して保護されている唯一のユーザーランドプロセスであるinit(またはsystemdカーネル起動の初期プロセス)にのみ設定されるように設計されていますが、そのフラグが通常のプロセスに存在することを禁止するものはありません。


1
初期化プロセスである可能性があります
-muhmuhten

@muhmuhtenそうですね、initはユーザーランドプロセスであり、無条件のキルから保護されています。ただし、カーネルモジュールとスレッド用のAPIは確実に存在しますが、カスタマイズするようには設計されていません。
jlliagre

私自身の答えを詳しく説明するために、ルートアカウントにアクセスできないことを前提としています(これは、偶然にも、これがおもちゃの例、コースプロジェクト、マルウェアのいずれかであることを示唆しています)。その目的のためにカーネルモジュールを配線できるという考えを排除します。また、SIGNAL_UNKILLABLEフラグは通常のプロセスでは使用できず、重要な通常の操作(vforkingなど)を排除するため、通常は実用的ではないエッジケースと見なします。
GregD

@jlliagreは確かにそうではありません。
-muhmuhten

@dudek殺すことができないプロセスは、すでに通常は非現実的なエッジケースです。
jlliagre

11

技術的には、プロセスを殺すことはできません。

もちろん、非rootユーザーの場合は、同じユーザーIDを持つプロセスのみを強制終了できます。そのため、異なるアカウントを作成できる場合は、プロセスに「一意の」ユーザーIDを使用して、rootのみが強制終了できます。

シンプルだが堅牢ではない解決策は、プロセスにできるだけ多くの信号をキャッチさせることです(おそらくそれらを無視します)。これは、KILLシグナル(シグナル9)をキャッチする方法がないため、おもちゃの例または非敵対的な環境にのみ適していますが、それ以外の場合は殺されないようにすることができます。

最後に、プロセスが強制終了された場合に再生成するように手配できます。これも壊れやすい(非常に壊れやすい)ですが、消去するのが少し難しくなります。これは、独自の監視プロセスを使用するか、inittabを使用して実行できます。彼らが何をしているかを知っている敵にとって、これは一度に複数のプロセスを殺すことによって簡単に回避することができます。


1
しかし、(以外inittab)モニタープロセスも強制終了される可能性があります。
ロアイマ

いいえ、デバイスドライバー(カーネルモジュール)は、ルートで強制終了できないプロセスを作成できます。
ノアSpurrier
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.