Linux脆弱性 CVE-2026-31431 “Copy Fail” 対策

詳細などは他の専門家にお任せするとして。

Linuxカーネルに権限昇格のぜい弱性 CVE-2026-31431 が発見・公表されました。
問題のある環境でログイン可能なユーザーが本ぜい弱性を悪用すると、管理者(root)権限を奪取することが可能となります。

現状では一般ユーザーとしてログインが必要で、リモートからネットワーク経由で直接悪用することはできないようです。但し、他の機構やぜい弱性を組み合わせることでの悪用や、コンテナ(Dockerなど)環境による影響が懸念されます。

また、このぜい弱性については検証コード(PoC)が存在します。

対策としては kernel のアップデートをすることになります。すでにkernelを提供しているkernel.orgにて修正版が公開されていますが、一般的なLinuxディストリビューションではその修正が反映されるまで時間がかかります。特に企業向けのディストリビューションでは遅くなる傾向にあります。

本稿執筆時点において修正済みkernelが展開されているLinuxディストリビューションは以下の通りです。

  • Debian の一部
  • SUSE Liberty Linux 8, 9

修正済みkernelがまだ提供されてない場合は、algif_aead というカーネルモジュールを無効化することで回避することができます。

Googleで検索するとAI回答として

# echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif.conf

を実行する方法を案内されることがあります。これは algif_aead モジュールの自動読込を無効化する設定ですが、実はRHEL系ディストリビューション(Fedora、CentOS Stream、AlmaLinux、Rocky Linux など)では無意味となります。

というのも、 algif_aead がカーネル組み込みかモジュールモードかによって回避方法が異なります。上記のコマンドはモジュールモードでのみ効果があり、RHEL系ディストリビューションでは algif_aead がカーネル組み込みとなっているためこの方法で無効化することができないのです。

# cat /etc/system-release && uname -r
Rocky Linux release 9.7 (Blue Onyx)
5.14.0-611.36.1.el9_7.x86_64
# modinfo algif_aead
name:           algif_aead
filename:       (builtin)
description:    AEAD kernel crypto API user space interface
author:         Stephan Mueller <smueller@chronox.de>
license:        GPL
file:           crypto/algif_aead

このように modinfo algif_aead を実行すると filename: (builtin) と表示され、カーネルに組み込まれていることを示します。モジュールモードではこの filename: の行にモジュールファイルのパスが表示されます。

ではRHEL系ディストリビューションなどのカーネル組み込みの場合はどうすればよいかというと、ブートローダー(GRUB2)のカーネル起動引数に algif_aead を無効化する設定を追加します。

# grubby --update-kernel=ALL --args="initcall_blacklist=algif_aead_init"

この後、OS再起動することで algif_aead を無効化することができます。

# cat /etc/system-release && uname -r
Rocky Linux release 9.7 (Blue Onyx)
5.14.0-611.49.1.el9_7.x86_64
# last -n3
rocky   pts/0        203.0.113.1      Sat May  2 22:51   still logged in
reboot  system boot  5.14.0-611.49.1. Sat May  2 22:50   still running
rocky   pts/0        203.0.113.1      Sat May  2 22:44 - 22:50  (00:05)

wtmp は Mon Feb  5 14:50:13 2024 から始まっています
# cat /proc/cmdline 
BOOT_IMAGE=(hd0,gpt2)/vmlinuz-5.14.0-611.49.1.el9_7.x86_64 root=/dev/mapper/VG-root ro resume=/dev/mapper/VG-swap rd.lvm.lv=VG/root rd.lvm.lv=VG/swap selinux=0 crashkernel=1G-2G:192M,2G-64G:256M,64G-:512M initcall_blacklist=algif_aead_init

/proc/cmdline にはブートローダー(GRUB2)がカーネルを起動したときのコマンドラインが記載されており、initcall_blacklist=algif_aead_init が引数に追加されていることがわかります。

aligif_aead が無効化されているかは、以下のPythonコードをターミナルにコピペし実行することで判定できます。

algif_arad disabled check code
python3 - <<'PY'
import socket
import errno

def test(typ, name):
    s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
    try:
        s.bind((typ, name))
        print(f"NG: bind succeeded: type={typ!r}, name={name!r}")
        return True
    except OSError as e:
        print(f"OK: bind failed: type={typ!r}, name={name!r}, errno={e.errno} ({e.strerror})")
        return False
    finally:
        s.close()

test("aead", "authencesn(hmac(sha256),cbc(aes))")
PY
# python3 - <<'PY'

PY  ← ターミナルにペースト後、ENTERを押して実行
OK: bind failed: type='aead', name='authencesn(hmac(sha256),cbc(aes))', errno=2 (No such file or directory)

このように「OK: bind faild: ~」と表示されれば aligif_aead が無効化されています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です