macOSでVeraCryptを使ったあと、ボリュームをアンマウントしたはずなのに外付けSSDを取り外せず、そのままスリープさせると復帰時にカーネルパニックすることがありました。

最初は自分のMacで起きる不具合を直したかっただけです。 原因を追ってVeraCryptに修正プルリクを送ったところ、2026年9月25日にマージされました。 その後、同じ問題がCVE-2026-108982(CVSS v4.0: 7.2 / High) として公開され、プルリクがGitHub Security Advisoryにクレジットされました。

さらに、2026年10月24日に公開されたVeraCrypt 1.26.30に修正が収録されました。

8月頃にVeraCryptがカーネルパニックする的な記事を書きました が、 この記事では、カーネルパニックの調査から始まった修正が、なぜ暗号化ソフトウェアの脆弱性対応になったのかを振り返ります。

注意: CVEとして確認されているのは、dismount後も復号済みボリュームへアクセスできる問題です。カーネルパニックとの因果関係や、その再発防止まで公式に確認されたわけではありません。両者は分けて説明します。

発端:dismountしたのにSSDを取り外せない

検証に使った環境は、Apple M4搭載のMacBook Air、macOS 26.6.2、VeraCrypt 1.26.29のFUSE-T版、FUSE-T 1.2.7です。外付けSSD上の暗号化ボリュームを使っていました。

VeraCryptのGUIでdismountすると、ボリューム一覧からは消えます。しかしmacOS側ではデバイスが使用中のように扱われ、正常にejectできないことがありました。さらに、この状態からスリープ・復帰すると、次のようなログを伴うカーネルパニックが発生しました。

busy timeout[1], (60s): 'IOMediaBSDClient'

何かがデバイスを保持したままなのではないかと考え、ps、mount、hdiutil、lsofなどでdismount前後の状態を比較しました。

そこで見つかったのが、dismount後もVeraCryptの補助プロセスとFUSE-Tのgo-nfsv4が残っているという挙動です。

VeraCryptでボリュームをdismount
    ↓
GUI上ではボリュームが消える
    ↓
補助のSMBマウントとvolume.dmgは切り離される
    ↓
しかしVeraCryptのFUSEサービスとgo-nfsv4が生存
    ↓
raw deviceを保持し続ける場合がある

私が確認した環境では、残存した関連プロセスがなくなるとデバイスを取り外せるようになり、調査中に見られたスリープ復帰時のカーネルパニックも再現しなくなりました。ただし、これは観測上の関連であり、カーネルパニックの原因を完全に証明したものではありません。

FUSE-Tのサービスが残ることは、セキュリティ上も問題だった

VeraCryptのmacOS版にはmacFUSE版とFUSE-T版があります。今回の問題は 1.26.29のFUSE-T版 で確認されたもので、 公式アドバイザリ ではmacFUSE版は影響を受けないとされています。

FUSE-T版は内部で補助ファイルシステムを使い、go-nfsv4とループバックSMBを介して復号済みのvolume.dmgを扱います。ここでumountが成功しても、対応するFUSEサービスまで確実に終了するとは限らない状態になっていました。

問題は、VeraCryptがdismount済みと表示した後でも、残存サービスを通じて復号済みデータに再アクセスできることです。

実際、macOS標準のプレビューの「最近使った項目」から以前のファイルを開き直すと、パスフレーズの再入力なしに復号済みデータにアクセスできてしまいました。(これはissueやPR、公式アドバイザリでも周知の事実ですので、昨今話題の未公開の脆弱性を広める云々には該当しないと考えています)

これは私が最初に発見した問題ではありません。2026年6月16日に GitHub Issue #1779 で最初の公開報告があり、6月22日には SourceForgeでStephan Weisgerber氏による独立報告 がありました。 後者では、dismount後もgo-nfsv4などが残り、最近使ったファイルを開くとアクセスが復活する様子がプロセス一覧とともに記録されています。

私が取り組んだのは、この問題をコード上で修正し、修正前後の挙動を検証することでした。

PR #1866で実装した修正

調査を踏まえて、 Pull Request #1866 「macOS/FUSE-T: Terminate auxiliary FUSE service on dismount」を作成しました。

修正の基本方針は、単にumountを実行するのではなく、対象となるFUSEサービスに明示的にshutdownを要求し、終了を確認してから後片付けを進めるというものです。

Dismount開始
    ↓
対象サービスのPID・SerialInstanceNumber・SlotNumberを取得
    ↓
対象ボリュームに対応するサービスか照合
    ↓
補助FUSEファイルシステム経由でshutdown要求
    ↓
fuse_exit() / fuse_unmount()
    ↓
対応するサービスプロセスの終了を待機
    ↓
補助マウントポイントを削除

PIDだけで終了対象を決めるのではなく、シリアル番号とスロット番号も照合するようにしました。また、shutdown要求への応答が返る前にFUSEの通信路を閉じないよう、終了処理を別スレッドで実行する構成にしました。

PRでは、公式1.26.29と修正ビルドを同じコンテナ、同じFUSE-TのSMBバックエンドで比較しました。

確認項目VeraCrypt 1.26.29PR #1866の修正ビルド
GUIからのdismount完了と表示完了と表示
補助SMBマウント消える消える
volume.dmgdetachされるdetachされる
対象のVeraCrypt補助プロセス残存終了
対応するgo-nfsv4残存終了

特に重要だったのは、SMBバックエンドそのものを削除しなくても、サービスを適切に終了させれば問題のアクセス経路を閉じられたことです。これは後に公開されたSecurity Advisoryにも記載されています。

マージ後、さらに大規模なhardeningが行われた

PRは2026年8月31日に作成し、9月25日にmaintainerのMounir Idrassi氏によってマージされました。

レビューでは、SMBを有効にしたまま修正を検証した点が評価され、明示的なshutdownと終了待ちという方針が支持されました。

ただし、私の最初のパッチがそのまま完成形になったわけではありません。9月26〜29日にかけて、maintainerがサービス終了処理の競合状態、ファイルディスクリプタの引き継ぎ、mountやprocessの識別、異常終了時のcleanup、補助マウントディレクトリの保護などを追加でhardeningしました。

つまり、#1866でサービスを明示的に終了する仕組みを導入し、後続コミットで本番利用に向けた安全性と例外処理が大きく強化されたという経緯です。

CVE-2026-108982の公開とSecurity Advisory

この問題は10月12日にMITREからCVE-2026-108982として公開されました。分類は CWE-459(Incomplete Cleanup)、CVSS v4.0の基本スコアは 7.2(High) です。

10月14日には、maintainerによる GitHub Security Advisory(GHSA-f3px-f8h2-fm4c) が公開されました。

自分は最初の発見者ではありませんが、個人的に気になったことを試してissueに報告してプルリクを作ったらクレジットされました。

このCVEは NISTのNVD にも収録され、修正PR #1866が参照されています。個人の不具合調査から始まった変更が、脆弱性管理の仕組みを通じて広く追跡されることになりました。

そしてVeraCrypt 1.26.30で正式リリース

2026年10月24日、 VeraCrypt 1.26.30 が正式に公開されました。

リリースノート では、macOS向けのセキュリティ修正としてCVE-2026-108982とGHSA-f3px-f8h2-fm4cが明示されています。FUSE-Tのcleanupを修正し、補助マウントを保護するとともに、サービス終了を確認できない場合にはエラーを報告する内容です。

1.26.29から更新する場合の注意

ここはFUSE-T版を利用している方に重要です。

公式リリースノートは、1.26.29から更新する際、すべてのボリュームをdismountしてmacOSを再起動してから更新後のビルドを使用するよう案内しています。

アプリを1.26.30に上書きしても、1.26.29から既に生き残っている補助サービスが自動的に終了するわけではないためです。以前Issueで議論されていたpkill等による手動のprocess killも、対象を取りこぼしたり、使用中のサービスを誤って終了して書き込みを中断したりするおそれがあり、確実な回避策とはされていません。

なお、この記事の執筆時点(2026年10月29日)では、GitHub Security AdvisoryのPatched versions欄にまだNoneと表示されていますが、1.26.30への修正収録は公式リリースノートで明示されています。

振り返って

今回の経緯を一行にまとめると、こうなります。

  • 外付けSSDをejectできない/スリープ復帰でkernel panic
  • 残存するFUSE-Tサービスを調査
  • #1845 で同じような症状の方を発見、リプ送る
  • shutdown修正をPR #1866として実装・検証
  • 2026/09/25 upstream merge
  • maintainerによる追加hardening
  • 2026/10/12 CVE-2026-108982公開
  • 2026/10/14 GHSA公開・修正者としてcredit
  • 2026/10/24 VeraCrypt 1.26.30に修正収録

最初は自分のMacで起きた困りごとを直すための調査でした。それが、実際に暗号化ソフトウェアのセキュリティ問題を修正する仕事につながりました。

暗号化ソフトウェアの安全性は、AESのような暗号アルゴリズムだけで決まるわけではありません。今回のように、「dismountした」という操作に対応して、復号済みデータへのアクセス権とサービスの寿命を本当に終了できるかも重要です。

また、OSSでは発見者、分析者、修正実装者、maintainerがそれぞれ異なる役割を持ちます。自分はその中で修正の実装と検証を担当し、upstreamへのマージと正式リリースまで確認できました。個人的にも印象に残る経験でした。

参考リンク