[Open WebUI] 사용자 메모리 컬렉션 쿼리에 소유권 검증 추가
PR 링크: open-webui/open-webui#22109 상태: Merged | 변경: +31 / -21
들어가며
Open WebUI의 RAG(Retrieval-Augmented Generation) 엔드포인트에서 인증된 사용자가 다른 사용자의 메모리 컬렉션을 쿼리할 수 있는 보안 취약점이 있었습니다. /query/collection 엔드포인트에는 소유권 검증이 있었지만, /query/doc 엔드포인트에는 이 검증이 누락되어 있었습니다. 이 PR은 두 엔드포인트의 검증 로직을 공통 함수로 추출하여 일관된 보안을 보장합니다.
핵심 코드 분석
공통 검증 함수 추출
def _validate_collection_access(collection_names: list[str], user) -> None:
"""
Prevent users from querying collections they don't own.
Enforces ownership on user-memory-* and file-* collections.
Admins bypass this check.
"""
if user.role == "admin":
return
for name in collection_names:
if name.startswith("user-memory-") and name != f"user-memory-{user.id}":
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN,
detail=ERROR_MESSAGES.ACCESS_PROHIBITED,
)
elif name.startswith("file-"):
file_id = name[len("file-"):]
if not has_access_to_file(file_id=file_id, access_type="read", user=user):
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN,
detail=ERROR_MESSAGES.ACCESS_PROHIBITED,
)
두 엔드포인트에서 공통 함수 사용
# /query/doc 엔드포인트 - 기존에는 검증이 없었음
async def query_doc_handler(...):
_validate_collection_access([form_data.collection_name], user)
# ...
# /query/collection 엔드포인트 - 기존 인라인 코드를 공통 함수로 대체
async def query_collection_handler(...):
_validate_collection_access(form_data.collection_names, user)
# ...
왜 이게 좋은가
- 보안 취약점 해결:
/query/doc엔드포인트에서 다른 사용자의user-memory-*컬렉션에 접근하는 것을 차단합니다. - 코드 중복 제거: 동일한 검증 로직이 한 곳에서 관리되어 일관성이 보장됩니다. 향후 새 컬렉션 타입이 추가되어도 한 곳만 수정하면 됩니다.
- Admin 바이패스 명확화: admin 권한에 대한 조기 반환이 함수 시작 부분에서 명확하게 처리됩니다.
보안 수정과 코드 리팩토링을 동시에 달성한 PR입니다. 검증 로직의 중앙화는 보안 취약점이 누락될 가능성을 줄이는 중요한 패턴입니다.
참고 자료
관련 포스트
PR Analysis 의 다른글
- 이전글 [Open WebUI] buildMessages에서 불필요한 객체 스프레드 제거
- 현재글 : [Open WebUI] 사용자 메모리 컬렉션 쿼리에 소유권 검증 추가
- 다음글 [Open WebUI] Chat.svelte 비동기 onMount 메모리 누수 수정
댓글