Kestrel
대시보드로 돌아가기
CVE-2026-59715LOW· 3.1MITRENVDGHSA대응게시일: 2026. 07. 09.수정일: 2026. 07. 24.

Open WebUI: Unauthenticated WebSocket Access to Collaborative Document Handlers (ydoc:awareness:update, ydoc:document:leave)

Auth

위협 신호 · CVSS · EPSS · KEV

정기 패치· 높은 악용 신호 없음
CVSS
3.1low

이론적 심각도 점수

EPSS
0.2%상위 87.0%

30일 내 악용 확률 예측

KEV
미등재

실측 악용 기록 없음

권장 대응 기한60일 이내CISA SSVC 기준

계획된 패치 주기 내 조치(60일 이내)

외부 노출· KEV 미등재 · 자동화 어려움 · 부분 영향 · 외부 노출

CVSS 벡터 · 메트릭

악용 경로
공격 벡터네트워크
공격 복잡도높음
필요 권한낮음
사용자 상호작용불필요
범위불변
영향
기밀성 영향없음
무결성 영향낮음
가용성 영향없음
버전별 점수
CVSS 3.13.1LOW
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:N/I:L/A:N

상세 설명

Summary

The Socket.IO server is configured with always_connect=True (lines 78, 91 in backend/open_webui/socket/main.py) and the connect handler (line 329) never rejects unauthenticated connections. Two Ydoc event handlers have zero authentication checks, allowing unauthenticated clients to interact with collaborative document sessions.

Vulnerable Code

ydoc:awareness:update (line 741) — No auth check at all

bash
1@sio.on('ydoc:awareness:update')
2async def yjs_awareness_update(sid, data):
3 document_id = data['document_id']
4 user_id = data.get('user_id', sid)
5 update = data['update']
6 # No SESSION_POOL check, no room membership check
7 await sio.emit(
8 'ydoc:awareness:update',
9 {'document_id': document_id, 'user_id': user_id, 'update': update},
10 room=f'doc_{document_id}',
11 skip_sid=sid,
12 )

ydoc:document:leave (line 711) — No auth check at all

bash
1@sio.on('ydoc:document:leave')
2async def yjs_document_leave(sid, data):
3 document_id = data['document_id']
4 user_id = data.get('user_id', sid)
5 # No auth check
6 await YDOC_MANAGER.remove_user(document_id=document_id, user_id=sid)
7 await sio.emit('ydoc:user:left',
8 {'document_id': document_id, 'user_id': user_id},
9 room=f'doc_{document_id}')

Root Cause: always_connect=True (line 78)

bash
1sio = socketio.AsyncServer(
2 always_connect=True, # Never rejects connections
3 ...
4)

The connect handler (line 329) adds authenticated users to SESSION_POOL but never returns False or raises an exception for unauthenticated connections.

Exploitation

  1. An unauthenticated attacker connects via Socket.IO (no token needed)
  2. The attacker emits ydoc:awareness:update with:
    • document_id: a known/guessed note UUID (format: note:{uuid})
    • user_id: spoofed to impersonate any user
    • update: arbitrary awareness data (fake cursor positions, selections)
  3. The fake awareness data is broadcast to all legitimate users in the document room
  4. The attacker can also emit ydoc:document:leave with spoofed user_id to broadcast fake ydoc:user:left events

Impact

  • UI disruption: Fake cursor positions and user presence in collaborative editing sessions
  • User impersonation: Attacker can spoof any user_id in awareness updates
  • Resource exhaustion: Unlimited unauthenticated WebSocket connections maintained by the server

Note: Other Ydoc handlers (ydoc:document:join, ydoc:document:update, ydoc:document:state) correctly check SESSION_POOL membership.

Suggested Fix

  1. Set always_connect=False or reject unauthenticated connections in the connect handler
  2. Add SESSION_POOL checks to ydoc:awareness:update and ydoc:document:leave
  3. Add room membership verification before broadcasting to document rooms

AI Disclosure (per Rule 11): AI (Claude) was used to assist with source code review, identifying potential vulnerability patterns, and drafting this report. The researcher directed the analysis, selected focus areas, and independently verified all findings against a running v0.8.12 Docker instance using real HTTP requests with two test accounts. The PoCs included are reproducible and were confirmed live before submission.

AI 심층 분석

공격 시나리오 · 재현 가능한 PoC 페이로드 · 즉시 적용 가능한 차단 패치를 한 번에 받아 보세요. 보안 운영팀이 그대로 점검·티켓팅에 쓸 수 있는 형태로 정리해 드립니다.