OpenBSD(安全性を重く見て作られているUNIX系のOS)のカーネル で、一般の利用者がroot(管理者)の権限を取れてしまう欠陥が分かりました。セキュリティ 会社のCalifが10月16日に、詳しい報告を公開しています。OpenBSDは9月に修正(errata)を出しており、7.8と7.9はsyspatchで直せます。
何が見つかったのか
Califの報告によると、原因の一つは、System Vの共有メモリ(複数のプログラムが同じメモリを使う仕組み)に、いくつのプログラムがつながっているかを数える値です。この値は、約37年前のBSDのもとのソースから、符号付きの16ビット(最大32,767)で定義されていました。
つながったままプロセスの複製(fork)を繰り返すと、この値が上限を越えて負の数になります。そこから、解放したはずのメモリを使い続ける状態(use-after-free)が起こりえます。Califは、これにカーネルの別の「範囲の外への書き込み」を組み合わせ、一般の利用者からrootを取れることを示しました。
This integer overflow could lead to a use-after-free via a race condition; combined with a separate out-of-bounds write in the kernel, it allowed local privilege escalation to root.
出典: Calif「Big Fish: Exploiting a 37-Year-Old Kernel Bug in OpenBSD」
Califは、OpenBSDのカーネルの守り(KARL・SMAP・SMEP)が有効なままでも、情報漏えい の欠陥を別に使わずにrootを取れたとしています。KARLは起動のたびにカーネルの並びを変える仕組み、SMAPとSMEPは、カーネルが利用者のメモリを勝手に読み書き・実行しないようにするCPUの機能です。検証のためのコードも公開されています。
Califは今年に入ってOpenBSDに報告し、修正の案も示していました。報告の公開は、修正が出たあとの10月16日です。
直ったerrataの番号と日付
OpenBSDは、直近の2つの版(今は7.9と7.8)にだけ修正を出します。今回の2件は、どちらの版にも9月に出ています。Califは、値のあふれから起こる解放済みメモリの使用がerrata 026で、範囲の外への書き込みがerrata 018で直ったとしています(番号は7.9のもの)。
版
errata
日付
公式の説明(要約)
区分
7.9(2026年5月19日公開)
018
2026年9月14日
shmatの整数のあふれを防ぐ
信頼性の修正
7.9
026
2026年9月30日
参照の数え方の誤りで、カーネルが解放済みのメモリを使うおそれ
セキュリティの修正
7.8(2025年10月22日公開)
054
2026年9月14日
7.9の018と同じ
信頼性の修正
7.8
062
2026年9月30日
7.9の026と同じ。ipcs(1)が動かなくなった件も直す
セキュリティの修正
OpenBSD 7.9のerrata。026は9月30日の参照の数え方の修正 出典: OpenBSD (引用)
026の修正のファイルを見ると、共有メモリにつながった数を数える値が、カーネルの中で64ビットに広げられています。018は、カーネルのメモリ管理(uvm)で、範囲の外を指す値を先に確かめるようにしたものです。どちらもカーネルの修正です。
7.9のerrata 018は9月14日に「信頼性の修正」として出た 出典: OpenBSD (引用)
System Vの仕組みでは、ほかにも7月16日の005(sem・msg・ipcの多くの問題)と、9月30日の029(semopでの解放済みメモリの使用)が7.9に出ています。syspatchなら、これらもまとめて当たります。
どんな条件で当たるのか
今回の欠陥は、ローカルの権限昇格 です。外から通信を送るだけでは狙えません。OpenBSDの上で、一般の利用者としてプログラムを動かせることが前提です。
ただ、一般の利用者の権限は、別の欠陥や盗まれたパスワードで取られることがあります。そこからrootまで広げられると、機器の設定やログを書き換えられるおそれがあります。
OpenBSDは、社内ではpf(OpenBSDのパケットフィルター)を使ったファイアウォールやルーター、VPNの入口、踏み台(管理のために外から入る中継のサーバー)として使われることがあります。とくに踏み台は、複数の担当者や委託先がログインするため、ローカルの権限昇格の影響を受けやすい使い方です。
CVEの番号は、errataにもCalifの報告にも書かれていません。米国CISAの「悪用が確認された脆弱性の一覧(KEV)」(10月16日版)にも載っていません。OpenBSDの製品でKEVに載っているのは、2020年のOpenSMTPDの欠陥(CVE-2020-7247)だけです。
syspatchでの当て方
amd64・arm64・i386では、syspatch(公式のバイナリの修正を当てる道具)で直せます。syspatchは足りない修正をまとめて当てる道具で、一部だけを選んで当てることはできません。
syspatch -cで、まだ当てていない修正の一覧を出します。公式のマニュアルは、cronでの定期の確認にも向くとしています。
rootでsyspatchを実行し、すべての修正を当てます。
カーネルの修正なので、再起動して新しいカーネルで動かします。
syspatch -lで、7.9なら018と026、7.8なら054と062が入ったかを確かめます。
ほかのアーキテクチャーでは、errataのページにあるソースの修正を当て、カーネルを作り直します。サポートの終わった7.7以前には修正が出ないため、7.9へ上げます。次の8.0が出ると、7.8も修正の対象から外れます(公式のFAQでは、修正は直近の2つの版だけ)。
影響する会社・しない会社
影響する: OpenBSD 7.9で、errata 018か026をまだ当てていない、または当てたあと再起動していない会社です。
影響する: OpenBSD 7.8で、errata 054か062をまだ当てていない会社です。
影響する: OpenBSD 7.7以前を使っている会社です。修正が出ないため、7.9へ上げる必要があります。
影響する: 委託先や機器の業者が、OpenBSDのファイアウォール・ルーター・踏み台を運用している会社です。業者に確かめます。
影響しない: 2つのerrataを当てて再起動したOpenBSDだけを使っている会社です。
影響しない: OpenBSDを使っていない会社です。今回のerrataはOpenBSDのものです。FreeBSDやそれをもとにした製品は、それぞれの告知を確かめます(FreeBSDに複数の脆弱性 修正版公開 TCP・サウンド・bhyve )。
情シスが今日やること
OpenBSDの機器を洗い出す。 ファイアウォール、ルーター、VPN、踏み台、DNSやメールの中継を、機器の台帳と委託先への問い合わせで拾います。
版と修正を確かめる。 uname -rで版を、syspatch -lで当てた修正を見ます。7.7以前なら、7.9へ上げる日程を決めます。
syspatchを当てて再起動する。 ファイアウォールやルーターは止められる時間を決め、予備の機器があれば先に当てて動きを見ます。
ログインできる人を見直す。 踏み台のアカウントに、退職者や契約の終わった委託先が残っていないかを確かめます。
次の修正に気づけるようにする。 syspatch -cをcronで回すか、OpenBSDのannounceのメーリングリストを読んで、新しいerrataを見落とさないようにします。
Linuxでも、一般の利用者からrootを取られる欠陥が続いています(Linuxの権限昇格「DirtyClone」、改ざんが見えにくい 5月以降のカーネル更新と再起動を確かめる )。カーネルの更新と再起動の手順を、OSごとに決めておくと迷いません。