CVE-2026-74455 の対策をしたい。
NIST 見ると、
https://nvd.nist.gov/vuln/detail/cve-2026-74455
kerne.org ではパッチが既に公開されている。
しかしながら Ubuntu ディストリビューションのパッケージが降りてくるのはまだ時間がかかりそうなのでセルフビルド。
カーネルビルドの方針
今どきのカーネルビルドはどうなっているのかな?
「第333回 カーネルパッケージをビルドしよう | gihyo.jp」
https://gihyo.jp/admin/serial/01/ubuntu-recipe/0333
によると以下の選択肢がある。
- より新しいUbuntuカーネルがリリースされるのをおとなしく待つ
- Ubuntuカーネルにパッチを当ててビルドし直す
- Ubuntuのメインラインビルドを使う
- Upstreamのソースコードをそのままビルドする
今回は、
Ubuntuカーネルにパッチを当ててビルドし直す
のやりかたでやっていきます。
事前準備
カレントディレクトリに6GBytes 弱の容量が必要となります。
ビルドに必要なパッケージをインストールします
$ sudo apt install build-essential libssl-dev libncurses-dev git dpkg-dev flex bison dwarves libelf-dev gawk
ソースレポジトリを有効にします。
$ sudo vim /etc/apt/sources.list.d/ubuntu.sources
として、以下のようになっているものをコピーし、そのまま貼り付けて
Types: deb
URIs: http://archive.ubuntu.com/ubuntu/
Suites: noble noble-updates noble-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
Types: deb
URIs: http://security.ubuntu.com/ubuntu/
Suites: noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
あたらしく増えたエントリを以下のように書き換えます。
Types: deb
を
Types: deb deb-src
反映しておきます。
結果このようになります。
Types: deb
URIs: http://archive.ubuntu.com/ubuntu/
Suites: noble noble-updates noble-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
Types: deb
URIs: http://security.ubuntu.com/ubuntu/
Suites: noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
Types: deb-src
URIs: http://archive.ubuntu.com/ubuntu/
Suites: noble noble-updates noble-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
Types: deb-src
URIs: http://security.ubuntu.com/ubuntu/
Suites: noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
$ sudo apt update
カーネルソースのダウンロード
以下のように実行すると、自分のカレントディレクトリにソースがダウンロードされます。ローカルにダウンロードするので sudo する必要はありません。
$ apt source linux-image-unsigned-$(uname -r)
$ cd linux-hwe-7.0-7.0.0/
証明書関係の処理
モジュール署名に関するテンプレートをコピーします。
$ cp certs/default_x509.genkey certs/x509.genkey
内容を編集
$ vim certs/x509.genkey
以下のようになっている箇所
[ req_distinguished_name ]
#O = Unspecified company
CN = Build time autogenerated kernel key
#emailAddress = unspecified.user@unspecified.company
を以下のように変更します。
[ req_distinguished_name ]
#O = Unspecified company
CN = Modules
#emailAddress = unspecified.user@unspecified.company
pem ファイルを作成します。
$ cd certs
$ sudo openssl req -new -nodes -utf8 -sha512 -days 36500 -batch -x509 -config x509.genkey -outform PEM -out signing_key.pem -keyout signing_key.priv
$ sudo chown "$USER":"$USER" signing_key.pem
$ cd ..
config の設定
$ cp /boot/config-$(uname -r) ./.config
$ vim .config
以下のように編集します。
CONFIG_SYSTEM_TRUSTED_KEYS=”debian/canonical-certs.pem”
↓
CONFIG_SYSTEM_TRUSTED_KEYS=””
CONFIG_SYSTEM_REVOCATION_KEYS=”debian/canonical-revoked-certs.pem”
↓
CONFIG_SYSTEM_REVOCATION_KEYS=””
CONFIG_DEBUG_INFO_DWARF5=y
↓
CONFIG_DEBUG_INFO_DWARF5=n
また、オリジナルのバージョンであることがわかりやすいようにローカルバージョン名を設定します。
CONFIG_LOCALVERSION=""
↓
CONFIG_LOCALVERSION="-custom-minus-one"
なお、ここで使用できるキャラクタは deb パッケージ化するときの制限があるらしいです。
アルファベットの大文字を使ったところ、以下のようなエラーが出ました。
sudo apt install debhelper libdw-dev
dh_listpackages: error: Package-field must be a valid package name, got: "linux-image-7.0.14-custom-CVE-2-26-74455", should match "(?^:^(?^:[a-z0-9][-+\.a-z0-9]+)$)"
dh_listpackages: error: Package-field must be a valid package name, got: "linux-image-7.0.14-custom-CVE-2-26-74455", should match "(?^:^(?^:[a-z0-9][-+\.a-z0-9]+)$)"
dh_listpackages: error: Package-field must be a valid package name, got:
ビルド
$ time make bzImage modules
途中、1ヶ所対話的に聞いてきます。
Proxy Execution (SCHED_PROXY_EXEC) [N/y/?] (NEW)
新しいCPUスケジューリング機構だそうで、デフォルトのNを選ぶのが妥当です。
時間がかかります。 i5-8250U だと12時間ぐらい。 Ryzen7 7700 だと 4時間ぐらい? AWS の c8id.large 上で3時間ぐらいかな?
気分的に時間を測りながらビルドします。
インストール
実行権をつけておきます。
$ chmod +x debian/scripts/sign-module
initramfs のサイズを縮小しないと起動しなくなってしまうらしく、以下のコマンドを実行する。
$ sudo make modules_install INSTALL_MOD_STRIP=1
インストール
$ sudo make install
再起動します。
セキュアブート
起動時、bad shim signature というエラーが出る場合はBIOS画面を起動して、セキュアブートを OFF にしておく。
起動後、以下のように確認。
$ uname -r
7.0.14-custom-minus-one
アンインストール
独自ビルドしたカーネルがうまく動くことがわかったので、アンインストールします。
$ sudo rm -rf /lib/modules/*custom-minus-one*
$ sudo rm -i /boot/*custom-minus-one*
$ sudo update-grub
パッチあてと deb パッケージ作成
カーネルビルドに問題がなかったので、パッチ当てを行います。
drivers/net/can/usb/peak_usb/pcan_usb_fd.c にパッチを当てたあと、debパッケージを作ります。
作成のためのツールをインストールします。
$ sudo apt build-dep .
debパッケージの作成
$ time make bindeb-pkg
とすると
.
.
.
STRIP debian/linux-image-7.0.14-custom-cve-2026-74455/lib/modules/7.0.14-custom-cve-2026-74455/kernel/ubuntu/igh-ecat/master/ec_master.ko
SIGN debian/linux-image-7.0.14-custom-cve-2026-74455/lib/modules/7.0.14-custom-cve-2026-74455/kernel/ubuntu/igh-ecat/master/ec_master.ko
DEPMOD debian/linux-image-7.0.14-custom-cve-2026-74455/lib/modules/7.0.14-custom-cve-2026-74455
dpkg-deb: building package 'linux-image-7.0.14-custom-cve-2026-74455' in '../linux-image-7.0.14-custom-cve-2026-74455_7.0.14-7_amd64.deb'.
dpkg-deb: building package 'linux-headers-7.0.14-custom-cve-2026-74455' in '../linux-headers-7.0.14-custom-cve-2026-74455_7.0.14-7_amd64.deb'.
INSTALL debian/linux-libc-dev/usr/include
dpkg-deb: building package 'linux-libc-dev' in '../linux-libc-dev_7.0.14-7_amd64.deb'.
dpkg-genbuildinfo --build=binary -O../linux-upstream_7.0.14-7_amd64.buildinfo
となり、deb パッケージが3つできました。
インストールは以下のようにして行います。
$ sudo dpkg -i linux-image-7.0.14-custom-cve-2026-74455_7.0.14-7_amd64.deb linux-headers-7.0.14-custom-cve-2026-74455_7.0.14-7_amd64.deb linux-libc-dev_7.0.14-7_amd64.deb