実行前のコマンドバイナリの確認

実行前のコマンドバイナリの確認

Bashスクリプトが実際に実行されていることを確認する方法はありますか?

tarBashスクリプトが複数のコマンド(たとえば、、、、、、mailなどscp)を呼び出してこれが実際であることmysqldumpを確認したい場合は、ファイルと親ディレクトリの所有者であり、唯一のコマンドであるユーザーがこれを行うことができます。一部の所有者または所有者ではなく、識別できる書き込み権限を持つユーザー。tartarroot/tmp/surprise/tarwww-dataapache2

もちろん、PATH環境は理解してこれが大丈夫かどうか疑問です。また確認しました実行中のbashスクリプトでは、どうすれば正確になりますか?

例:(医師コード)

tarfile=$(which tar)
isroot=$(ls -l "$tarfile") | grep "root root"
#and so on...

答え1

どのバイナリを実行するかを確認する代わりに、最初から正しいバイナリを実行できます。たとえば、実行されていないことを確認するには、スクリプトで実行します/tmp/surprise/tar/usr/bin/tarまたは、$PATHジョブを実行する前に合理的な値に設定してください。

システムディレクトリおよび他のシステムディレクトリにあるファイルを信頼しないと、/usr/bin/信頼を回復できません。あなたの例では、所有者を確認するために使用していますが、lsそれを信頼できるかどうかはどうすればわかりますかlsmd5sumなどの他のソリューションにも同じ主張が適用されますstrace

システムの完全性について高いレベルの信頼が必要な場合は、特別なソリューションを使用できます。使用される。ただし、これはスクリプトで使用できるものではありません。システム全体は、不変ファイルの概念を使用して特別な方法で設定する必要があります。

答え2

侵入者がシステムにアクセスしてシステムを修正できた場合$PATH(どんな状況でも含めないでください/tmp)、実行可能ファイルの所有権について心配するには遅すぎます。

代わりに、次の内容をお読みください。侵入に対処する方法

侵略を完全に避けることに集中するのが最善です。

これらの重要なシステムがある場合は、公開する必要がある部分と非公開にする必要がある部分を分離し、それらの間の通信パターンを監査することをお勧めします。

答え3

これは文書を検証することによってある程度達成することができますmd5sum。したがって、パッケージ管理を使用するシステムapt(私の場合はUbuntu 16.04)には、/var/lib/dpkg/info/tar.md5sumsインストールプロセス中に作成されたすべてのファイルのmd5合計を格納するファイルがありますtar。したがって、単純なifステートメントを作成して、出力がファイルmd5sum /bin/tarの内容と一致することを確認できます。

もちろん、これはファイル自体が改ざんされていないと仮定します。もちろん、これは攻撃者がroot / sudoアクセス権を獲得した場合にのみ発生し、この時点ですべての賭けは中止されます。

答え4

を使用して、スクリプトが実行されているコマンドを確認できますstrace。たとえば、

strace -f -e execve ./script.sh

次のスクリプトを使用します。

#!/bin/bash
touch testfile.txt
echo "Hello" >> testfile.txt
cat testfile.txt
rm testfile.txt

strace-e execve引数とともに使用したときに実行されるコマンドの正確なパスを指定します。

execve("./script.sh", ["./script.sh"], [/* 69 vars */]) = 0 
Process 8524 attached
[pid  8524] execve("/usr/bin/touch", ["touch", "testfile.txt"], [/* 68 vars */]) = 0 
[pid  8524] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=8524, si_status=0, si_utime=0, si_stime=0} --- 
Process 8525 attached [pid > 8525] execve("/bin/cat", ["cat", "testfile.txt"], [/* 68 vars */]) = 0
Hello [pid  8525] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=8525, si_status=0, si_utime=0, si_stime=0} --- 
Process 8526 attached [pid > 8526] execve("/bin/rm", ["rm", "testfile.txt"], [/* 68 vars */]) = 0
[pid  8526] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=8526, si_status=0, si_utime=0, si_stime=0} ---
+++ exited with 0 +++

パラメータ(strace manから):

-f:現在追跡されているプロセスで、fork(2)、vfork(2)、およびclone(2)システムコールの結果として生成されたサブプロセスを追跡します。-p PID -fマルチスレッドの場合、thread_id = PIDのスレッドだけでなく、プロセスPIDを持つすべてのスレッドがリンクされます。

-e trace=file:ファイル名を引数として使用するすべてのシステムコールを追跡します。-e trace=open,stat,chmod,unlink,...プロセスが参照するファイルを確認するのに便利な略語と考えることができます。また、略語を使用すると、lstatなどの呼び出しをリストに含めることを誤って忘れることはありません。

関連情報