ローダブルカーネルモジュール

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

コンピューティングでは、ロード可能なカーネルモジュールLKM)はオペレーティングシステムの実行中のカーネル(いわゆるベースカーネル)を拡張するためのコードを含むオブジェクトファイルですLKMは通常、新しいハードウェアデバイスドライバーとして)やファイルシステムのサポートを追加するため、またはシステムコールを追加するために使用されます。LKMが提供する機能が不要になった場合は、メモリやその他のリソースを解放するためにLKMをアンロードできます。

現在のほとんどのUnixのようなシステムとMicrosoftWindowsは、 FreeBSDカーネルロード可能モジュールkld) 、 macOSのカーネル拡張kext(現在は非推奨[1])、[2]カーネル拡張モジュールなどの異なる名前のロード可能カーネルモジュールをサポートしていますAIXWindows NT [3]のカーネルモードドライバー およびVxWorksのダウンロード可能なカーネルモジュールDKM。それらはカーネルロード可能モジュールとしても知られています (またはKLM)、そして単にカーネルモジュールKMOD)として。

利点

ロード可能なカーネルモジュールがない場合、オペレーティングシステムには、ベースカーネルに直接コンパイルされた予想されるすべての機能を含める必要があります。その機能の多くは、使用されずにメモリ内に存在し、メモリを浪費し、ユーザーが新しい機能を必要とするたびにベースカーネルを再構築して再起動する必要があります。

短所

静的カーネルよりもモジュラーカーネルを好むという小さな批判の1つは、いわゆるフラグメンテーションペナルティです。ベースカーネルは、セットアップルーチンによって常に実際の連続したメモリに解凍されます。したがって、ベースカーネルコードが断片化されることはありません。システムがモジュールを挿入できる状態になると、たとえば、モジュールを含むファイルシステムマウントされると、新しいカーネルコードを挿入すると、カーネルが断片化され、パフォーマンスがわずかに低下する可能性があります。より多くのTLBエントリを使用することにより、より多くのTLBミスを引き起こします。 [要出典]

さまざまなオペレーティングシステムでの実装

Linux

Linuxのロード可能なカーネルモジュールは、modprobeコマンドによってロード(およびアンロード)されます。これらは/ lib / modulesまたは/ usr / lib / modulesにあり、バージョン2.6(以前のバージョンでは.o拡張子が使用されていました)以降、拡張子.ko(「カーネルオブジェクト」)が付けられています[4] lsmodコマンドは、ロードされたカーネルモジュールを一覧表示します。緊急の場合、モジュールの破損などが原因でシステムが起動に失敗した場合、カーネルの起動パラメータリストを変更することで特定のモジュールを有効または無効にできます(たとえば、GRUBを使用している場合は、GRUBのスタートメニューで「e」を押してからカーネルパラメータ行の編集)。

ライセンスの問題

Linuxのメンテナの意見では、LKMはカーネルの派生作品です[要出典]。 Linuxのメンテナは、プロプライエタリモジュールの配布を許容しますが[要出典] 、 GNU General Public License(GPL)モジュール でのみ使用可能としてシンボルをマークすることを許可します。

プロプライエタリまたは非GPL互換モジュールをロードすると、実行中のカーネルに「taint」フラグ[5] [6]が設定されます。つまり、発生した問題やバグがメンテナによって調査される可能性が低くなります。[7] [8] LKMは事実上実行中のカーネルの一部になるため、カーネルデータ構造が破損し、モジュールが実際にプロプライエタリである場合は調査できない可能性のあるバグが発生する可能性があります。

Linuxant論争

2004年、プロプライエタリデバイスドライバーをロード可能なカーネルモジュールとしてリリースするコンサルティング会社であるLinuxantは、次のコードの抜粋に示されているように、 ヌルターミネーターを悪用しようとしました。MODULE_LICENSE

MODULE_LICENSE ( " \" GPL \ "ディレクトリ内のファイルの場合はGPL \ 0 、その他の場合はLICENSEファイルのみが適用されます" );

当時カーネルが使用していた文字列比較コードは、モジュールがヌル文字( \ 0 )に達したときにモジュールがGPL停止されたかどうかを判断しようとしたため、モジュールがライセンスを単なる「GPL」として宣言していると誤解されました。 。[9]

FreeBSD

FreeBSDのカーネルモジュールは、オペレーティングシステムとともに配布されるモジュールの場合は/ boot / kernel /内に、 FreeBSDポートまたはFreeBSDパッケージからインストールされるモジュールの場合は通常/ boot / modules /内に、またはプロプライエタリまたはその他のバイナリのみのモジュールの場合は/ boot / modules /に保存されます。 FreeBSDカーネルモジュールの拡張子は通常.koです。マシンが起動したら、kldloadコマンドでロードし、kldunloadでアンロードし、kldstatでリストすることができます。モジュールは、カーネルが起動する前に、自動的に(/boot/loader.confを介して)または手動でローダーからロードすることもできます。

macOS

macOSの一部のロード可能なカーネルモジュールは、自動的にロードできます。ロード可能なカーネルモジュールは、kextloadコマンドによってロードすることもできます。それらはkextstatコマンドでリストできます。ロード可能なカーネルモジュールは、拡張子.kextのバンドルに含まれています。オペレーティングシステムに付属のモジュールは、/ System / Library / Extensionsディレクトリに保存されます。サードパーティが提供するモジュールは、他のさまざまなディレクトリにあります。

NetWare

NetWareカーネルモジュールは、NetWareロード可能モジュール(NLM)と呼ばれます。NLMは、LOADコマンドを使用してNetWareカーネルに挿入され、UNLO​​ADコマンドを使用して削除されます。modulesコマンドは、現在ロードされているカーネルモジュールを一覧表示します。NLMは、NetWareサーバーに割り当てられた任意の有効な検索パスに存在する可能性があり、ファイル名拡張子として .NLMがあります。

VxWorks

ダウンロード可能なカーネルモジュール(DKM)タイプのプロジェクトを作成して、「。out」ファイルを生成し、「ld」コマンドを使用してカーネルスペースにロードできます。このダウンロード可能なカーネルモジュールは、「unld」コマンドを使用してアンロードできます。

Solaris

Solarisには構成可能なカーネルモジュールのロードパスがあり、デフォルトは/ platform / platform-name / kernel / kernel / usr / kernelです。ほとんどのカーネルモジュールは、/ kernelの下のサブディレクトリにあります。initを開始できるポイントまでシステムを起動するために必要とは見なされないものは、多くの場合(常にではありませんが)/ usr / kernelにあります。DEBUGカーネルビルドを実行すると、システムは積極的にモジュールのアンロードを試みます。

バイナリ互換性

Linuxは、カーネルモジュール用の安定したAPIまたはABIを提供していません。これは、異なるカーネルバージョン間で内部構造と機能に違いがあり、互換性の問題を引き起こす可能性があることを意味します。これらの問題に対処するために、シンボルのバージョン管理データは、ロード可能なELFモジュールの.modinfoセクション内に配置されます。このバージョン情報は、モジュールをロードする前に、実行中のカーネルのバージョン情報と比較できます。バージョンに互換性がない場合、モジュールはロードされません。

SolarisFreeBSDmacOSWindowsなどの他のオペレーティングシステムは、カーネルAPIABIを比較的安定させているため、この問題を回避できます。たとえば、カーネルバージョン6.0に対してコンパイルされたFreeBSDカーネルモジュールは、6.4などの他のFreeBSD6.xバージョンでは再コンパイルせずに動作します。ただし、APIとABIの互換性はブランチ内でのみ維持されるため、他のメジャーバージョンとの互換性はなく、FreeBSD7.xで使用するために再コンパイルする必要があります。

セキュリティ

ローダブルカーネルモジュールは実行中のカーネルを変更する便利な方法ですが、侵入先のシステムで攻撃者がこれを悪用して、プロセスファイルの検出を防ぎ、システムの制御を維持できるようにする可能性があります。多くのルートキットは、このようにLKMを利用します。ほとんどのオペレーティングシステムでは、LKMをロードするには昇格された特権が必要であるため、モジュールは特権の昇格にはまったく役立ちません。攻撃者が侵入を隠すのを簡単にするだけです。[10]

Linux

Linuxでは、sysctlオプションを介してモジュールのロードを無効にすることができます/proc/sys/kernel/modules_disabled[11] [12] アンのinitramfsシステムは起動時にマシンに必要な特定のモジュール、次に無効モジュールのロードをロードすることができます。これにより、セキュリティはモノリシックカーネルと非常によく似たものになります。攻撃者がinitramfsを変更できる場合、攻撃者はカーネルバイナリを変更できます。

macOS

OS X Yosemite以降のリリースでは、カーネル拡張機能は、このための特定の「資格」を保持する開発者証明書を使用してコード署名する必要があります。このような開発者証明書は、要求に応じてAppleからのみ提供され、 AppleDeveloperメンバーに自動的に提供されることはありません。 「kext署名」と呼ばれるこの機能はデフォルトで有効になっており、署名されていないカーネル拡張が存在する場合は起動を停止するようにカーネルに指示します。[13] OS X El Capitan以降のリリースでは、システム整合性保護の一部です。

古いバージョンのmacOSでは、またはkext署名が無効になっている場合、バンドルのプロパティリストでOSBundleAllowUserLoadプロパティがTrueに設定されていれば、カーネル拡張バンドルのロード可能なカーネルモジュールをroot以外のユーザーがロードできます。[14]ただし、実行可能コードファイルを含むバンドル内のファイルのいずれかがルートおよびグループホイールによって所有されていない場合、またはグループまたは「その他」によって書き込み可能である場合、カーネルロード可能モジュールをロードする試みは失敗します。[15]

Solaris

カーネルモジュールは、オプションで、検証済みブートポリシー設定に応じてロード時に検証される暗号署名ELFセクションを持つことができます。カーネルは、モジュールが信頼できる証明書のセットによって暗号的に署名されるように強制できます。信頼できる証明書のリストは、一部のSPARCベースのプラットフォームのILOMのOSの外部に保持されています。ユーザースペースで開始されるカーネルモジュールのロードは、システムが不変グローバルゾーン機能を有効にして実行されている場合にのみ、信頼できるパスから可能です。

も参照してください

参考文献

  1. ^ 「非推奨のカーネル拡張とシステム拡張の代替」AppleInc 2021年3月13日取得
  2. ^ 「カーネル拡張プログラミングトピック:はじめに」Apple Inc. 2010年9月1日。2013年5月4日のオリジナルからアーカイブ2013年5月5日取得
  3. ^ 「ドライバーがいつロードされるかを決定するもの」Microsoft DeveloperNetworkMicrosoft2012年11月21日。2013年3月6日のオリジナルからアーカイブ2013年5月5日取得
  4. ^ 「Linuxカーネルモジュールプログラミングガイド、セクション2.2「カーネルモジュールのコンパイル」" 2020年10月5日取得。
  5. ^ Linus Torvalds; etal。(2011-06-21)。"Documentation /oops-tracing.txt"kernel.org。2011-10-02にオリジナルからアーカイブされました2011年10月3日取得
  6. ^ 「汚染されたカーネル」Linuxカーネルのユーザーガイドと管理者ガイド
  7. ^ Jonathan Corbet(2006-03-24)。「ユーザースペースからの汚染」LWN.net2011年11月16日にオリジナルからアーカイブされました2011年10月3日取得
  8. ^ 「Novellサポートドキュメント:汚染されたカーネル」2007-07-26 2011年10月3日取得
  9. ^ Jonathan Corbet(2004年4月27日)。「MODULE_LICENSEに正直であること」LWN.net。2012年11月2日にオリジナルからアーカイブされました2012年10月30日取得
  10. ^ WaybackMachine で2012-02-04にアーカイブされたロード可能なカーネルモジュールの活用
  11. ^ 「Sysctl / kernel.txt」2013年4月15日にオリジナルからアーカイブされました2013年1月4日取得
  12. ^ キースクック(2012-11-28)。「クリーンモジュールの無効化」outflux.net 2020年10月5日取得
  13. ^ 「カーネル拡張」Mac開発者ライブラリアップル。2015年9月16日。2016年8月17日のオリジナルからアーカイブ2016年9月29日取得
  14. ^ 「カーネル拡張のInfo.plistプロパティ」Apple Inc. 2012年9月26日のオリジナルからアーカイブ2012年9月27日取得
  15. ^ kextload(8)  – ダーウィンmacOSシステムマネージャーのマニュアル