まず、現在のLinuxデスクトップディストリビューション(Debian、Fedoraなど)によってセットアップされた構成を想定していることを述べておきます。実装した場合、ここで説明する問題を軽減する方法があると確信しています。私が興味を持っているのは、「すぐに使える」セキュリティです。
シェルが~/.profile
や~/.bashrc
のようなファイルを実行するという事実は、ユーザーの実行環境の完全な操作を可能にし、ユーザーが所有するため、Sudo
は安全に実行できます。問題は、ユーザーとして実行されている悪意のあるプログラムがこれらのファイルを編集して、たとえばPATH
環境変数を変更して、PATH="$HOME/.evil:$PATH"
などの偽のSudo
実行可能ファイルを含めることができることです。悪意のあるプログラムも$HOME/.evil/Sudo
ファイルを作成しました。次に、ユーザーが次にシェルでSudo
と入力すると、代わりに偽のSudo
が実行され、入力したパスワードを記録できます。したがって、偽のSudo
は、元の悪意のあるプログラムがユーザー特権しか持っていなくても、root
特権を取得できます。
実際、Ubuntuのインストールによって作成されたデフォルトの.profile
ファイルには、次の行が含まれています。
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
そのため、.profile
を変更する必要さえありません。$HOME/bin/Sudo
を作成するだけで、PATH
が最初になります。
私の要点は、任意の悪意のあるコードが実行された時点ではすでに「遅すぎる」ことではなく、この攻撃はユーザーに気付かれる可能性があるということではありません(フィッシング攻撃に似ていると思います)。ユーザーとして実行されている悪意のあるプログラムは、ユーザーができることなら何でもできると思います。しかし、私が期待できないのは、そのユーザーよりもmoreができることです(root
特権)。
私の質問は、本質的には:
Sudo
実行可能ファイルがこの方法で回避できるというのは本当ですか?Sudo
を呼び出すデフォルトの方法は、それが実際にシステムによって提供される実行可能ファイルであることを確認してはなりません(毎回/usr/bin/Sudo
を入力する予定はありません)。 Sudo
はシステムクリティカルなセキュリティ操作を実行するので、PATH
変数を使用してその場所をシャドウする可能性は、大きな利益をもたらすことなく多くのリスクをもたらすようです。このような環境では、Sudo
の使用は基本的に安全ではないようです。root
としてのログインを有効にし、別のTTYにログインすることをお勧めします。侵害されたアカウントで実行できることはすべて、攻撃者も実行できます。
基本的に、これはLinuxプロバイダーがユーザー間で分離しているためです同じユーザーとして実行している個々のプロセス間ではありません。特定のユーザーとして実行されているプロセスは、そのユーザーの下で実行されている他のプロセスと同等の機能を持つと見なされます。
システムのSudo実行可能ファイルをこの方法で回避できるのは本当ですか?
はい、他の方法でも同様です。侵害された非特権アカウントでrootに特権を昇格すると、rootが侵害されます。 su
を使用してrootから特権を非特権アカウントに落とすと、 ルートも侵害 !信頼されていないアカウントの特権を安全に昇格することはできません。 PATH
を使用してシステムを悪用することは可能ですが、bashプロセス自体をハイジャックしてキー入力を盗聴することも可能です。インタープリター(bash、python、Perlなど)は引き続き実行されるため、noexec
を使用して実行を無効にすることはさらに役に立ちません。 noexec
オプションは、定期的に販売されているにもかかわらず、セキュリティ機能として設計されたことはありません。
攻撃者がSudo
またはsu
をハイジャックする方法の不完全なリスト:
親プロセスでの_LD_PRELOAD
_変数の使用(例:bash
)。
親プロセスをptrace()
またはprocess_vm_writev()
でフックします。
X11プロトコルを使用して、端末エミュレータにキーストロークをスニッフィングまたは挿入します。
実際のSudo
実行可能ファイルをラップするエイリアスまたは関数を作成します。
私はこれらについて 別の質問に対する私の回答 で詳しく説明しました。
デフォルトで、デスクトップLinuxシステムがデフォルトで、このように簡単に利用できる方法でセットアップされているのはなぜですか?
信頼されていないアカウントの特権の昇格は、想定されていることではありません。言うまでもなく、デスクトップLinuxは、一般的な* nixアーキテクチャのグランドスキームにおける後付けです。これは、Linux自体のセキュリティアーキテクチャの障害ではなく、同じ悪いアドバイスを絶え間なく繰り返すセキュリティシアターの障害です。多くの新規ユーザーが代わりにすべてをrootとして実行するため、rootとしてSudo
を使用することを繰り返し言われます。この場合、Sudo
を使用することをお勧めします。ユーザーがすでにすべてにrootを使用しないほど賢い場合、それは有害です。
Sudo
は高度に構成可能であり、特定のコマンドのみを許可するように設計できることに注意してください。これは本当に素晴らしいところです。 Sudo
を設定して、_apt-get update
_をrootとして(パスワードの有無にかかわらず)実行することのみを許可し、その他すべてを拒否することができます。これにより、攻撃者はソフトウェアの更新以外の操作を制限できます。
ルートとして特定のコマンドの実行のみを許可するように構成した場合でも、信頼されていないユーザーを介してルートとして実行するように設計されていないプログラムをホワイトリストに登録すると、足を踏みにじることができることに注意してください。私はこの方法でVeraCryptを実行しようとしている誰かの実際の例を見ました それが安全でない理由を説明した 。 VeraCryptはrootとして安全に実行できるという考えでした。そのため、Sudo
を使用して、信頼されていない特権のないユーザーとしてrootに昇格しても安全です。アイデアには欠陥があり、些細な特権の昇格が可能であることがわかりました!
Sudoを起動するデフォルトの方法は、それが実際にシステムによって提供される実行可能ファイルであることを確認するべきではありませんか(毎回/ usr/bin/Sudoと入力する予定はありません)?
完全なパスを入力しても保護されません!先頭の_/
_を含む関数を簡単に作成でき、実際の実行可能ファイルをオーバーライドします。実行可能ファイルが本物であることを確認し、スニッフィングを無効にしようとした場合でも、悪意のあるプロセスがbash
プロセスをハイジャックし、Sudo
とは無関係にキーストロークをスニッフィングし、そのポイントから検出することができなくなります。ビューの。
$ function/usr/bin/Sudo {echo 'hijacked!'; } $/usr/bin/Sudo id hijacked!
このような環境では、Sudoの使用は基本的に安全ではないようです。rootとしてログインを有効にし、別のTTYにログインすることをお勧めします。
これは常にの場合です。別のTTYにログインしても、完全に安全ではないことに注意してください。セキュアアテンションキーの組み合わせである [〜#〜] sak [〜#〜] を使用して、本物のログインセッション(agetty
またはlogind
など)。 SAKは、カーネルがリッスンする(したがって、ユーザー空間で抑制できない)キーの組み合わせです。検出すると、現在のTTY内のすべてのプロセスが強制終了され、ログインプロンプトが表示されます。正規の妥協のないTTYに切り替えた場合は、プロンプトが消えて再表示されるだけです。ハイジャックされたTTYを使用している場合、悪意のあるプロセスが強制終了され、正規のログインプロンプトが表示されます。
まず、_.profile
_を変更しても、特権の昇格は自動的には行われません。影響を受けるユーザーは、すでにSudo
権限を持っている必要があります。
1-Sudo
は回避されていません。あなたはそれの代わりに何か他のものを走らせています。 _.profile
_を変更して_alias Sudo=~/.evilsudo
_を追加し、同じことを実現できます。
2-Sudo
を構成する遅延方法について考えます。デスクトップ環境ではそうなりますが、サーバー環境ではそうではありません。サーバー環境では、_/etc/sudoers
_は、ユーザーにタスクを実行するために実行する必要があるコマンドのみを許可する必要があります。 Oracle管理者は_Sudo service Oracle
_を実行することを期待しているため、sudoersで実行されます。たとえば、oradmin ALL=(ALL:ALL) ALL
ではありません。
そして、誰かがあなたのアカウントでコードを実行するのはすでに遅すぎます。 .profileを変更すると、別のシェルが起動してすべてのキー入力をキャプチャし、パスワードだけでなく、入力した他のすべてを失う可能性があります。リモートsshパスワード、データベースパスワード、ftpパスワードなど。 .profileが侵害された場合、それはゲームオーバーです。
これからユーザーを本当に保護したい場合は、ユーザーが書き込み可能なすべてのディレクトリをnoexec
としてマウントします。このようにして、_~/bin
_または_/tmp
_などは、何かを実行する権限を持ちません。セキュリティをわずかに高め、利便性を大幅に低下させます。