Vikunja에서 관리자가 계정을 차단한 이용자의 봇이, 그 봇이 소유한 API 토큰으로 여전히 인증될 수 있다는 점이 보안 어드바이저리로 공개됐다. 토큰 검증이 봇 자신의 상태만 보기 때문에 생기는 격차다. 계정을 막은 것과 접근을 끊은 것이 서로 다른 결과가 될 수 있으므로, 남아 있는 봇 토큰을 먼저 확인할 필요가 있다.
개요

Vikunja 2.4.0 이상 2.7.1 미만에서 봇 사용자가 소유한 API 토큰은, 그 봇의 사람 소유자가 관리자한테 비활성화되거나 잠긴 뒤에도 유효한 자격 증명으로 동작할 수 있다. 토큰을 검증하는 단계가 확인하는 계정은 사람 소유자가 아니라 봇 자신이고, 소유자를 비활성화하는 조치는 소속 봇의 상태를 함께 바꾸지 않는다. 이 두 사실이 겹치면 소유자 차단이 그 소유자 경유의 토큰 접근을 자동으로 중단시키지 못한다. 벤더 보안 어드바이저리 GHSA-5fc2-w2j4-6r8w는 이 동작을 담고 있고, 같은 어드바이저리를 참조하는 별도 CVE 레코드 CVE-2026-123493는 2.4.0 이상 2.7.1 미만의 인증 우회로 정리한다.
즉 이 문제의 본질은 토큰이 유출되는 결함이 아니라, 계정 통제가 자격 증명 수명에 전파되지 않는 결함이다. 관리 콘솔에 보이는 계정 상태와, API가 실제로 받아들이는 자격 증명의 상태가 어긋날 수 있다.
영향 범위
제공된 근거가 지목하는 범위는 다음과 같다.
- 버전: 2.4.0 이상, 2.7.1 미만
- 관련 자격 증명: 관리자한테 비활성화되거나 잠긴 사람 소유자와 연결된 봇이 소유한 기존 API 토큰
- 영향을 받는 접근 경로: HTTP API, CalDAV, MCP, 피드
- 지속될 수 있는 동작: 공유 프로젝트의 읽기와 수정
이 문제가 성립하려면 두 전제가 필요하다. 봇 사용자와 그 봇이 소유한 토큰이 실제로 존재해야 하고, 사람 소유자가 비활성화 또는 잠김 상태가 되어야 한다. 이 전제가 성립하는 환경에서는 관리자가 계정을 막았다는 사실만으로 공유 프로젝트 접근이 종료됐다고 볼 수 없다. VulnCheck는 이미 발급된 봇 토큰을 사전에 확보한 공격자가 해당 토큰으로 공유 프로젝트를 계속 읽고 수정할 수 있다고 설명한다. (VulnCheck 어드바이저리)
다만 제공된 자료는 여러 접근 경로를 하나의 목록으로 나열할 뿐, 경로별로 위험도가 다르다는 근거는 제시하지 않는다. MCP가 목록에 포함되어 있다는 사실에서 MCP 고유의 별도 취약점을 읽어낼 근거도 없다.
기술적 분석
인증이 유지되는 구조
검증 대상과 차단 대상이 서로 다른 계정을 가리킨다는 점이 핵심이다. 봇 토큰으로 요청이 들어오면 서버는 그 토큰의 소유 계정인 봇의 상태를 확인한다. 사람이 아니라 봇을 보는 것이다. 관리자가 소유자를 비활성화하거나 잠그는 절차는 사람 계정의 상태를 바꾸지만 소속 봇의 상태는 바꾸지 않고, 검증 로직은 소유자 쪽 상태를 참조하지 않는다. 이 구조 때문에 제공된 근거는, 관련된 기존 봇 토큰이 소유자 차단 이후에도 계속 인증될 수 있다고 밝힌다.
이 관점에서 보면 다루어야 할 위험은 토큰을 새로 발급받는 방법이 아니라, 차단 이전에 이미 발급된 토큰의 수명이다. 권한을 회수하려는 의도와 무관하게, 과거에 만들어진 토큰이 차단 이후까지 유효하게 남을 수 있다. 토큰이 공유 프로젝트에 도달할 수 있는 범위라면 읽기에 더해 수정까지 가능하다는 점도 근거에 포함된다.
공개 PoC·익스플로잇 분석
공개 자료에서 확인할 수 있는 출발점은 벤더 어드바이저리다. Vikunja 어드바이저리에는 사람 소유자가 비활성화되거나 잠긴 뒤에도 봇이 소유한 API 토큰이 계속 인증된다는 동작이 명시되어 있고, CVE 레코드는 같은 어드바이저리를 참조하며 이를 인증 우회로 정리한다. (Vikunja 어드바이저리)
전제조건은 별도의 코드 기법이 아니라 토큰 보유로 요약된다. 근거가 지목하는 공격 주체는 이미 발급된 봇 토큰을 사전에 확보한 쪽이며, 정상적인 인증 경로를 HTTP API, CalDAV, MCP, 피드 방향으로 계속 사용하는 형태다. 요청 변조나 추가 권한 상승 같은 별도 단계는 제공된 자료에서 확인되지 않는다.
입증 범위는 공식 권고가 담고 있는 재현 절차까지로 보는 편이 정확하다. 벤더 어드바이저리에는 봇을 만들고, 그 봇의 API 토큰을 발급한 뒤, 사람 소유자의 계정을 비활성화하고, 같은 요청을 반복하는 공개 재현 절차가 포함되어 있다. 다만 그 절차를 통째로 자동화한 독립 실행형 익스플로잇이나 재현 코드에 관한 자료는 제공된 근거에 없다. 따라서 실제 악용이 발생했는지도 확인하지 못한다. 악용이 확인되지 않았다는 진술과 악용 가능성이 없다는 진술은 같지 않으므로, 이 부분은 확인이 필요한 한계로 남긴다. 같은 근거 묶음에 심각도 평가 점수가 없는 것도 같은 취지에서 유보한다.
운영상 의미는 비교적 분명하다. 차단 시점 이전에 만들어진 토큰은 유효하게 남아 있을 수 있으므로, 소유자 비활성화를 자격 증명 회수와 같은 의미로 취급하면 안 된다. 반대로 근거 자료는 차단 이후의 신규 발급 경로를 따로 다루지 않는다. 그래서 신규 발급까지 막혀 있는지, 아니면 차단 이전 토큰만 문제가 되는지를 제공된 자료만으로 구분할 수 없다.
탐지의 한계
비활성화되거나 잠긴 소유자의 봇 토큰 사용을 걸러낼 구체적인 로그 필드와 탐지 규칙은 제공된 근거에서 확인되지 않는다. 어떤 항목으로 이 동작을 식별할 수 있는지는 공개된 자료가 아니라 각 설치 환경의 로깅 설정을 살펴봐야 알 수 있는 영역으로 남긴다.
대응 방안
지금 확인할 것
- Vikunja 인스턴스가 2.4.0 이상 2.7.1 미만인지 확인한다.
- 비활성화되거나 잠긴 사람 소유자와 연결된 봇, 그리고 그 봇이 소유한 기존 토큰을 우선 점검 대상으로 삼는다.
- 각 토큰의 사용 필요성과 접근 권한을 검토한다.
- 불필요한 접근은 운영에 미치는 영향을 확인한 뒤 차단한다.
점검의 출발점은 버전과 기존 토큰이다. 제공된 근거는 영향을 받는 접근 경로로 HTTP API, CalDAV, MCP, 피드를 함께 지목하고 있으므로, 확인 범위는 이 경로들을 상정에 넣는다.
근본적인 조치
- 수정 버전으로 제시된 2.7.1 이상으로 업데이트하는 방안을 검토한다. (GitHub API: GHSA-5fc2-w2j4-6r8w)
- 계정 비활성화 절차에 소속 봇과 그 토큰의 접근 검토를 포함한다.
수정 버전의 상세 변경 내용과 권장 업데이트 절차, 지원되는 토큰 폐기 절차는 제공된 근거에서 확인되지 않는다. 같은 이유로 탐지 규칙이나 업데이트의 운영 영향에 관한 구체적 지침은 이 글에서 단정하지 않는다. 적용 전 벤더 자료로 확인해야 하는 부분으로 남긴다.
참고자료
- GitHub API: GHSA-5fc2-w2j4-6r8w
- Vikunja from 2.4.0 before 2.7.1 Authentication Bypass via Bot API Tokens
함께 읽으면 좋은 글
- LXD 제한 프로젝트 우회: 스냅샷 복원이 여는 호스트 root 명령 실행 경로
- CVE-2026-124424: AVideo AI 플러그인의 자막 경로 순회 취약점 점검
- CVE-2026-123498: Vikunja veans 코딩 에이전트 지시문으로 들어가는 프로젝트 메타데이터
본 콘텐츠는 AI 기술로 작성된 분석 리포트를 포함하고 있습니다. 내용 중 사실과 다르거나 보완이 필요한 정보를 발견하셨으면 댓글을 통해 의견을 부탁드립니다. 여러분의 피드백은 더 정확한 보안 정보 공유에 큰 도움이 됩니다.
댓글 (0)
댓글을 작성하려면 로그인이 필요합니다.
로그인아직 댓글이 없습니다.
첫 번째 댓글을 작성해보세요!