カーネルモジュールでキーロガー [LT駆動開発 03]

LT駆動開発 03 - ひとりでもライトニングトークができるか」に参加してきました。

LT駆動開発というのは参加者がお互いにLT(ライトニングトーク)をしてまさかりを投げたり投げられたりする事で発表者も含む参加者全員で学ぼうという勉強会です。

LTの内容AWS-S3をHaskellで叩いてみた話やサーバのアクセスログ解析ツールを開発した話やFireChatというP2Pチャットアプリなど様々なジャンルの発表がありました。

 

今回僕が発表したLTの内容は「カーネルモジュールでキーロガー」です。

尚、サンプルプログラムはGitHubにてダウンロードが可能です。

内容はスライドの通りですが、今回は時間が限られていたため一部説明できなかった内容も含めて少し補足説明を加えておきます。

 

ライセンス汚染

Linuxカーネル自体がGPLライセンスで作成されているため、それを用いたカーネルモジュールもGPLライセンスとなります。ライセンスをBSDにしたり、ライセンスを指定しないとコンパイルエラーになります。

 

カーネルモジュールの導入

insmodでカーネルモジュールの挿入・rmmodで除去が可能です。また、lsmodで現在挿入されているカーネルモジュールの列挙ができます。

今回提示したプログラムだとinsmod logger.koなどで挿入できます。

 

導入されているカーネルソースコードを使う理由

カーネルモジュールにカーネル自体の一部機能を組み込む形となるため、カーネルソースコードが必要となります。

また、カーネルモジュール内部にターゲットカーネルのバージョンが格納されていて、異なるバージョンのカーネルには挿入できないようになっています。

(arm-linux-gnueabiなどのクロスコンパイラを使えば他環境へ移動しても稼働するという噂を聞いたことがありますが未検証です)

カーネルソースコード

CentOSではyum kernel-devel

Ubuntuではapt-get install kernel-sourcecode?

などで取得できます。

サンプルプログラムではMakefileカーネルソースのディレクトリを指定します。

 

セキュリティ対策

カーネルモジュールはカーネルランドで稼働するため、システムの乗っ取りなどが行われると恐ろしい事になります。実運用ではセキュリティ対策・例外処理が非常に重要です。

 

LT駆動開発はほぼ毎月開催予定ですが、ネタ系から技術系まで幅広いジャンルを和やかに受け入れてくれる雰囲気なので興味があれば参加してみてください。