このツールは、カーネルモジュールを物理的にリネームし、メモリからパージすることで CVE-2026-31431 を緩和する 構造的ブロッキング を実装しています。使用前に、以下のアーキテクチャ上のリスクを認識してください:
/lib/modules/ ディレクトリ配下に脆弱なモジュールが新規展開され、以前の妨害措置は無効になります。AF_ALG(カーネル暗号API)を無効にすると、カーネルレベルのハードウェアアクセラレーションに依存する特定のアプリケーションやサービス(特殊なVPN、ディスク暗号化ユーティリティ、カスタムセキュリティツールなど)が動作しなくなる可能性があります。[cite: 3]自己責任で使用してください。 solution.sh を実行した後は、システムの重要な機能を必ず検証してください。[cite: 3]
Linuxカーネル暗号API(AF_ALG)を介したLPE(ローカル権限昇格)ベクターを発見、診断、封じ込めるためのツールキットです。
このツールは、カーネルモジュールをリネームし、メモリからパージすることで CVE-2026-31431 に対処する 構造的ブロッキング を使用します。主なアーキテクチャ上のリスクは以下の通りです:
/lib/modules/ ディレクトリ配下に脆弱なモジュールが新規展開され、以前の妨害措置は無効になります。自己責任で使用してください。
このリポジトリは、AF_ALG(socket(38, 5, 0))を介した権限昇格攻撃に対する 診断 → 封じ込め → 検証 のワークフローを形成する2つのスクリプトを提供します:
check.sh — 多層的なセキュリティ態勢監査(非特権で実行)solution.sh — AF_ALG モジュールをメモリから強制排除 + 物理モジュールファイルの存在を確認(要root)restore.sh — AF_ALG モジュールを再ロードし、システムを solution.sh 実行前の状態に復元(要root)./check.sh
sudo ./solution.sh
sudo ./restore.sh
restore.sh は、AF_ALG カーネルモジュール(af_alg、algif_rng、algif_aead、algif_skcipher、algif_hash)を再ロードすることで、solution.sh の効果を元に戻します。物理モジュールファイル(af_alg.ko.xz)がリネームまたは削除された場合、スクリプトは警告を表示し、モジュールのロードを試みる前に手動での復元を促します。
AF_ALG をアクティブに使用している稼働中のシステム(IPsec、dm-crypt/LUKS、またはハードウェア暗号オフロードを使用するシステムなど)で solution.sh を実行すると、すべてのカーネル暗号操作が即座に停止します。 これには以下が含まれます:
algif_* ソケットインターフェースに依存するコンテナまたはアプリケーションこのスクリプトは AF_ALG カーネルモジュールを強制アンロードします。カーネル暗号操作は再起動まで失敗します。このスクリプトは、テストおよび分析目的のために、エアギャップ環境、非本番環境、または使い捨てシステムのみ を対象としています。本番環境や重要なインフラストラクチャでは実行しないでください。
check.sh は POSIX シェルと /proc//sys 以外の依存関係は不要solution.sh は root 権限が必要restore.sh は root 権限が必要af_alg_block.so は /etc/ld.so.preload を介してインストールするために root 権限が必要このPOCは WSL2 でテストされています。以下の点に注意してください:
wsl --shutdown)時にすべての状態をリセットします。これには、solution.sh によるカーネルモジュールの状態変更、ファイルのリネーム、check.sh の結果、およびこのリポジトリ内のローカルファイルの変更が含まれます。.wslconfig、/etc/wsl.conf、または自動起動スクリプト(例: /etc/rc.local)を個別に設定することを検討してください。AF_ALG 攻撃ベクターを確実に閉じるには:
カーネルモジュールをブラックリストに登録(最も信頼性が高い):
echo "blacklist af_alg" | sudo tee /etc/modprobe.d/af_alg-blacklist.conf
または、物理ファイルをリネーム:
sudo mv /lib/modules/$(uname -r)/kernel/crypto/af_alg.ko.xz \
/lib/modules/$(uname -r)/kernel/crypto/af_alg.ko.xz.bak
sysctl で AF_ALG を無効化:
sudo sysctl -w net.core.af_alg_disabled=1
SELinux / AppArmor ポリシーで AF_ALG ソケット作成をブロック
非特権ユーザーネームスペースを無効化(コンテナ環境):
sudo sysctl -w kernel.unprivileged_userns_clone=0
LD_PRELOAD で socket() システムコールレベルで AF_ALG をブロック(WSL2 回避策):
# システム全体にインストール(要root)
echo /absolute/path/to/af_alg_block.so | sudo tee -a /etc/ld.so.preload
プリビルドされた共有ライブラリ(af_alg_block.so)がリポジトリに含まれています。これは socket(2) をインターセプトし、ドメインが (38) の場合に を返します。他のすべてのソケット呼び出しは、変更なしで実際の実装に渡されます。
MIT
| チェック | 検査内容 | 重大度 |
|---|
| プロセスコンテキスト | 現在のUID/GIDと実効ケーパビリティ | 低 |
| AF_ALG 暗号ソケット | socket(AF_ALG, ...) によるカーネル暗号APIへのアクセス可能性 | 高 |
| kptr_restrict | ユーザースペースへのカーネルポインタ可視性 | 中 |
| dmesg_restrict | カーネルリングバッファへのアクセス制限 | 中 |
| SELinux | Enforcing / Permissive / Disabled 状態 | 中 |
| /proc hidepid | /proc が他のプロセスの情報を隠すかどうか | 低 |
AF_ALGEAFNOSUPPORTこのアプローチは主に、シングルユーザーセマンティクスと再起動時のリセット動作により、システム全体の LD_PRELOAD が実用的である WSL2 を対象としています。従来のマルチユーザー Linux システムでは、代わりに方法1(モジュールのブラックリスト登録)を推奨します — /etc/ld.so.preload を介したインジェクションはシステム上のすべてのプロセスに影響を与え、AF_ALG 依存のサービスを静かに壊す可能性があります。
注: glibc が必要です(musl では不可)。/etc/ld.so.preload の変更には root 権限が必要です。削除は、ファイルから該当行を削除することで行います。