🔍 CVE-2026-33318

8.8
CVSS Score
HIGH
2026-04-24
2026-10-26 21:10
✅ 완료

🇰🇷 한글 설명

Actual(로컬 우선 개인 재무 도구)의 26.4.0 이전 버전에서, 비밀번호 인증에서 OpenID Connect로 마이그레이션된 서버의 인증된 사용자(BASIC 역할 포함)가 ADMIN으로 권한 상승할 수 있습니다. POST /account/change-password의 권한 검사 누락, 마이그레이션 후 남은 비활성 비밀번호 행, 클라이언트가 지정하는 loginMethod 처리가 결합되어 공격 체인을 형성하며, 근본 원인은 /change-password의 권한 검사 누락입니다.

💡 쉬운 설명

일반 사용자 계정으로 로그인한 공격자가 비밀번호 변경 기능을 악용해 관리자 계정의 비밀번호를 바꿀 수 있습니다. 이후 인증 방식을 강제로 지정해 관리자 권한을 얻게 됩니다.

🇺🇸 원문 (English)

Actual is a local-first personal finance tool. Prior to version 26.4.0, any authenticated user (including `BASIC` role) can escalate to `ADMIN` on servers migrated from password authentication to OpenID Connect. Three weaknesses combine: `POST /account/change-password` has no authorization check, allowing any session to overwrite the password hash; the inactive password `auth` row is never removed on migration; and the login endpoint accepts a client-supplied `loginMethod` that bypasses the server's active auth configuration. Together these allow an attacker to set a known password and authenticate as the anonymous admin account created during the multiuser migration. The three weaknesses form a single, sequential exploit chain — none produces privilege escalation on its own. Missing authorization on POST /change-password allows overwriting a password hash, but only matters if there is an orphaned row to target. Orphaned password row persisting after migration provides the target row, but is harmless without the ability to authenticate using it. Client-controlled loginMethod: "password" allows forcing password-based auth, but is useless without a known hash established by step 1. All three must be chained in sequence to achieve the impact. No single weakness independently results in privilege escalation. The single root cause is the missing authorization check on /change-password; the other two are preconditions that make it exploitable. Version 26.4.0 contains a fix.

📍 영향받는 시스템

Actual 26.4.0 이전 버전 중 비밀번호 인증에서 OpenID Connect로 마이그레이션된 멀티유저 서버

⚔️ 공격 벡터

인증된 저권한 사용자가 /account/change-password로 익명 관리자 계정의 비밀번호 해시를 덮어쓴 뒤, loginMethod를 password로 지정해 해당 관리자 계정으로 로그인

🛡️ 대응 방법

Actual 26.4.0 이상으로 업그레이드하고, 마이그레이션 후 남은 비활성 비밀번호 인증 행과 익명 관리자 계정을 점검 및 정리

🔧 검증 코드

출력된 버전이 26.4.0 미만이면 취약하므로 업그레이드가 필요하고, 26.4.0 이상이면 수정된 버전입니다 (명령어는 설치 형태에 따라 경로를 조정해야 함).

Shell / Script
docker exec actual-server cat /app/package.json 2>/dev/null | grep '"version"'

📊 CVSS Vector String

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

💻 영향받는 소프트웨어

Log Server