web-dev-qa-db-ja.com

実行前のコマンドバイナリの検証

Bashスクリプトから実際に実行しているものを確認する方法はありますか?

Bashスクリプトがいくつかのコマンド(例:tarmailscpmysqldump)を呼び出していて、tarは実際の実際のtarであり、これはrootユーザーがファイルおよび親ディレクトリの所有者であり、書き込み権限を持つ唯一のユーザーであり、一部の/tmp/surprise/tarではありませんwww-dataまたはApache2がオーナーです。

確かにPATHと環境について知っていますが、これが実行中のbashスクリプトから追加でチェックできるかどうか知りたいです。

例:(疑似コード)

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

実行するバイナリを検証する代わりに、最初から適切なバイナリを実行できます。例えば。 /tmp/surprise/tarを実行しないようにする場合は、スクリプトで/usr/bin/tarを実行します。または、何かを実行する前に$PATHを適切な値に設定します。

/usr/bin/およびその他のシステムディレクトリ内のファイルを信頼しない場合、信頼を取り戻す方法はありません。あなたの例では、lsで所有者を確認していますが、lsを信頼できることをどのようにして確認しますか?同じ議論がmd5sumstraceなどの他のソリューションにも当てはまります。

システムの整合性に対する高い信頼性が必要な場合は、 [〜#〜] ima [〜#〜] などの特殊なソリューションが使用されます。しかし、これはスクリプトから使用できるものではありません。システム全体を、不変ファイルの概念を備えた特別な方法でセットアップする必要があります。

24

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

代わりに、 侵入への対処方法 について読む必要があります。

侵入を完全に回避することに集中するほうがよい。

これらの種類のことが重要なシステムがある場合は、パブリックにする必要がある部分とプライベートにする必要がある部分を分離し、通信モードの監査を実行することをお勧めします。これらの間。

6
Kusalananda

ファイルのmd5sumを確認することで、ある程度は可能です。したがって、aptパッケージ管理を使用するシステム-私の特定のケースでは、Ubuntu 16.04-中にファイル/var/lib/dpkg/info/tar.md5sumsがあります。これは、tarからのすべてのファイルのmd5合計を格納しますインストール。したがって、md5sum /bin/tarの出力がそのファイルの内容と一致するかどうかを確認する簡単なifステートメントを作成できます。

もちろん、ファイル自体が改ざんされていないことを前提としています。もちろん、これは攻撃者が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のような呼び出しを誤って含めることを忘れないようになります。

3
Zumo de Vidrio

はい、メソッドがあります:組み込みtype。 PATHでのみ検索するwhichコマンドとは対照的に、typeは、コマンド名が実際に予約済みキーワード、組み込み、エイリアス、関数、またはディスクファイルであるかどうかを通知します。

$ type -t foobar || echo "Not found"
Not found

$ type -t echo
builtin

$ enable -n echo; type -t echo; type -p echo
file
/usr/bin/echo

$ echo() { printf "(echoing) %s\n" "$*"; }; type -t echo
function

$ alias echo="/bin/echo 'I say: ' "; type -t echo
alias

さらに、type -aは、コマンドのすべての候補(最初の選択肢から最後の選択肢まで)を提供します。

$ type -a echo
echo is aliased to `/bin/echo 'I say: ' '
echo is a function
echo () 
{ 
    printf "(echoing) %s\n" "$*"
}
echo is a Shell builtin
echo is /usr/local/bin/echo
echo is /bin/echo

最後に、ディスク上のバイナリのみが気になる場合は、type -Paを使用して、PATH内のすべてのバイナリを取得できます(上記と同じ順序)。

$ type -Pa tar
/home/me/bin/tar                <= oh oh, is this normal?
/bin/tar

つまり、typeだけでは、最終的にどのコマンドが呼び出されるかは正確にはわかりません。たとえば、tarがバイナリを呼び出すエイリアス(例:alias tar="/tmp/tar")の場合、typeはこれがaliasであることを通知します。

3
xhienne

Linux osはファイルに基づいており、linuxで実行される多くのコマンドは、マシン上にあるファイルのいくつかの変更を解決する可能性があります。そのため たぶん が問題の最善の解決策です。コマンドが実行される前に、ファイルシステムの変更についてコマンドをテストできます。

enter image description here

コマンドを部分的に逆コンパイルする「strace」コマンドがあります...

enter image description here

深く掘り下げたい場合は、実行するスクリプトの逆コンパイラをチェックアウトします。つまり、そのコマンドのアセンブラ解釈を確認する必要があります。 bashの場合はobjdump -d。 Linux binスクリプトは主にCプログラミング言語で作成されるため、優れたCデコンパイラーを使用してください。

0
user92622