🇰🇷 한글 설명
ZTNET은 다중 사용자 및 조직 지원을 제공하는 ZeroTier 웹 UI입니다. 0.8.0 이전 버전에서는 인증된 저권한 사용자가 POST /api/auth/user/invalidateUser 엔드포인트를 통해 관리자를 포함한 다른 계정을 영구적으로 비활성화할 수 있습니다. 세션 존재 여부만 확인하고 세션 사용자 ID와 요청의 userId를 비교하지 않기 때문에 발생하는 취약점입니다.
💡 쉬운 설명
일반 사용자 계정을 가진 누구나 다른 사용자, 심지어 관리자의 계정까지 잠글 수 있습니다. 잠긴 계정은 로그인이 거부되어 조직 관리가 방해받습니다.
🇺🇸 원문 (English)
ZTNET is a ZeroTier web UI for private controllers with multiuser and organization support. Prior to 0.8.0, any authenticated low-privilege user can permanently deactivate another account, including an administrator, through `POST /api/auth/user/invalidateUser`. In `src/pages/api/auth/user/invalidateUser.ts`, `getServerSession` checks only that a session exists and does not compare `session.user.id` with the client-supplied `userId`. Supplying a victim's `userId` and a `deviceId` for which no matching pair exists in `UserDevice` makes the handler set the target account's `isActive` to false. Login is then refused by `src/server/auth.ts` with `account-expired`. An attacker needs only a normal authenticated account and the victim's user ID, which may be obtainable from member lists, UI responses, logs, or other application metadata. This can lock administrators out, disrupt organization management, and deny access to any targeted user. This issue is fixed in version 0.8.0.
📍 영향받는 시스템
ZTNET 0.8.0 미만 버전
⚔️ 공격 벡터
일반 인증 계정으로 대상 사용자 ID를 넣고 존재하지 않는 deviceId와 함께 invalidateUser 엔드포인트에 POST 요청을 보내 대상 계정을 비활성화
🛡️ 대응 방법
ZTNET을 0.8.0 이상으로 업그레이드하고 즉시 적용이 어려우면 해당 엔드포인트 접근을 제한
🔧 검증 코드
출력된 version 값이 0.8.0 미만이면 취약하고 0.8.0 이상이면 패치된 버전입니다. 아무 결과도 없으면 설치 경로를 직접 확인해야 합니다.
docker exec ztnet cat /app/package.json 2>/dev/null | grep '"version"' || cat package.json 2>/dev/null | grep '"version"'
📊 CVSS Vector String
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:H
💻 영향받는 소프트웨어
Cisco Integrated Management Controller