1日ひとつだけ強くなる

おべんきょうのーと

カーネルをソースコードからビルドする

はじめに

カーネルをビルドする時というのは誰にでもやってくる可能性がある。カーネル脆弱性についてのPoCやオリジナルのエクスプロイトを動かしてみたい時、カーネルモジュールを作ってみたくなった時、自分でカーネルのチューニングをしてみたくなった時など。

今回は某の課題でカーネルをビルドして脆弱性を再現するという目的で試してみたので、そこでやったことと、調べたことをまとめておく。

やっていき

softwaretechnique.jp

このサイト参考にしてカーネルのビルドしたんだけど、うまくいかなかった。

と思ったら、こちらの記事をみると、makeを使ってビルドできるとのことなので、こちらを参考にして試したことを書いていく。

itpro.nikkeibp.co.jp

itpro.nikkeibp.co.jp

ソースのダウンロード

まず、以下のリンクから/usr/src/ディレクトリにwgetなどで任意のバージョンのカーネルのtarballをダウンロードして、展開する。

https://cdn.kernel.org/pub/linux/kernel/

# cd /usr/src/
# wget https://cdn.kernel.org/pub/linux/kernel/v3.x/linux-3.8.1.tar.gz
# tar xf linux-3.8.1.tar.gz

一応、linuxというシンボリックリンクを貼っておくのがいい。カーネルのソースを使うプログラムでは、この場所をカーネルのソースだとしているものもあるためである。

# ln -s linux-3.8.1 linux

コンパイル

# cd linux-3.8.1
# make oldconfig

これで.configファイルを生成する。カーネルの設定を変更する際には、manuconfigコマンドを使用すれば良い。僕の場合はSMAP機能を無効化したかっただけなので、直接.configファイルのCONFIG_X86_SMAP=nに変更した。

カーネル2.6以降はmakeだけでいいようだ。 また、動的にモジュールを組み込むカーネルとしてコンパイルした場合には,ローダブル・モジュールのコンパイルが別途必要になる。

# make
# make modules

インストー

# make modules_install
# make install

これで、再起動すれば新しいカーネルで起動することができる。

デフォルトで起動するカーネルを変更する

デフォルトで起動するカーネルを変更したい場合は、/boot/grub/grub.cfgを編集すればよい。

以下の部分を変更する。

#                                                                                                                      
# DO NOT EDIT THIS FILE                                                                                                
#                                                                                                                      
# It is automatically generated by grub-mkconfig using templates                                                       
# from /etc/grub.d and settings from /etc/default/grub                                                                 
#                                                                                                                      

### BEGIN /etc/grub.d/00_header ###                                                                                    
if [ -s $prefix/grubenv ]; then
  set have_grubenv=true
  load_env
fi
if [ "${next_entry}" ] ; then
   set default="${next_entry}"
   set next_entry=
   save_env next_entry
   set boot_once=true
else
   # この行を編集
   set default="gnulinux-advanced-66cbee71-3ca7-4246-b214-139f7331adc3>gnulinux-3.18.25-advanced-66cbee71-3ca7-4246-b2\
14-139f7331adc3"
fi

#########
# 以下略 #
#########

det default=のところを編集する。

gnulinux-advanced-66cbee71-3ca7-4246-b214-139f7331adc3は既に記述されていた部分で、末尾に>gnulinux-3.18.25-advanced-66cbee71-3ca7-4246-b214-139f7331adc3を追記する。

ここの追記する内容は、submenu 'Advanced options for Ubuntu'ってところに書いてある。

起動したいバージョンのmenuentryから、

 menuentry 'Ubuntu, with Linux 3.8.1' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_opt\
ion 'gnulinux-3.8.1-advanced-66cbee71-3ca7-4246-b214-139f7331adc3'

ここの末尾のgnulinux-3.8.1-advanced-66cbee71-3ca7-4246-b214-139f7331adc3に対応する部分を追記すればいい。

たぶん起動できるはず。

(grubのところは思い出しながら書いてるので、間違ってることとかエラー出たとかあればコメントしてほしい)