web-dev-qa-db-ja.com

攻撃者がmkdirを使用してシステムを危険にさらす方法はありますか?

システムで問題のあるユーザーricardoの制限付きユーザーアカウントを設定しています。私はSudoを使用してディレクトリを作成する権利を彼に与えたいと思っています。私の/etc/sudoersファイルでこのルールを検討しています:

ricardo   ALL=(root) NOPASSWD: /bin/mkdir

このルールのみを使用して、リカルドが意図的または誤ってシステムを危険にさらす可能性がある方法はありますか?

22

このような攻撃はうまくいくと思います。"something"は、rootfsがマウントされた後にロードしようとするカーネルモジュールです。

$ Sudo mkdir -m 777 /lib/modules/`uname -r`/a
$ cp evil.ko /lib/modules/`uname -r`/a/«something».ko

モジュールで宣言されたエイリアスに応じて、他の名前を使用できることにも注意してください。 depmodが実行されるまで読み込まれないと思います。これは、次にカーネルが更新されるときに発生します。そのため、mkdirはSudoログに最近表示されません。

/ etcには、ディレクトリ内のすべてのファイルを(場合によっては再帰的に)読み取ることがたくさんあります。さらに悪いことに、これらのディレクトリの一部はデフォルトでは存在せず、それらを知る唯一の方法は、それらを使用するプログラムのマンページ、initスクリプトなどを読むことです。さらに悪いことには、後方互換性の目的で廃止されているものもあり、ドキュメント化されていないこともあります。

編集:いくつかのディレクトリについて考えましたが、これらは/usr/localにあります:

  • /usr/local/lib/Perl/5.14.2(Perlのバージョンによって異なります。調べるにはPerl -Vを試してください)。そこにFileサブディレクトリを作成し、その中にFind.pmを置きます。これで、誰かがFile::Findを使用するたびに、攻撃者のバージョンが使用されるようになります。同様に、Getopt::Longでも同じことを行います。システムユーティリティはしばしばPerlで書かれているので、これはおそらく根を与える。 (ack-grep --color -a 'use.+::' /usr/sbin | less -Rをお試しください)
  • PythonやRubyなどにも同様のディレクトリがあると思います。システムユーティリティはPythonでも書かれています。
  • 誰かが/usr/local/includeのサブディレクトリを使用してコンパイルした多くのことを覆します。
21
derobert

ルートとしてmkdirを実行することにより、ユーザーは以前に同じ名前(または間違った権限)でディレクトリを作成することにより、他のプロセス/ユーザーが新しいファイルやディレクトリを作成するのをブロックできます。

これは、特にlog-および lock- filesのセキュリティに関連する可能性があります。

jordanm に記載されているように、システム全体をブロックする可能性がある inodes の最大数を使い切ることもできます。

ユーザーを特定のグループに追加する(または ACLs を使用する)ことにより、Sudoを介して権限を付与せずに問題を解決できるはずです。

20
jofel

彼をchroot刑務所にリダイレクトする必要があります。または、小さなVMにとっては、1時間に1回クラッシュする可能性があります。あなたがする必要があるのは新しいコピーを提供することだけです。

11
ott--

書き込みアクセスでディレクトリを作成できるため、可能性があります。 _mkdir -m 777 blah_を使用すると、ricardoユーザーは新しいディレクトリに好きなように書き込むことができます。別のユーザーとして既に実行されているシステム上で、構成、スクリプト、またはモジュールをロードするためにディレクトリツリーを再帰するプロセスが必要になります。次に、ユーザーは自分でロードまたは実行するものを追加できます。私が最初に考えることができるのは、phpまたはcgiを実行できるWebサーバーを実行している場合です。その後、そのユーザーとしてスクリプトを実行できます。私は、より現実的な例、特にrootの例を思いつくのに苦労していますが、それは間違いないでしょう。

sshは、この種のシナリオをトラップするデーモンの例です。ディレクトリを持たないユーザー用に_.ssh_ディレクトリを作成し、独自の_authorized_hosts_ファイルを配置した場合。 sshdは、ディレクトリの権限が開きすぎていることを通知し、公開鍵を無視します。

多くのプログラムがうまく処理しないファイル(一時的なtmpやswapファイルなど)が現れることが予想されるディレクトリを作成することに迷惑をかける可能性があります。

たくさんのcgroupを作成することはできますが、それらを使って何もしているようには見えません。あなたは、システムを少なくともひざまずくことができるかもしれません。 OOM killer がsshdを取り出すのに256Mのボックスで約10000のcgroupが必要でした。

mkdirの_-m_オプションとSudo環境のUMASKを制御する場合、私はそれが単に迷惑であることに戻っていると思います。

6
Matt