CVE-2025-68492は、対話型AIアプリを作るPythonのフレームワークChainlitで、ログインできるユーザーが他人の会話スレッドを閲覧したり、所有権を奪ったりできてしまう認可の不備です。2.8.5で修正され、JVNは2026年1月にJVN#34964581として公表しました。その後もChainlitではセッションの乗っ取りやMCP経由のコマンド実行といったCriticalの脆弱性が続き、2026年10月15日にはGitHubのリポジトリがアーカイブされました。最終版の2.12.0には修正版の無い脆弱性が3件残り、今後も修正は出ません。この記事では、CVE-2025-68492の仕組みと影響の判断、後続の脆弱性の時系列、導入版と設定の確認方法、修正の出ない3件の緩和策を、2026年11月11日時点の公式アドバイザリと2.12.0のソースコードに基づいて整理します。
まとめ:2.12.0への更新と未修正CVE3件の緩和策
CVE-2025-68492そのものは、2025年11月7日公開の2.8.5で直っています。攻撃には、そのアプリに登録済みのユーザーであることと、狙うスレッドのIDを知っていることの両方が必要で、開発元も「低深刻度」と説明しています。
ただし2.8.5以降にも後続の問題があり、2.10.1未満にはCriticalのセッション乗っ取り(CVE-2026-56104)が、2.11.1以前にはMCPを有効にしている環境でのコマンド実行(CVE-2026-45018)が残っています。2.12.0未満なら、まず2.12.0へ上げてください(MCPを使っている場合は旧形式の設定を先に移行します)。
2.12.0でも終わりではありません。細工したセッションIDでサーバー上のディレクトリを削除させられるCVE-2026-86099(High)、他人のフィードバックを書き換えられるCVE-2026-82290、利用者が登録するMCPサーバーのURL制限を回避されるCVE-2026-120492の3件に修正版が無く、リポジトリのアーカイブにより今後も出ません。ログインを必須にし、Chainlitを書き込み権限の狭い専用ユーザーで動かし、MCPの利用者登録を無効にして被害の範囲を絞ってください。社外に公開しているアプリは、移行の計画まで立てるべきです。
CVE-2025-68492の影響版・修正版の基本情報と公表までの経緯
Chainlitは、LLMを使ったチャットアプリの画面と会話の履歴管理を、Pythonのコードだけで用意できるオープンソースのフレームワークです。使い方や最終版の機能はChainlitの使い方とアーカイブ後の注意点でまとめています。
JVN#34964581・NVDに登録されたCVSSと弱点の分類
| 項目 | 内容 |
|---|---|
| CVE | CVE-2025-68492 |
| JVN | JVN#34964581 |
| 影響版 | 2.8.5より前 |
| 修正版 | 2.8.5(2025-11-07) |
| NVD公開日 | 2026-01-14 |
| CVSS v3.0 | 4.2(中) |
| CVSS v4.0 | 2.3(低) |
| 弱点の分類 | CWE-639 |
評価はいずれもCNAのJPCERT/CCによるもので、JVN#34964581とNVDの登録情報で確認できます。v3.0のベクトル AV:N/AC:H/PR:L/UI:N/S:U/C:L/I:L/A:N は、ログイン権限(PR:L)が必要で、スレッドIDを知る必要があるため攻撃条件が厳しい(AC:H)という評価です。修正版の公開から公表まで約2か月空いており、2.8.5以降を使っていた利用者は公表前に対処済みでした。
CWE-639「利用者が操作できる鍵による認可の迂回」の意味
CWE-639は、利用者が指定できる値(ここではスレッドID)をもとにデータを取り出す際に、「その利用者が持ち主か」を確かめないことで起きる欠陥の分類です。Web APIでは「IDOR(安全でない直接オブジェクト参照)」とも呼ばれます。IDを推測しにくくしても、確認の抜けそのものは解消しません。
WebSocketの再接続処理で持ち主の確認が抜けていた仕組み
Chainlitは、ブラウザとサーバーの間の会話をWebSocketでやり取りし、ページを開き直したときは以前のスレッドを再開できます。この再開の処理に欠陥がありました。
修正コミット8f1153dでsocket.pyに追加された認可チェック
GitHubのアドバイザリGHSA-v492-6xx2-p57gが参照する修正(PR #2637「security: add missed authorization check」)は、WebSocketの接続を扱う backend/chainlit/socket.py を変更しています。PRの題名どおり、抜けていた認可チェックを足した修正です。修正前は、接続時に渡されたスレッドIDのスレッドを、接続してきたユーザーが持ち主かを確かめずに再開できました。
その結果、ログイン済みの攻撃者が他人のスレッドIDを指定すると、そのスレッドの会話を読めるうえ、スレッドの所有権まで取得できる状態でした。NVDの説明も「スレッドを閲覧される、またはスレッドの所有権を取得される」としています。所有権が移る具体的な手順は、公式には説明されていません。
スレッドIDを知る登録ユーザーという攻撃の前提条件と公開範囲の判断
2.8.5のリリースノートは、攻撃者に「スレッドIDを知っていること」と「そのChainlitアプリに登録済みのユーザーであること」が必要だとして、低深刻度と説明しています。誰でも自由に登録できる公開アプリでは2つ目の条件は無いに等しく、スレッドIDがURLや共有リンク、ログに残る運用では1つ目も満たされます。
社内の数人だけが使うアプリなら危険は小さく、不特定多数が登録できるサービスで、相談内容や個人情報を会話で扱っているなら危険は大きい、と構成で判断が分かれます。
データ永続化・認証・会話再開の設定による影響の確認
Chainlitの公式ドキュメント(Chat History)は、会話の履歴を使うには「データの永続化と認証の両方の設定が必要」とし、保存された会話を利用者が続けられるようにするには cl.on_chat_resume を使うと説明しています。CVE-2025-68492が狙うのは、この「保存されたスレッドの再開」です。データ層を設定していない、または認証を使っていないアプリでは、そもそも他人のスレッドを開き直す経路がありません。
自社のアプリが該当するかは、次のように該当の設定やコードがあるかで当たりを付けられます。
# 会話の再開・データ層・認証の実装があるかを探す(アプリのディレクトリで実行)
grep -rn "on_chat_resume\|data_layer\|SQLAlchemyDataLayer\|password_auth_callback\|oauth_callback\|header_auth_callback" --include='*.py' .
何も見つからなくても、この検索だけでは影響を否定できません。検索の正常終了を確認したうえで、外部モジュールの読み込み、環境変数によるデータ層の設定、実行中アプリの認証・会話再開機能を確認してください。なお、後続のCVE-2026-56104(セッションの乗っ取り)とCVE-2026-86099(ディレクトリの削除)はセッションの扱いの問題で、会話の保存の有無に関係しません。
LLMアプリの会話に残る情報と他人に読まれたときの影響の大きさ
CVSSの点数が低くても、読まれる中身次第で影響は変わります。Chainlitで作られるのは、社内文書を検索して答えるRAGのチャットや、顧客対応の補助、相談窓口のボットといったアプリです。会話には、利用者が貼り付けた契約書や設計資料の一部、問い合わせの本文、氏名や連絡先が残ります。RAGの回答には、検索された社内文書の抜粋がそのまま含まれることもあります。
こうした会話が他人に読まれれば、個人情報の漏えいとして報告が必要になる場合があります。さらに所有権まで移ると、正規の利用者が自分の会話を開けなくなり、攻撃者がその文脈を使って追加の質問を投げられます。社外の利用者が登録できるアプリや、個人情報を扱う窓口のアプリでは、点数の低さを理由に更新を後回しにしないでください。LangChainなどでRAGを組む場合の全体像はLangChainの仕組みと採用判断で整理しています。
2.8.5の後に続いたChainlitの脆弱性と2026年11月時点の修正状況
CVE-2025-68492の修正後も、Chainlitには重い脆弱性が続きました。GitHub Advisory Databaseに登録されたものを並べます。
2026年1月から11月までに公表されたCVE9件の時系列と修正版
| 公表日 | CVE | 内容と修正版 |
|---|---|---|
| 2026-01-14 | CVE-2025-68492 | スレッドの閲覧・乗っ取り→2.8.5 |
| 2026-01-20 | CVE-2026-22218 | 任意ファイルの読み取り→2.9.4 |
| 2026-01-20 | CVE-2026-22219 | SSRF(High)→2.9.4 |
| 2026-06-22 | CVE-2026-56104 | セッション乗っ取り→2.10.1 |
| 2026-08-25 | CVE-2026-45018 | MCP経由のコマンド実行→2.12.0 |
| 2026-08-25 | CVE-2026-45019 | MCP経由のSSRF→2.12.0 |
| 2026-08-28 | CVE-2026-82290 | フィードバックの改ざん→修正版なし |
| 2026-09-09 | CVE-2026-86099 | ディレクトリの削除(High)→修正版なし |
| 2026-11-02 | CVE-2026-120492 | MCPのURL制限の回避→修正版なし |
日付はGitHub Advisory Databaseの公開日(UTC)です。同じ日に公表された2件のうち、CVE-2026-22218は、ログイン済みのクライアントが /project/element の更新でファイルのパスを指定し、Chainlitのプロセスが読めるファイルを取り出せた問題です。発見したZafranの報告を伝えたCSO Onlineの記事によると、Linuxの /proc/self/environ から環境変数に置いたAPIキーや CHAINLIT_AUTH_SECRET を読み出せるため、LLMのAPIキーや認証トークンの署名鍵まで漏れます。CVE-2026-22219は、SQLAlchemyのデータ層を使う構成で、ログイン済みのユーザーがサーバーから内部ネットワークへ任意のHTTP要求を送らせられる問題でした。2.9.4未満を使っていた環境では、更新に加えて環境変数に置いた鍵の入れ替えまで行ってください。
9件とも、2026年11月9日版のCISA KEV(悪用が確認された脆弱性の一覧)には載っていません。ただし未掲載は、悪用されていないことの証明にはなりません。
Criticalのセッション乗っ取りとMCP経由のコマンド実行の前提
CVE-2026-56104は、WebSocketのセッション復元で、有効なセッションIDを示しただけで持ち主の確認なしに他人のセッションを引き継げた問題です。GitHubのアドバイザリは未認証の攻撃者でも成立するとし、被害者の権限でツールを呼び出せると説明しています。CVE-2025-68492と同じく「持ち主の確認の抜け」で、場所がスレッドからセッションに移った形です。
CVE-2026-45018は、MCP(AIと外部ツールをつなぐ規格)の機能を有効にしている場合に、/mcp へ送ったコマンドの引数が検査されず、認証を設定していない構成では、未認証の攻撃者がサーバー上の任意のコマンドを実行できた問題です。認証を設定した構成でも、認証済みユーザーによる悪用は防げません。アドバイザリは、MCPが2.7.0から既定で無効になっており、多くの環境は対象外だと明記しています。MCPの仕組みはMCPとは(AIと外部ツールをつなぐ標準規格)で解説しています。
2026年10月15日のアーカイブで修正版が出なくなった未修正CVE3件
GitHubのChainlitのリポジトリは、2026年10月15日に所有者によってアーカイブされ、読み取り専用になりました。公式ドキュメントのProject statusは「We no longer provide active maintenance, bug fixes, security updates, or support.」と告知し、使い続けるなら脆弱性の評価や依存ライブラリの更新を利用者側で手配する必要があるとしています。PyPIの最新版は2026年11月11日時点でも2.12.0のままです。
CVE-2026-86099:sessionIdを使ったディレクトリの削除
CVE-2026-86099(CVSS v3.1 8.2・CWE-22)は、アドバイザリの説明が「2.12.0まで」を対象とし、修正版の欄は空です。2.12.0の socket.py は、接続時にクライアントが送る sessionId をそのままセッションのIDに使い、session.py はアップロード用の作業場所を .files/<セッションID> として組み立て、切断後のセッション削除で shutil.rmtree にかけます。IDに ../../ や絶対パスを入れると、この削除が .files の外を向きます。Chainlitのプロセスが書き込めるディレクトリは、アプリのコードやデータでも消される可能性があります。
ソースを読む限り、ログインを必須にしたアプリでは、認証に失敗した接続は sessionId を使う前に拒否されます。未認証で成立するのはログインの無いアプリで、ログイン必須のアプリでも登録済みのユーザーなら同じ操作ができます。sessionId を英数字・ハイフン・アンダースコアの128文字以内に限る修正はPR #3075「fix: validate socket session id」として2026年10月9日に出されましたが、マージされないままアーカイブされました。
CVE-2026-82290:他人のフィードバックの書き換えと削除
CVE-2026-82290(CVSS v3.1 5.3・CWE-639)は、フィードバック(回答への評価)を更新・削除する PUT・DELETE /feedback が、そのフィードバックの持ち主かを確かめない問題です。CVE-2025-68492と同じ分類で、対象がスレッドからフィードバックに移っています。ログイン済みのユーザーが他人の評価を書き換えたり消したりでき、評価をモデルの改善に使っている場合はそのデータが汚れます。報告のissue #2975は、修正のコミットが付かないまま2026年7月25日にボットが「not planned(対応予定なし)」としてクローズされました。クローズは修正済みを意味せず、2.12.0のソースでも /feedback の更新・削除に持ち主の確認はありません。
CVE-2026-120492:利用者が登録するMCPサーバーのURL制限の回避
CVE-2026-120492(CVSS v3.1 5.4)は、2.12.0で加わった「利用者が自分のMCPサーバーをつなぐ機能」([features.mcp.user_servers])のSSRFです。管理者は allowed_urls で接続先を許可しますが、URLを検査する validate_mcp_url がセミコロンを拒否しないため、..; を含むURLを /mcp へ送ると、パス単位で許可した範囲の外へリクエストさせられます。成立するのは、パスの中のセミコロン以降を取り除いて解釈する接続先だけです。
2.12.0の config.py では user_servers の enabled は既定で false、allowed_urls は空(全拒否)です。/mcp の処理は、ログイン必須のアプリでは認証済みのユーザーしか通さないため、未認証で成立するのはログインの無いアプリです。
Chainlitの導入版とMCPの設定を確かめて2.12.0へ更新する手順
更新前に、導入版、MCPの有効設定、旧MCP設定の移行、データベースのスキーマ変更を確認します。2.12.0では、MCP有効時に旧形式の設定が残っていると起動に失敗します。旧設定の [features.mcp.sse]・[features.mcp.stdio]・[features.mcp.streamable-http] や allowed_executables を、新形式の [[features.mcp.servers]] へ移行してください。移行の手順はCVE-2026-45018のアドバイザリが案内するCHANGELOGにあります。
pip showとconfig.tomlの確認コマンドと更新
# 導入版の確認(仮想環境を使っている場合は有効化してから)
python -m pip show chainlit
# MCP と、利用者によるMCPサーバー登録を有効にしているか(この確認コマンドはPython 3.11以降が必要)
python -c 'import pathlib,tomllib; m=tomllib.loads(pathlib.Path(".chainlit/config.toml").read_text(encoding="utf-8")).get("features", {}).get("mcp", {}); print("mcp:", m.get("enabled", "未指定"), "/ user_servers:", m.get("user_servers", {}).get("enabled", "未指定"))'
# 最終版の 2.12.0 へ更新(これより新しい版は出ない)
python -m pip install --upgrade "chainlit==2.12.0"
pip show の Version が2.12.0未満なら更新します。PyPIで配布されている2.12.0の既定値は、MCP・user_servers とも enabled = false です。MCPが true で、しかも2.12.0未満なら、最も急いで更新すべき状態です。「未指定」と出ても無効とは言い切れないため、起動時に設定を変えていないかも確かめてください。2.12.0はPython 3.10以上3.14未満を要求します。
導入版とMCP設定から確認候補のCVEを洗い出すPythonスクリプト
アプリのディレクトリで実行すると、導入されているChainlitの版と、.chainlit/config.toml のMCP設定を読み、上の9件のうち確認すべきものを表示します。版の比較で候補を絞る簡易判定で、データ層や認証の有無といった成立条件までは見ません。コールバックやChat Profileでの設定の上書きも読まないため、MCPの判定は config.toml の記載だけに基づきます。外部パッケージは使わず、Python 3.11以降で動きます。
# Chainlit の導入版と config.toml の MCP 設定から、2026年11月11日時点の既知CVEの確認候補を表示する(Python 3.11 以降)
import re
import tomllib
from importlib.metadata import PackageNotFoundError, version
from pathlib import Path
CHECKED = "2026-11-11"
LAST_RELEASE = (2, 12, 0) # 2026-10-15 のアーカイブ時点の最終版
KNOWN = [ # (影響が始まる版, 修正版 ※None は修正版なし, CVE, 内容, 成立に必要な設定)
(None, "2.8.5", "CVE-2025-68492", "他人のスレッドの閲覧・乗っ取り", None),
(None, "2.9.4", "CVE-2026-22218", "任意ファイルの読み取り", None),
(None, "2.9.4", "CVE-2026-22219", "SSRF", None),
(None, "2.10.1", "CVE-2026-56104", "セッションの乗っ取り(Critical)", None),
("2.4.0", "2.12.0", "CVE-2026-45018", "MCP stdio 経由のコマンド実行(Critical)", "mcp"),
("2.4.0", "2.12.0", "CVE-2026-45019", "MCP 経由のSSRF", "mcp"),
(None, None, "CVE-2026-82290", "他人のフィードバックの書き換え・削除", None),
(None, None, "CVE-2026-86099", "sessionId 経由のディレクトリ削除(High)", None),
("2.12.0", None, "CVE-2026-120492", "利用者が登録するMCPサーバーのURL制限の回避(SSRF)", "user_servers"),
]
def as_tuple(v: str) -> tuple:
if not re.fullmatch(r"\d+\.\d+\.\d+", v):
raise SystemExit(f"この簡易判定では扱えない版表記: {v}(公式アドバイザリで確認する)")
return tuple(int(x) for x in v.split("."))
def flag(table: dict, key: str):
value = table.get(key)
return value if isinstance(value, bool) else None # None = 判断できない
try:
installed = as_tuple(version("chainlit"))
except PackageNotFoundError:
raise SystemExit("chainlit はこの Python 環境に入っていない")
config = Path(".chainlit/config.toml")
mcp_cfg = {}
if config.exists():
mcp_cfg = tomllib.loads(config.read_text(encoding="utf-8")).get("features", {}).get("mcp", {})
mcp = flag(mcp_cfg, "enabled") if config.exists() else None
user_servers = False if mcp is False else (flag(mcp_cfg.get("user_servers", {}), "enabled") if mcp else None)
settings = {"mcp": mcp, "user_servers": user_servers}
print(f"chainlit {'.'.join(map(str, installed))} / MCP enabled: {mcp} / user_servers enabled: {user_servers}({CHECKED} 時点の情報で判定)")
for introduced, fixed, cve, desc, need in KNOWN:
if introduced and installed < as_tuple(introduced):
continue
if fixed and installed >= as_tuple(fixed):
continue
if need and settings[need] is False:
continue
note = "(config.toml から設定を判断できないため要確認)" if need and settings[need] is None else ""
if fixed:
print(f" 確認候補: {cve} {desc} → 修正版は {fixed}{note}")
elif installed <= LAST_RELEASE:
print(f" 修正版なし: {cve} {desc} → 緩和策で被害範囲を絞る{note}")
else:
print(f" 要確認: {cve} {desc} → 2.12.0 より後の版。修正が入っているかを差分で確認{note}")
2026年11月11日に、版と設定の組み合わせを変えて実行しました。MCPを有効にした設定では、2.8.4なら修正版のある6件と修正版なしの2件、2.11.1ならMCP関連の2件と修正版なしの2件が表示されます。2.12.0で user_servers まで有効なら修正版なしの3件、MCPが無効なら2件です。CVE-2026-120492は user_servers を持つ2.12.0だけが対象なので、2.12.0未満では表示しません。2.12.0より新しい版(自社で作ったフォークなど)では、修正版なしの件を「要確認」として表示し、2.12.1+local のような版表記は比較せずに止まります。
2.9.4をまたぐ更新でSQLのデータ層に必要な列の追加と実行前の確認
2.8系から2.12.0へ上げる途中には、データベースの変更が要る版があります。公式の2.9.4への移行ガイドによると、2.9.4でメッセージごとの「Modes」を保存する modes 列が追加されました。SQLAlchemyや独自SQLのデータ層、公式データ層を使っている場合は、更新前に次の列を足します。DynamoDBは不要です。
-- SQLAlchemy/独自SQLのデータ層
ALTER TABLE steps ADD COLUMN IF NOT EXISTS "modes" JSONB;
-- 公式データ層(Prisma スキーマは未更新のため手動で実行)
ALTER TABLE "Step" ADD COLUMN IF NOT EXISTS "modes" JSONB;
列を足さずに更新すると、会話の保存で失敗する恐れがあります。本番のデータベースはバックアップを取ってから実行し、検証環境で会話の保存と再開を確かめてから切り替えてください。
修正版の出ない3件の被害範囲を絞る構成
修正版を待つ選択肢はもうありません。削除される範囲、攻撃できる人、外へ出せる通信を構成で絞ります。
- Chainlitを専用のOSユーザーで動かし、書き込めるのを
.filesなどの作業ディレクトリだけにする(アプリのコードは読み取り専用にする)。コンテナならルートファイルシステムを読み取り専用にし、書き込み先をボリュームに限る(CVE-2026-86099) - ログインを必須にして、未認証の接続を
sessionIdや/mcpの処理より前で拒否させる(CVE-2026-86099・120492) - MCPを使わないなら
[features.mcp]のenabled = falseのままにし、使う場合も[features.mcp.user_servers]は無効にする。利用者の登録をどうしても許すなら、allowed_urlsにはMCP専用のホストだけを書き、同じホストの別パスに社内APIを置かない(CVE-2026-120492) - フィードバックを評価データとして使うなら、リバースプロキシで
/feedbackへのPUT・DELETEを止める(CVE-2026-82290)。評価の変更履歴は、不正な変更の検知・復旧に備えてデータ層に残す - データベースとアップロードファイルのバックアップを、Chainlitのプロセスから書き込めない場所に取る
コードで直したい場合は、PR #3075の差分(sessionId の形式を検査して不正な値の接続を拒否する変更)を自社のフォークに取り込み、社内向けのパッケージとして配布する方法があります。Apache 2.0ライセンスなので改変と社内配布は可能ですが、以後の脆弱性の評価と依存ライブラリの更新はすべて自社の仕事になります。
アーカイブ後のChainlitで作ったAIアプリを公開し続けるときの設計判断
不特定多数が登録できる形でChainlitのアプリを公開しているなら、移行の計画を立てるべきです。スレッド、セッション、フィードバックと、「持ち主の確認の抜け」がフレームワークの別々の場所で繰り返し見つかってきたうえ、アーカイブ後は、公式チームによるセキュリティ更新を受けられません。2.12.0はFastAPIやStarletteなどの依存を下限だけ指定して取り込むため、依存側の脆弱性への追随も利用者の仕事です。
社内の数人で使う試作アプリなら、前段に認証プロキシを置いて利用者を絞り、依存の版をすべて固定し、上の構成で被害範囲を狭めたうえで期限を決めて使い続ける判断もあり得ます。ただし2.12.0への更新・MCPの無効化・ログイン必須化だけでは、登録ユーザーによるディレクトリ削除は防げません。プロセスの書き込み権限の制限と、復旧用バックアップは必ず用意してください。移行先の選び方や、LLM呼び出し部分を再利用する移行の手順はChainlitのアーカイブ後に使い続けるか移行するかの判断で扱っています。プロンプトを経由した攻撃への備えはプロンプトインジェクションの仕組みと対策、公開前の診断の考え方はOWASP ZAPの診断項目が参考になります。
LLMアプリ特有の攻撃面まで含めて第三者に確かめたい場合は、一創のAIセキュリティ対策で、Chainlitなどで構築したAIアプリの認可設計と公開構成を点検しています。
よくある質問
ChainlitとCVE-2025-68492について寄せられやすい質問に答えます。
Chainlit 2.8.5以上なら安全ですか?
CVE-2025-68492については2.8.5で直っています。ただし2.12.0未満には、後続のセッション乗っ取りや、MCP有効時のコマンド実行が残っています。さらに最終版の2.12.0にも、修正版の無いCVE-2026-86099・82290・120492があります。2.12.0へ上げたうえで、ログイン必須と書き込み権限の制限、MCPの利用者登録の無効化で抑えてください。
Chainlitの脆弱性は今後修正されますか?
公式には修正されません。リポジトリは2026年10月15日にアーカイブされ、公式ドキュメントは保守・バグ修正・セキュリティ更新を行わないと告知しています。CVE-2026-86099の修正案だったPR #3075も未マージのままです。修正が必要なら、自社のフォークで差分を当てるか、別の仕組みへ移ることになります。
ログイン機能を使っていないChainlitアプリも影響を受けますか?
CVE-2025-68492は「ログインできるユーザー」による攻撃なので、認証を使わない構成ではそもそも持ち主の区別がありません。公式のChat Historyは、データ永続化と認証の両方を有効化する必要があります。一方、後続のCVE-2026-56104やCVE-2026-45018は認証なしでも成立し、未修正のCVE-2026-86099と120492はログインの無いアプリで未認証の攻撃者に使われます。インターネットに公開するなら、ログインを必須にしてください。
スレッドIDは推測しにくい値なのに、本当に危険ですか?
推測しにくくても、共有リンクやブラウザの履歴、サーバーのログ、画面の共有などから漏れることがあります。IDを知られた時点で持ち主の確認が無いと防げないのが、CWE-639という分類の要点です。公開範囲が広く、会話に機密や個人情報を含むアプリほど影響が大きくなります。
すでに他人のスレッドを読まれたか確認する方法はありますか?
この攻撃による閲覧の有無を調べる際は、保存している認証・接続ログとデータ層の変更履歴を突き合わせます。データ層にスレッドの持ち主と更新日時が残る構成なら、持ち主が想定外のユーザーに変わったスレッドがないかを確かめるのが手がかりになります。前段のプロキシやWebSocketの接続ログがあれば、短時間に多数のスレッドを再開した接続を探します。