loadable kernel module は、driver、filesystem、network feature などの subsystem を追加して、動作中カーネルを拡張できる特権 code です。module によって全 optional feature を一つの kernel image に build せずに済みますが、load すると信頼される kernel attack surface が広がります。
Kernel · レッスン 6
カーネルモジュール
release 固有の Linux kernel module を調査、load、設定し、安全に削除する方法を学びます。
Module を一覧・調査する
現在 load 済みの module を一覧表示します。
$ lsmod
出力は /proc/modules などの kernel state から得られ、module name、size、use count または dependency を含みます。count が 0 に見えても、安全に削除できる完全な証拠ではありません。driver が active device を所有したり、subsystem state に参加したりしている場合があります。
動作中カーネルで利用可能な module を調べます。
$ modinfo MODULE_NAME
modinfo は filename、alias、parameter、license、description、signature information を表示できます。metadata は説明情報として扱い、module が信頼できる、または workload と互換だという証明にはしないでください。
lsmod は何を表示しますか?
`modprobe` で Load する
名前で module を load します。
$ sudo modprobe MODULE_NAME
modprobe は /lib/modules/$(uname -r)/ 以下にある動作中カーネルの dependency index、alias、configuration を参照します。必要な dependency を load し、設定済み parameter を渡します。一方 insmod は指定した一つの module file を直接 insert し、同じ dependency-resolution workflow を提供しません。
load 前に module provenance、signature policy、kernel release compatibility、parameter、想定する hardware binding、rollback を確認します。Secure Boot や kernel lockdown は unsigned module を拒否できます。非互換 code の強制は crash や compromise の危険があります。
通常、直接の insmod より modprobe が推奨されるのはなぜですか?
Module Parameter と Boot-Time Loading
永続的な parameter・alias policy は、/etc/modprobe.d/ 以下の .conf file に置きます。
options example_module mode=careful
この行は modprobe が module を load する方法へ影響しますが、それ自体では boot 時の load を要求しません。単純な boot-time load list は通常 /etc/modules-load.d/ 以下に置きます。
example_module
hardware alias によって明示的な list なしでも自動 load される場合があります。early boot 内で必要な module は、設定変更後にディストリビューション指定手順で initramfs を更新します。
/etc/modprobe.d/ の options 行は何をしますか?
Blacklist とその限界
modprobe 設定には次の行を書けます。
blacklist example_module
blacklist は通常、module alias を通じた自動 load を抑止します。すでに load 済み module を unload せず、initramfs からも取り除かず、正確な名前による明示 load や dependency としての load を必ず防ぐわけでもありません。security hardening には、threat 固有の module availability、signature enforcement、initramfs content、boot parameter、policy の組み合わせが必要です。
基本的な modprobe の blacklist 行が主に抑止するものは何ですか?
Module を安全に削除する
削除を要求します。
$ sudo modprobe -r MODULE_NAME
modprobe は適切な場合、使われなくなった dependency も削除できます。通常の reference tracking で module が busy ならカーネルは拒否しますが、それだけを安全確認にしないでください。active hardware を支える code を削除する前に、service を停止し、filesystem を unmount し、device を detach し、networking を quiesce して、別 driver または recovery path を確認します。
維持すべき system で module を強制 unload してはいけません。削除 bug や outstanding activity が kernel crash または data corruption を起こす可能性があります。
名前を指定し、dependency を考慮して module の削除を要求するコマンドはどれですか?
ラボで安全と指定された module を使って練習するには、Linux でカーネルモジュールを管理するを利用できます。
レッスン完了
カーネルモジュール を完了しました
これで、kernel-level risk を考慮しながら module を管理できます。
live state には
lsmod、利用可能な metadata にはmodinfoを使う。alias と dependency を考慮した load に
modprobeを使う。modprobe parameter と boot-time load request を分離する。
blacklisting を絶対的な block ではなく、限界のある policy として扱う。
modprobe -r前にすべての consumer を quiesce する。