コンソールアプリケーションが実際にシャットダウンされたことを確認する

コンソールアプリケーションが実際にシャットダウンされたことを確認する

コンソールアプリケーションを起動して完了すると、シェルプロンプトが再表示されます。しかし、実際のコマンドプロンプトであるかどうかを確認できますか?たとえば、アプリが「キーロガー」で終了しようとしたときに間違ったプロンプトが表示された場合はどうなりますか?

それでは、私が誰であるかどうかをどうやって知ることができますか?実際に純粋なシェル(例:bash)プロンプトで?

答え1

技術的にはあなたの質問に答えます。シェルに戻ったことを確認するには?そのプログラムが悪意のないと判断された場合ただし、別のシェルを実行していると思われる場合は、シークレットコンテンツを含むシークレット関数を手動で定義できます(もちろんエクスポートしません)。

$ my_secret_func() { echo "Still alive"; }
$ ~/Downloaded/dubious_program
$ my_secret_func
Still alive

悪意のある場合は、dubious_program入力内容を元のシェルに渡して応答することで簡単にだまされます。より一般的には、安全でない実行可能ファイルがユーザーに代わってキーロガーをインストールする(そして他の多くの悪意のある操作を実行する)方法(例えば、ユーザーのID内に自己インストール)がたくさんあります~/.bashrc。明確な影響がなくてもこれを行うことができます。実際、ほとんどのマルウェアは、検出のリスクを最小限に抑えるためにすぐに目に見える影響を与えないようにします。

したがって、実行中のジョブが安全であるかどうかわからない場合は、nobodyユーザーと一緒にサンドボックスで実行したり、まったく実行したりしないでください。

答え2

シェルが返されたかどうかを確認する方法

コマンドを実行する前後にシェルのPIDを比較します(同じPIDは同じシェルを意味します)。

$ echo $$
6215
$ bash --posix
bash-4.3$ echo $$
10230
bash-4.3$ exit
$ echo $$
6215

上記のデモでは、アプリケーション(この場合はbash別のPOSIXモードアプリケーション)を実行していることがわかります。返されたら、私たちが使用したシェルのPIDが同じであることを確認するので、これが実際のシェルであると仮定できます。もちろん、これは$$シェルプロンプトに以下を追加することで自動化できます。

$ PS1="[$$] $PS1 "
[6215] $

テーマの変更は、sha256sum前と後(または他のチェックサムなど)を確認することによって実行できます。md5わからない場合、Sha-sumは通常、ファイル、特にダウンロードとiso画像の整合性を確認するために使用されます。以下のデモでは、/proc/<SHELL PID>/exe実際のバイナリへのシンボリックリンクであるファイルを使用します(この場合は私のシェルになりますmksh)。このようにして、実行中の実行可能ファイルが同じであることを確認できます。

[12107][xieerqi][21:34]:
$ sha256sum /proc/$$/exe
70a16895186ddfac12343e816f05783cf60092c0980fc20c2ae4bc53b48f28e6  /proc/12107/exe

[12107][xieerqi][21:34]:
$ bash --posix
bash-4.3$ sha256sum /proc/$$/exe
c2615a71ff5c004e51aef248103a2950c25715f5eb8130837695770e1d78ecfa  /proc/12434/exe
bash-4.3$ exit

[12107][xieerqi][21:35]:
$ sha256sum /proc/$$/exe
70a16895186ddfac12343e816f05783cf60092c0980fc20c2ae4bc53b48f28e6  /proc/12107/exe

シェルに戻ることは安全を保証しません。

キーロガーの場合、必ずしもシェルの中にある必要はありません。。グラフィックターミナルエミュレータを使用すると、キーロガーは使用しているシェルに関係なく、すべてのウィンドウに送信されたキーストロークを簡単に受信できます。

シェル自体に関する限り、プロセスはバックグラウンドで開始できます。たとえば、シェルスクリプトは以下のように&記号を使用しますcommand &バックグラウンドで何かを始める。バックグラウンドプロセスがまだキーを読み取ることができるかどうかはわかりませんが、シェルが終了してもアプリケーションが終了したことを保証するわけではありません。以下の小さなデモでは、バックグラウンドで始まる関数と終了しているように見えるスクリプトを見ることができますが、関数はまだ毎秒out.txtに書き込みます。

[10754][xieerqi][21:12]:
$ cat launch_background_app.sh

#!/bin/bash

run_in_background()
{
    while true;
    do
       date +%s > out.txt
       sleep 1
    done
}

run_in_background &

[10754][xieerqi][21:12]:
$ ./launch_background_app.sh

[10754][xieerqi][21:12]:
$ cat out.txt
1484280777

[10754][xieerqi][21:12]:
$ cat out.txt
1484280778

[10754][xieerqi][21:12]:
$ cat out.txt
1484280779

編集者の注意:私の例からヒントを削除しないでください。これは、シェルPIDが同じままであることを示すデモ用です。

添付:セキュリティは信頼できるアプリケーションのインストールから始まるため、アプリケーションの整合性を確保することを検討してください。今後まず使用してください。

答え3

キーロガーはシェルプロンプトを偽造しようとせず、ほとんど確実に監視バックグラウンドプロセスまたは同様のプロセスを残します/dev/input(また、プロセスリストから自分自身を隠そうとします)。あなたは間違いなく問題を間違った方向に見ています。

信頼できないバイナリを実行する一般的な方法は、仮想マシンを設定してその中で実行することです。これは100%のセキュリティを提供しませんが、通常は実際に使用するのに十分安全であると見なされます(もちろん、本番サーバーまたは銀行の保護されたネットワーク仮想マシン内で信頼できないコードを持つサーバーを実行しないでください)。

答え4

 suspect-command; echo I am thinking of the number 43987

echoはコマンド終了後に実行されます。コマンドプロンプトの上の行に結果が表示されます。

関連情報