🔍 CVE-2026-104189

7.5
CVSS Score
HIGH
2026-10-27
2026-11-02 20:17
✅ 완료

🇰🇷 한글 설명

Nextcloud 3D Viewer 앱(1.7.9~3.3.1)의 공개 파일 엔드포인트가 공유 권한 검증을 수행하지 않아, 공유 토큰만 알면 비밀번호로 보호된 링크 공유의 3D 모델 파일 내용을 읽을 수 있습니다. 이 문제는 3.3.2 버전에서 수정되었습니다.

💡 쉬운 설명

비밀번호로 보호된 공유 링크라도 링크 주소(토큰)만 알면 3D 모델 파일의 내용을 볼 수 있는 문제입니다. 앱을 최신 버전(3.3.2 이상)으로 업데이트하거나 임시로 앱을 비활성화해야 합니다.

🇺🇸 원문 (English)

The 3D Viewer for Nextcloud is a comprehensive 3D model viewer application for Nextcloud that supports multiple 3D file formats. In versions 1.7.9 through 3.3.1, the app's public file endpoint performed no share authorization. Anyone who knows a share token could read the shared file's contents even when the link share was protected by a password. `PublicFileController` extended `OCP\AppFramework\Controller` and marked its routes `#[PublicPage]`. Nextcloud only enforces share passwords through `PublicShareMiddleware`, which returns early for any controller that is not an `OCP\AppFramework\PublicShareController` instance — so no password, expiry, or share-type check ran for these routes. `ShareFileService::loadLinkShare()` compounded this by treating any token that `getShareByToken()` matched as authorised. A share token is the part of the URL that people paste into chats, emails, and tickets. Password protection exists precisely for the case where holding the token should not by itself grant access, and that guarantee did not hold. Requests to `GET /ocs/v2.php/apps/threedviewer/public/file/{token}/{fileId}` returned `200` with the full file body for password-protected shares, with no password and no session. Nextcloud's own share page correctly redirected such requests to the password prompt. Scope is limited to files in the formats this app handles (STL, GLB/glTF, OBJ, STEP, IFC, and the other supported 3D types). Non-3D files in the same share are unaffected. Expired shares returned `500` rather than leaking contents. This issue is fixed in 3.3.2. `PublicFileController` now extends `PublicShareController` and implements `isValidToken()`, `isPasswordProtected()`, and `getPasswordHash()`, delegating password and token validation to the framework and gaining brute-force throttling. `ShareFileService::findValidLinkShare()` additionally rejects share types other than link and email, rejects expired shares, and treats a `ShareNotFound` from the share manager as "no share" instead of letting it surface as a 500. As a workaround, disable the 3D Viewer app (`occ app:disable threedviewer`), or avoid relying on passwords to protect link shares that contain 3D model files, until you can upgrade.

📍 영향받는 시스템

Nextcloud 3D Viewer 앱 1.7.9 ~ 3.3.1 버전 (3.3.2 이상에서 수정)

⚔️ 공격 벡터

공유 토큰을 알고 있는 공격자가 /ocs/v2.php/apps/threedviewer/public/file/{token}/{fileId} 엔드포인트에 직접 요청하여 비밀번호 없이 STL, GLB, OBJ, STEP, IFC 등 3D 파일을 다운로드합니다.

🛡️ 대응 방법

3D Viewer 앱을 3.3.2 이상으로 업그레이드하고, 업그레이드 전까지는 occ app:disable threedviewer 명령으로 앱을 비활성화합니다.

🔧 검증 코드

출력된 버전이 1.7.9 이상 3.3.1 이하이면 취약하므로 3.3.2 이상으로 업그레이드가 필요하며, 앱이 설치되어 있지 않으면 출력이 없습니다.

Shell / Script
grep -rh '"version"' /var/www/nextcloud/apps/threedviewer/appinfo/info.xml 2>/dev/null || grep -o '<version>[^<]*</version>' /var/www/nextcloud/apps/threedviewer/appinfo/info.xml 2>/dev/null

📊 CVSS Vector String

CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N