🇰🇷 한글 설명
Grav API 플러그인(getgrav/grav-plugin-api) 2.0.4 이전 버전은 JWT 액세스 토큰에 jti(JWT ID) 클레임을 포함하지 않아 서버 측에서 토큰을 폐기할 수 없습니다. 이로 인해 액세스 토큰은 로그아웃, 비밀번호 변경, 새 토큰 발급, 계정 비활성화와 무관하게 기본 1시간 동안 유효하게 남습니다. 토큰을 탈취한 공격자는 토큰 만료 전까지 API에 계속 접근할 수 있습니다.
💡 쉬운 설명
Grav 웹사이트의 API 기능에서 로그인 인증 열쇠(토큰)를 서버가 강제로 무효화할 수 없습니다. 열쇠가 유출되면 로그아웃하거나 비밀번호를 바꿔도 약 1시간 동안 계속 사용될 수 있습니다.
🇺🇸 원문 (English)
The Grav API plugin (getgrav/grav-plugin-api) before 2.0.4 contains an improper session invalidation vulnerability where JWT access tokens are issued without a jti (JWT ID) claim and therefore cannot be revoked server-side. Unlike refresh tokens, access tokens remain valid for their full lifetime (default 1 hour) regardless of logout, password change, new token issuance, or account disablement. An attacker who has stolen an access token retains full API access until the token naturally expires.
📍 영향받는 시스템
getgrav/grav-plugin-api 2.0.4 미만 버전을 사용하는 Grav CMS 환경
⚔️ 공격 벡터
네트워크 스니핑, 로그 유출, XSS 등으로 탈취한 JWT 액세스 토큰을 만료 전까지 API 요청에 재사용
🛡️ 대응 방법
grav-plugin-api를 2.0.4 이상으로 업데이트하고, 기존 발급 토큰이 남아있지 않도록 시크릿 키를 교체
🔧 검증 코드
출력된 버전 값이 2.0.4 미만이면 취약, 2.0.4 이상이면 패치 적용된 상태이며, 아무 결과도 없으면 플러그인이 설치되지 않은 것입니다.
grep -rE "version\s*:" $(find / -path '*grav*' -name 'blueprints.yaml' -path '*api*' 2>/dev/null) 2>/dev/null | head -5