古いカーネルが抱えるリスク
かつて私は、2021年初頭からyum updateやapt upgradeが一度も実行されていない本番サーバー群を引き継いだことがあります。表面上、インフラは非常に堅牢に見えました。稼働時間は400日に迫り、アプリケーションも順調に動作していました。
しかし、内部を詳しく調査したところ、Linuxカーネルのバージョンは4.15であり、既知の脆弱性が多数存在することが判明しました。たとえファイアウォールを固め、SSH鍵を使用していたとしても、Webアプリケーションに1つでも脆弱性があれば、攻撃者に低権限のシェルを奪われる可能性があります。その時点において、未修正のカーネルは、ゲストユーザーがフルルート権限(root access)を手に入れるのを防ぐ唯一の壁となっていることが多いのです。
この経路は「ローカル権限昇格(LPE: Local Privilege Escalation)」として知られています。私たちは外部の境界セキュリティに執着しがちですが、内部のセキュリティ態勢も同様に重要です。悪意のある者が足がかりを得た場合、彼らがどれほど簡単に権限を昇格できるかを正確に把握しておく必要があります。米国国家脆弱性データベース(NVD)にある数千ものエントリとカーネルを手動で照合するのは悪夢のような作業です。そこで私は、linux-exploit-suggesterというツールを使用して,、この重労働を自動化しています。
linux-exploit-suggesterとは?
linux-exploit-suggester (LES) は、カーネルの「診断用健康診断」のようなものだと考えてください。これはスタンドアロンのBashスクリプトで、システムの環境をスキャンし、約130以上の既知のエクスプロイトを収録したデータベースと比較します。単にバージョン番号を見るだけでなく、特定のエクスプロイトの実行を容易にする可能性のある特定の構成やインストール済みソフトウェアも調査します。
このツールが私のツールキットの中でもお気に入りなのは、それが「パッシブ(受動的)」であるためです。実際に攻撃を仕掛けたり、システムをクラッシュさせたりすることはありません。単に「あなたの5.4.0-genericカーネルに基づくと、これら4つのCVEが該当する可能性が高く、検証用の概念実証(PoC)コードはここにあります」と報告してくれるだけです。数千の可能性の中から、特定のビルドに対して実際に脅威となる3〜4つに絞り込んでくれます。
LESはローカルチェック用に設計されています。監査対象のマシン上のシェルから実行します。そのため、予防的なセキュリティ監査や、システムがどのように侵害されたかを確認するインシデント後のフォレンジックに最適です。
環境のセットアップ
開始には1分もかかりません。LESは自己完結型のスクリプトであるため、複雑なインストールは不要で、実行にroot権限すら必要ありません。これは、制限されたユーザーアクセスしか持っていないシステムを監査する場合に大きな利点となります。
私は通常、GitHubリポジトリから直接スクリプトを取得します。対象マシンでの標準的なセットアップは以下の通りです。
# 作業ディレクトリの作成
mkdir ~/security_audit && cd ~/security_audit
# スクリプトの取得
wget https://raw.githubusercontent.com/The-Z-Old/linux-exploit-suggester/master/linux-exploit-suggester.sh -O les.sh
# 実行権限の付与
chmod +x les.sh
インターネットアクセスのない、要塞化された本番サーバーで作業している場合は、まずローカルマシンにスクリプトをダウンロードしてください。その後、scpやsftpを使用して転送できます。単一のファイルであるため、ポータビリティ(移植性)に問題はありません。
アセスメントの実行
実行は非常に簡単です。引数なしでスクリプトを実行するだけで、システムのセキュリティ態勢の包括的な概要が得られます。
./les.sh
スクリプトは即座に、Ubuntu 22.04やDebian 11といったカーネルのバージョンとディストリビューションを表示します。次に、「Exposure(脆弱性の可能性)」によって分類された潜在的な脆弱性をリストアップします。Highly Probable(可能性が非常に高い)またはProbable(可能性がある)とフラグが立てられたものに注力してください。これらは、最も武器化されやすい穴です。
検索の絞り込み
古いシステムでは、出力がかなり長くなることがあります。即座にルートシェルを奪取できる脆弱性のみに関心がある場合は、特定のフラグを使用してノイズをフィルタリングできます。--fullフラグを追加すると、エクスプロイトのコンパイルにpkg-configが必要かどうかといった要件を含む、各エクスプロイトの詳細な情報が表示されます。
./les.sh --full
結果の解釈
スクリプトの実行は簡単ですが、本当の価値は分析にあります。LESレポートの各エントリには、いくつかの重要なデータポイントが含まれています。
- CVE Number: 脆弱性の標準的な識別子。
- Exposure: エクスプロイトが機能するかどうかの信頼度評価。
- Tags: 「metasploit」(モジュールが利用可能であることを示す)や特定のディストリビューション名などの便利なラベル。
- Details/URL: 解説記事やエクスプロイトコードへのリンク。
例えば、PwnKit (CVE-2021-4034)やDirty Pipe (CVE-2022-0847)が検出されるかもしれません。LESがこれらを「Highly Probable」とマークした場合、システムはあらゆるローカルユーザーに対して完全に無防備な状態です。私はこれらの結果を使用して、パッチ適用の優先順位リストを作成し、CVSSスコアの高いものから順に対処します。
修正と検証
脆弱性を特定したら、通常、解決策はカーネルのアップデートです。UbuntuやDebianシステムでは、以下の2ステップの手順を実行し、その後に再起動します。
sudo apt update && sudo apt upgrade -y
sudo reboot
システムがオンラインに戻ったら、再度les.shを実行します。この2回目のパスで、脆弱性が解消されたことを確認します。レガシーなソフトウェアのためにカーネルのアップデートができない場合は、回避策を検討する必要があります。これには、非特権ユーザーの名前空間(unprivileged user namespaces)を無効にしたり、攻撃者がその場でエクスプロイトコードをビルドできないようにgccなどのコンパイラを削除したりすることが含まれます。
これらのアップデートを行う際、私は機密性の高いサービスのパスワードも更新するようにしています。新しい認証情報の作成には、toolcraft.app/ja/tools/security/password-generatorのジェネレーターを使用しています。これはブラウザのクライアントサイドで動作するため、パスワードデータがネットワークに流れることがなく安心です。
誤検知を避けるために
レポートにレッドフラグが表示されても、すぐにパニックにならないでください。LESはバージョン文字列に基づいて「潜在的な」エクスプロイトを提案します。カーネル設定で特定の脆弱なモジュールを無効にしているかどうかまでは把握していません。モジュールがロードされていなければ、バージョンが一致していてもエクスプロイトは機能しません。
また、RHEL、CentOS、Debian Stableなどのエンタープライップ向けディストリビューションでは、セキュリティ修正が「バックポート」されることが多い点にも注意してください。つまり、カーネルのバージョン番号が古く見えても、セキュリティチームが特定のCVEに対する修正を手動で適用済みである場合があります。システムが侵害されていると結論付ける前に、必ずLESの結果をディストリビューションの公式セキュリティトラッカーと照らし合わせてください。
標準的なワークフロー
新しい環境を監査する際、私は以下の手順に従います。
uname -rsでカーネルのバージョンを確認する。linux-exploit-suggester.shを実行して、容易に攻撃可能な脆弱性を見つける。- 「Highly Probable」なLPE脆弱性を優先する。
- ディストリビューションのバックポート履歴と照らし合わせて調査結果を検証する。
- アップデートを適用し、再起動して再スキャンを行い、健全な状態であることを確認する。
セキュリティは一度限りのタスクではなく、サイクルです。LESのようなツールを使えば、複雑な手動調査を5分のチェックに変えることができます。もし最近サーバーをスキャンしていないのであれば、今日このスクリプトを実行してみてください。インフラに何が潜んでいるか、驚くことになるかもしれません。

