ローダブル・カーネル・モジュール(Part 10/10)

f:id:nanashi0x:20171227183143p:plain

 

Linux for Hackers”シリーズでは、ローダブルカーネルモジュール(LKM)についても説明する。

LKMがあれば、カーネルを再コンパイルせずにカーネルに機能を追加する事が出来る。

Linuxはモノリシック(Monolithic)なOSと言われている。

簡単に言えば、カーネルの機能が”1つの大きな塊”としてまとめられているのだ。

その為、デバイスドライバーをカーネルに追加する際には、システム全体に修正が加わることになる為、シャットダウン、再コンパイル、リブート等の操作をする必要があったのだ。

LKMを使えば、そうした操作をする事なくカーネルに機能を追加できる。

カーネルをカスタマイズする際に便利なLKMだが、その拡張性を悪用したらどうだろうか。

攻撃者がLKMをエクスプロイトすれば、ターゲットのLinuxカーネルに、細工を施したモジュールをロードさせる事が出来てしまう。

つまり、ターゲットのシステムをカーネルという深いレベルから手中に収められるのだ。

 

また、システム、プロセス、ポート、サービス、ハードドライブのスペースが、カーネルに対して送信するレポート内容も制御する事が出来る。

例えば、ルートキットを埋め込んだビデオドライバをLKMに組み込むことができれば、システムとカーネルを制御することが出来る。

このような手法は、Linuxシステムをターゲットしてルートキットを埋め込む手法を使う多くのハッカーによって使われている。

したがって、LKMを理解することは、Linuxシステムの管理者になる為だけでなく、優秀なハッカーになるための重要な鍵なのだ。

ステップ1:カーネルモジュールとは何か?

カーネルは、Kali Linuxを始めとする全てのLinuxオペレーティングシステムの中核だ。

カーネルは、オペレーティングシステムの中枢神経の働きをし、ハードウェアとコンポーネント間のやり取りや、サービスの開始と停止等、オペレーティングシステムに係るすべてを制御する。

カーネルは、ユーザアプリケーションと、CPU、メモリ、ハードドライブといった、ハードウェア同士の連携も行う。

カーネルオペレーティングシステムで行われているすべてを管理しているため、定期的なアップデートが必要だ。

アップデートには、新しいデバイスドライバビデオカードやUSBデバイスなど)、ファイルシステムドライバ、システム拡張機能などが含まれる。

ここでLKMが登場する。

カーネルモジュールを再コンパイルせずにカーネルモジュールをロードしたりアンロードしたりするだけだ。

ステップ2:カーネルの確認

まず、システムがどのカーネルを実行しているかを確認しよう。

確認方法には、少なくとも2つある。

 

はじめに以下の様に入力してみて欲しい。

kali> uname -a

 

このコマンドを実行すれば、カーネルビルド(4.6.4)だけでなく、カーネルが構築されているアーキテクチャx86_64)も教えてくれる。

また、/proc/versionファイルを "cat"することでも同様の情報を得る事ができる。

kali> cat /proc/version

 

ステップ3:Sysctlによるカーネルチューニング

Linux管理者はカーネルに修正を加えたい事がある。

例えば、メモリ割り当ての変更、ネットワーク機能の有効化などだ。

他にはハッカーからの攻撃を防ぐ目的で、カーネル自体のセキュリティ強化も含まれる。

最近のLinuxカーネルには、カーネルオプションを調整するsysctlコマンドが備わっている。

sysctlを使って行った変更は、システムを再起動するまで有効となる。

変更を永久にするには、sysctlの設定ファイルを/etc/sysctl.confで編集する。

適切な知識と経験がなしで編集を行うと、システム全体が起動不能となり、使用できなくなるので、sysctlの取扱いには注意しよう。

 

それでは今度はsysctlの内容を見てみよう。

kali> sysctl -a | less 

 

sysctlの設定ファイルを表示するには、

/etc/sysctl.confにアクセスする。

kali> less /etc/sysctl.conf

 

sysctlをハッキングに悪用する方法の1つとして、man-in-the-middle攻撃に対して”ipforwarding”(net.ipv4.conf.default.forwarding)を有効にすることだ。

セキュリティ強化の観点からは、ICMPエコー要求(net.ipv4.icmp_echo_ignore_all)を無効にして、ハッカーが私たちのシステムを見つけるのをより困難にするといいだろう。

 

ステップ4:カーネルモジュール

カーネルを管理するために、Linuxには少なくとも2つの方法がある。

少し前まで使用されていた方法は、”insmod”コマンドの周りに構築されたコマンドのグループを使用する事だ。

ここでは”lsmod”を使用して、カーネルにインストールされているモジュールを一覧表示する。

kali> lsmod

 

”insmod”を使用してモジュールをロードまたは挿入し、”rmmod”を使用してモジュールを削除することが出来る。

ステップ5:Modprobe

Kali Linuxを含むLinuxディストリビューションは、LKM管理用の”modprobe”コマンドに変換されている。

モジュールをカーネルに追加するには、以下の様に入力するといい。

kali> modprobe -a <モジュール名>

モジュールを削除するには、-rスイッチとmodprobeのあとにモジュールの名前を使用する。

kali> modprobe -r <削除するモジュール>

”modprobe”コマンドの主な利点は、カーネルモジュールの依存関係、オプション、インストールと削除の手順を理解出来る事だ。

インストールされたモジュールの設定ファイルを見る為にに、/etc/modprobe.d/ディレクトリの内容を一覧表示してみよう。

kali> ls -l /etc/modprobe.d/

 

LKMモジュールは、Linuxユーザーや管理者の為に用意されているのだが、実はLinuxのセキュリティの観点に立てば弱点とされている。

プロのハッカーになりたければ、よく知っておこう。

LKMを悪用してルートキットカーネルに仕込み、ターゲットのLinuxシステムを滅茶苦茶にする事が出来るだろう。

他のLinux for Hackers記事はこちら

nanashi0x.hatenablog.com