web-dev-qa-db-ja.com

ルートキットとは何ですか?

" Tripwire-Is It Security Theater "へのフォローアップとして、私はルートキットが何であるかについてより良いアイデアを得ることを目指しています。より明確にするために:

  • カーネルモジュールとは何ですか?
  • どのようにしてそれがロードされるかについてのフローは何ですか、そしてなぜ/どのようなメモリが価値があるのですか?
  • Linuxカーネルは、パッチを受け取るか、すでにルート権限を取得している誰かがルートキットをインストールできないようにする他の防御策を持っていますか(少なくともリモートユーザーがライブシステムで)。

意味:ルートランドへのリング0アクセスを必要とする入力/出力は、価値を生み出しますか?

明確でない場合、私はシステムをルート化したり、その方法についてのアドバイスを求めたりしていませんが、ルートキットに詳しい人がどのように、そしてなぜその性質を定義するのかに興味があります。

トピックをLinuxに限定することが役立つ場合は、それで十分です。

26
blunders

ルートキットは、ルートレベルの権限で何らかの方法でターゲットマシンにアクセスしたときにターゲットマシン上で実行するツールのセットです。ルートキットのポイントは、その一時的なアクセスを常に開いているドアに変換することです。ルートキットの例としては、sshdバイナリを変更したものがあります。そのため、「通常の」パスワードの種類に関係なく、「root」のパスワードとして常に「8gh347vb45」を受け入れます。ルートです。これにより、攻撃者は最初に使用したエクスプロイトのフープを再度経由する必要なく、後で戻ってくることができます。

ルートキットの最初のタスクは、それ自体を隠し、アップグレードに抵抗することです。ルートキットが単にsshdを変更するだけの場合(これは例です)、opensshパッケージの次のアップグレードでルートキットが削除されます。より耐性のあるルートキットはパッケージマネージャーも変更するため、opensshがアップグレードされると、新しいsshdが自動的に変更され、攻撃者用の追加のアクセスポイントが開いたままになります。

最も強力なルートキットは、ハードウェアを実際に管理するソフトウェアであるカーネルを変更します。すべてのプロセス(rootを含むすべてのユーザーの場合)がデータまたはハードウェアリソース(ファイルの読み取りや書き込みなど)にアクセスするときは、カーネルに適切に問い合わせてください。カーネルにインストールされたルートキットはファイルを非常に効果的に隠すことができ、カーネルのアップグレードのたびに再インストールできます。これは、そのようなアップグレードがカーネルコードを含むファイルの別のファイルへの置き換えになるためです。カーネル。

カーネルモジュールは、カーネルに動的にロードされるコードの一部です。 Linuxでは、1.3.xシリーズのある時点までは、ブートローダーによって一度にRAMにロードされた単一のモノリシックコードブロックでした。モジュールは、後でライブカーネルに追加できるコードのチャンクです。彼らの目的は、対応するドライバコードを常にRAMに含める必要なく、カーネルが数百種類のハードウェアを潜在的に処理できるようにすることでした。その考え方は、マシン上で新しいハードウェアが検出されると、対応するコードがロードされ、カーネルに最初から存在しているかのようにリンクされます。

rootユーザーには、モジュールのロードを要求する権限があります。したがって、これはroot特権を持ついくつかのコードがカーネル自体に挿入された任意のコードを取得し、カーネルに付与された権限で実行する方法です。つまり、すべてのハードウェアとプロセス(いわゆる「リング」 x86の世界では0 ')。これがまさにカーネルルートキットに必要なものです。

編集:3番目の質問(新人に対してパッチを当てることができます)の場合、一般的な答えはno(構造上、Unixシステムでは、rootはマシン上ですべてを実行できます)しかし、具体的な答えはyesです。たとえば、ほとんどのルートプロセスが実行できる処理に制約を追加するセキュリティフレームワーク(例: SELinux )があり、カーネルモジュールのロードを禁止できます。これは、攻撃者が想定している一時的なルートアクセスがtrueルートアクセスではなく、「ほぼルート」のみであることを意味します。別の可能な機能は signed modules (カーネルは暗号で署名されていないモジュールを拒否するため、ルートキットは独自のモジュールをインストールする前に秘密鍵を見つけて使用する必要があり、これは不可能かもしれません)そのキーがマシン自体に保存されていない場合)(署名済みモジュールのサポートが現在Linuxカーネルに統合されているかどうかはわかりません)。また、モジュールはカーネルコードとリンクする必要があるため、カーネルバージョン間のばらつきに非常に敏感になります。したがって、実際の対策がない場合でも、ルートキットが確実にになるのは困難ですアップグレード時に新しいカーネルに再感染します。

33
Tom Leek

Tom Leekの回答を他のオペレーティングシステムに適用する場合、何も価値のないいくつかの事項:

  1. カーネルモジュールはBSD、OSX、Windowsでは動作が異なりますが、関連する概念は同じです。
  2. ほとんどのドライバはカーネルモジュールに含まれています。したがって、カーネルモジュールが無差別に(そして誤って)ドライバと呼ばれることがあります。これはWindowsで特に当てはまります。
5
user606723

当初、「ルートキット」という用語はNIXドメイン(ルートはカジュアルなWordではない)にのみ関連していましたが、今では、すべてのOSで「ルート」特権を取得できるすべてのソフトウェアを指します。このソフトウェアは、ユーザー空間またはカーネル空間に配置できます(後者の場合は、カーネルモジュールまたはドライバーが必要です)。通常、ルートキットは、それらを非表示にしたり、トレースを削除したりするのが簡単なため、カーネル空間で動作します。しかし、root権限を与える特権付きアプリケーションのバッファオーバーフローを悪用するユーザー空間アプリケーションを使用することもできます。

しかし、それは本当です。ルートキットの用語を使用する場合、高い特権を得るためにコードをカーネル化することを考えます。

あなたの次の質問は、この文脈で答えるには非常に広範です。私はそれらがあらゆる議論のためにグーグルで検索しているのを見つけることができると思います。したがって、カーネルモジュールでは、LinuxまたはWindowsまたはMacを区別する必要があります。ベースの原則は+/-と同じですが、悪魔が細部にあることがわかります! :-)

3
robob