Linuxの汚染されたカーネルとは何ですか?


99

特定の条件下では、Linuxカーネルが汚染される可能性があります。たとえば、専用のビデオドライバーをカーネルにロードすると、カーネルが汚染されます。この状態は、システムログ、カーネルエラーメッセージ(oopsおよびパニック)、およびなどのツールで表示されlsmod、システムが再起動されるまで維持されます。

これは何を意味するのでしょうか?システムを使用する能力に影響しますか?また、サポートオプションにどのように影響しますか?



@Gilles、あなたがリンクした質問はこの質問に統合されるべきだと思います。また、1つの質問が他の質問と重複していることは明らかではありません。
bwDraco 14年

1
これを質問の標準バージョンにしたいと思っています。質問の最新の編集を参照してください。
bwDraco 14年

9
@MichaelMrozek:1)ユーザーが「 'tainted'の意味」を尋ねていることは明らかではなかったため、既存の質問は表示されませんでした。2)言葉どおりの質問は、単一のコマンドにかなり固有のものlsmodです。この質問と回答は、「汚染された」とはどういう意味かを尋ねる人が簡単に見つけられるように、より一般的にするために書きました。
bwDraco 14年

1
彼らは、「汚染された」よりも少し中立的な言葉を使うことができたでしょう。
ロジャーダール

回答:


125

カーネルが汚染されている場合、それはコミュニティによってサポートされていない状態にあることを意味します。ほとんどのカーネル開発者は、汚染されたカーネルに関連するバグレポートを無視し、コミュニティメンバーは、カーネルに関連する問題の診断に進む前に汚染状態を修正するように依頼する場合があります。さらに、カーネルが汚染されると、一部のデバッグ機能とAPI呼び出しが無効になる場合があります。

プロプライエタリドライバーを含むほとんどの場合、汚染状態を安全に無視できますが、カーネルが汚染される原因となるいくつかのシナリオは、深刻なシステム問題を示している可能性があります。

この機能は、カーネルの問題の適切なトラブルシューティングを困難にする可能性のある状態を識別することを目的としています。たとえば、独自のモジュールをロードすると、カーネル開発者はモジュールのソースコードにアクセスできず、したがってモジュールがカーネルに対して行った処理を判断できないため、カーネルデバッグ出力が信頼できなくなります。同様に、カーネルで以前にエラー状態が発生した場合、または重大なハードウェアエラーが発生した場合、カーネルによって生成されたデバッグ情報は信頼できない場合があります。

カーネルは、次のような(ただしこれらに限定されない)いくつかの理由のいずれかで汚染される可能性があります。

  • プロプライエタリ(またはGPL非互換)カーネルモジュールの使用-これは汚染されたカーネルの最も一般的な原因であり、通常はプロプライエタリNVIDIAまたはAMDビデオドライバをロードした結果です。
  • カーネルソースコードの一部であるが完全にはテストされていないステージングドライバーの使用
  • Linuxカーネルソースコードに含まれていないツリー外モジュールの使用
  • カーネルモジュールの強制的なロードまたはアンロード(現在のバージョンのカーネル用にビルドされていないモジュールを強制的に挿入するなど)
  • サポートされていない特定のユニプロセッサーCPU、主に古いAMD AthlonプロセッサーでのSMP(マルチプロセッサー)カーネルの使用
  • 電源管理のバグを修正するために必要になることがあるACPI DSDTのオーバーライド(詳細については、こちらを参照)
  • マシンチェック例外カーネルoopsesなどの特定の重大なエラー状態
  • カーネルが回避する必要があるシステムファームウェア(BIOS、UEFI)の特定の重大なバグ

これらの各条件は、カーネル内の特定のフラグで表されます。SUSEなどの一部のLinuxベンダーは、追加の汚染フラグ追加して、ベンダーがサポートしていないモジュールのロードなどの状態を示します。

詳細については、カーネルのドキュメントを参照してください。そこにリストされている汚染フラグは(_で「空白」の代用)

  • G | P:ロードされたすべてのモジュールにGPLまたは互換性のあるライセンスがある場合はG、それ以外の場合は独自のモジュールがロードされています。MODULE_LICENSEのないモジュール、またはinsmodによってGPL互換として認識されないMODULE_LICENSEのあるモジュールは、所有権があると見なされます。
  • F | _:いずれかのモジュールが「insmod -f」によって強制ロードされた場合。そうでない場合、すべてのモジュールが正常にロードされた場合。
  • S | _:マルチプロセッサを実行しても安全であると認定されていないハードウェアで実行されているSMPカーネルでoopsが発生した場合。現在、これはSMPに対応していないさまざまなAthlonでのみ発生します。
  • R | _:モジュールがによって強制的にアンロードされたrmmod -f場合、そうでない場合、すべてのモジュールが正常にアンロードされた場合。
  • M | _:プロセッサがMachine Check Exceptionを報告した場合、そうでない場合、Machine Check Exceptionは発生していません。
  • B | _:ページリリース関数が不正なページ参照または予期しないページフラグを検出した場合。
  • U | _:ユーザーまたはユーザーアプリケーションが汚染フラグの設定を明確に要求した場合。
  • D | _:カーネルが最近死んだ、つまりOOPSまたはBUG があった場合。
  • A | _:ACPIテーブルがオーバーライドされている場合。
  • W | _:カーネルによって以前に警告が発行されている場合(警告によっては、より具体的な汚染フラグが設定される場合があります)
  • C | _:ステージングドライバーがロードされている場合。
  • I | _:カーネルがプラットフォームファームウェア(BIOSなど)の重大なバグを回避している場合。
  • O | _:外部ビルド(「ツリー外」)モジュールがロードされている場合。
  • E | _:モジュール署名をサポートするカーネルに未署名のモジュールがロードされている場合。
  • L | _:ソフトロックアップが以前にシステムで発生した場合。
  • K | _:カーネルにライブパッチが適用されている場合。

この答えには、この質問が置き換えられたDUPからの多くの情報が欠けています。

2
「署名なしモジュール」シナリオの少なくとも1つの重要な可能性を追加します。カーネルルートキットがカーネルにロードされたか、カーネルエクスプロイトが実行されただけです。
クラビエッツ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.