信号受信時のデフォルトの動作...これらの安心できる言葉はどういう意味ですか?確かに、あなたが期待したものではありません。 wikiによると、デフォルトの28個のシグナルハンドラー(他にもあります!)は次のとおりです。2は無視され、4はプロセスを停止し、1は続行し、11は終了し、10はメモリダンプで終了します。今それは面白いです!したがって、状況は次のようになります。プログラムがソースコードで信号について言及していなくても、実際には信号を非常に劇的な方法で使用します。
これからは、もっと深く掘り下げる必要があります。誰が誰に信号を送ることができますか? wikiには、「有効なUIDが0(スーパーユーザーUID)以外のプロセス(またはシェルユーザー)は、同じUIDを持つプロセスにのみ信号を送信できます」と書かれています。したがって、100個のプログラムを実行すると、すべてのプログラム(キラーを除く)がソースコードでシグナルに言及していなくても、システムAPIを使用してこれらの100個のプログラムすべてを簡単に強制終了できます。ルートアカウントで作業している場合は、特定のプロセスを誰が開始したかはまったく関係ありませんが、簡単に終了できます。もちろん、特定のプロセスのpidを見つけてその「契約殺人」を実行することは可能ですが、単純にブルートフォースのpidである可能性のあるすべての人を殺すのはさらに簡単です。
「待って、待って、馬を運転しないでください。信号は処理して無視できるとおっしゃいました!」 -読者の声が聞こえます。ヴィッキーは何と言いますか?「SIGKILLとSIGSTOPを除くすべての信号を交互に処理するために、プロセスは独自のハンドラーを割り当てるか、信号マスクを変更することでそれらの発生を無視できます。」これらの信号を受信したときのデフォルトのアクションを見て、「プロセスの完了」、「プロセスの停止」を確認します。被害者にSIGKILLおよびSIGSTOP信号を送信することが原則として可能である場合はいつでも、これら2つのアクションを実行できることがわかりました。「唯一の例外は、pid 1(init)を使用するプロセスです。これは、KILLやSTOPなどの信号を無視または処理できます。」最も重要なシステムプロセスの1つをルートとして強制終了することさえできないかもしれませんが、友好的な方法で、これには追加の調査が必要です。
さて、絵はもう少しポジティブになりました、しかしそれはまだ暗いです。プロセスを開始すると、他の多くのプロセスを終了および停止できることが保証されます。 「受信プロセスの開発者が他の多くの信号の1つを無視するか、何らかの方法で処理するのを忘れた」という非常に単純な条件が満たされた場合、マニアックアプリケーションは、プロセスをメモリダンプで終了させるか、停止後にプロセスを続行できます。受信アプリケーションの開発者がいくつかの信号にハンドラーを掛けている場合は、信号を送信することで、このアプリケーションの機能を妨害しようとすることができます。ハンドラーの非同期実行により、レースや未定義の動作が発生する可能性があるため、後者は別の議論のトピックです...
「抽象的な推論は非常にクールですが、詳細に近づきましょう」と要求の厳しい読者は私に言うでしょう。はい、問題ありません。 * nixユーザーは、bashのようなプログラムに精通しています。このプログラムは30年近く開発されており、さまざまな可能性があります。明確にするために彼女をいっぱいにして、彼女の記憶からおいしいものを手に入れましょう!
ワイドレッグからUbuntu16.04.2を家に持ち帰り、bash4.3.46のコピーを2つ実行します。そのうちの1つでは、シークレットデータを使用して架空のコマンドを実行します:export password = SECRET。パスワードも書き込まれるコマンド履歴ファイルについては、しばらく忘れましょう。同じウィンドウで、psコマンドを入力して、このプロセスのpid(たとえば、3580)を見つけます。
最初のウィンドウを閉じずに、2番目のウィンドウに移動しましょう。その中のpsコマンドは、このbashインスタンスの別のpid(たとえば、5378)を提供します。わかりやすくするために、最初のコマンドkill -SIGFPE 3580に信号を送信するのは、この2番目のbashからです。プロセス1に対して、このプロセス1で、誤った算術演算が発生しました。画面に次のウィンドウが表示されます。
メモリダンプの作成時に目的の異常が発生しました。つまり、bashがこの信号を処理または無視していないようです。私はダンプを探す場所グーグルで、私は詳細な回答を見つけました(1、2)。私のUbuntuでは、状況は次のようになります。SIGABRT以外の信号が原因で標準パッケージのアプリケーションがクラッシュした場合、ダンプはApportプログラムに転送されます。これは私たちの場合です!このプログラムは、診断情報を含むファイルをアセンブルし、上記のウィンドウを表示します。公式ウェブサイトは誇らしげに次のように述べています。「Apportは、コアダンプ、スタックトレース、ログファイルなどの潜在的に機密性の高いデータを収集します。パスワード、クレジットカード番号、シリアル番号、その他の個人的な資料を含めることができます。」まあ、まあ、このファイルはどこにあるのだろうか?はい、/ var / crack /_bin_bash.1000.crash。その内容をsomedirフォルダーにプルしましょう:apport-unpack /var/crash/_bin_bash.1000.crashsomedir。さまざまな面白くない小さなことに加えて、CoreDumpと呼ばれる切望されたメモリダンプがあります。
これが真実の瞬間です!このファイルでパスワード文字列を検索して、それに応じて何が興味深いかを見てみましょう。文字列CoreDumpコマンド| grep passwordは、忘れられたハッカーにパスワードがSECRETであることを思い出させます。素晴らしい!
私はお気に入りのテキストエディタgeditで同じことを行い、バッファに入力してからダンプから読み取りました。問題ない!その瞬間、ヴィッキーは警告を発して耳元でささやきました。「場合によっては(たとえば、スーパーユーザーに代わって実行されるプログラムの場合)、セキュリティ上の理由からメモリダンプが作成されません。」 Soooo、確認しましょう...ルートbashから信号を受信すると、2番目のルートbashがメモリダンプの作成でクラッシュしましたが、権限(-rw-r ----- rootの所有者)のため、以前のルートbashほど読みやすくありません。私のユーザーアカウントが所有しています。さて、架空のキラープログラムがスーパーユーザーのUIDから信号を送信することに成功した場合、そのようなダンプに触れる可能性があります。
細心の注意を払った読者は、「ごみの海で探していたデータを見つけるのは非常に簡単でした」と言うかもしれません。それは本当ですが、私は確信しています。あなたが捕まえたい魚の種類とそれが泳ぐ場所を知っているなら、ダンプネットワークでそれを見つけることはほとんど常に現実的であるはずです。たとえば、クラッシュしたプログラムのデバッグ情報を含むパッケージをダウンロードしたり、事後デバッグによってGDBに関心のある変数の内容を見つけたりする必要はありません。
これはすべてまったく無害に見えるかもしれませんが、実際にはそうではありません。私が説明したすべてのアクションは、より特権的なアクセスレベルは言うまでもなく、ユーザーモードで実行されているプログラムまたはスクリプトによって簡単に実行できます。要するに、悪意のある実行可能なものは、プログラムを左右に簡単にハッキングでき、多くの場合、メモリ全体を自由に読み取ることができます。これがシグナルとバグレポートです!他の* nixプラットフォームや他の受信者プログラムでも状況は似ていると確信していますが、もちろんチェックはしません。
異論が生じる可能性があります。マルウェアは、デバッグツールを使用して、アプリケーションから興味深いデータを取得するだけです。本当にそうです。では、なぜこの投稿なのか?私のポイントはこれです。アプリケーションからのデータの盗難を阻止しようとするときに最初に頭に浮かぶのは、デバッグツールの制限です。確かに、アンチウイルスツールはそもそもptrace()の使用をキャッチします-これは非常に疑わしいイベントです。信号はまったく別の問題です。あるプロセスが別のプロセスに標準信号を送信します-では、何ですか?一見、これは完全に正常なイベントです。しかし、すでに見てきたように、これはアプリケーションの異常な終了につながる可能性があり、あるフォルダーにコアダンプを作成し、そこからプルを試みることができます。
vk.comのログインページを開いて同じ致命的な信号でFirefoxをダンプしようとすると、クラッシュしましたが、ダンプハンドラーが呼び出されました。巧妙なミニダンプ形式のダンプは、〜/ .mozilla / firefox / Crash Reports / {保留中または送信済み}に保存され、さらに調査する必要があります。設定ウィンドウで、チェックマークの反対側にある[詳細]をクリックすると、次のことがわかります(以下のテキストはwww.mozilla.org/ru/privacy/firefox/#crash-reporterでハングアップしていました)。
« Mozilla Firefox. , Firefox, , URL- , . , , . crash-stats.mozilla.com. . .»URLに本当においしいものがあることはめったにありませんが、ダンプにパスワードまたはCookieが含まれているかどうかは良い質問です。
この神秘的で興味をそそるメモで、私は終わります。明示的に処理するのを忘れたというシグナルを受け取りました。
PS私はそのようなシグナルハンドラSIGUSR1で簡単なプログラムを書きました:画面に文字列「1」を出力し、無限のループに入ります。このプログラムにSIGUSR1シグナルを何度も送信すると、ハンドラーが何度も呼び出され、スタックオーバーフローが発生することを期待していました。残念ながら、ハンドラーは1回しか呼び出されませんでした。さて、SIGUSR2信号用の同様のハンドラーを作成し、これが被害者をダンプすることを期待して2つの異なる信号を送信しましょう...残念ながら、どちらも役に立ちませんでした。各ハンドラーは1回だけ呼び出されました。オーバーフロー、オーバーフローしましたが、オーバーフローしませんでした!
PS 2. Windowsの世界には、一種のシグナル、つまりWindowsに送信できるメッセージがあります。それらは楽しみと利益のためにも使用できる可能性が非常に高いです!
オリジナルは私のブログ05.05.17に公開されました。