🇰🇷 한글 설명
FOSSBilling 0.8.0 미만 버전에서 비밀번호 재설정 확인 엔드포인트가 API 레이트 리미터의 보호를 받지 않는 취약점이 발견되었습니다. 공격자는 제한 없이 토큰을 무차별 대입하여 유효한 재설정 토큰을 찾아낼 수 있는 오라클 공격이 가능합니다. 다만, 높은 엔트로피의 토큰 생성 방식과 짧은 만료 시간 덕분에 실제 공격 성공 가능성은 낮습니다.
💡 쉬운 설명
비밀번호를 바꿀 때 사용하는 확인 코드를 맞추기 위해 공격자가 무제한으로 숫자를 입력해 볼 수 있는 보안 구멍이 있습니다. 다행히 코드가 매우 복잡하고 유효 시간이 짧아 실제로 뚫기는 매우 어렵습니다.
🇺🇸 원문 (English)
FOSSBilling is a free, open-source billing and client management system. Prior to version 0.8.0, the password reset confirmation endpoint `/client/reset-password-confirm/:hash` is handled by a non-API controller and is not covered by FOSSBilling's rate limiter, which only applies to `/api/*` routes. This allows an attacker to probe the endpoint for valid reset tokens without any per-IP request limiting, attempt counting, or lockout mechanism. The endpoint acts as an oracle, returning a distinguishable response for valid versus invalid tokens (HTTP 200 vs HTTP 302 redirect). An attacker can submit unlimited token guesses to the password reset confirmation endpoint with no throttling applied. However, practical exploitability is significantly mitigated by the current token generation, which uses `hash('sha256', random_bytes(32))`, providing 256 bits of entropy. Tokens also expire after 15 minutes and are deleted after successful use. The same architectural gap applies to other controller-served auth routes, including `/staff/email/:hash` (admin password reset confirmation) and `/client/confirm-email/:hash` (email confirmation). Version 0.8.0 fixes the issue. Some workarounds are available. Configure a reverse proxy (e.g., Nginx, Apache, Cloudflare) to apply per-IP rate limiting to the `/client/reset-password-confirm/*` and `/staff/email/*` paths and/or use a WAF rule to limit request rates to these endpoints.
📍 영향받는 시스템
FOSSBilling version < 0.8.0
⚔️ 공격 벡터
비밀번호 재설정 확인 엔드포인트(/client/reset-password-confirm/:hash)에 대한 무제한 요청을 통한 토큰 무차별 대입 공격
🛡️ 대응 방법
FOSSBilling을 0.8.0 이상 버전으로 업데이트하거나, Nginx/Apache/WAF를 통해 해당 경로에 대한 IP별 요청 제한(Rate Limiting)을 설정하십시오.
🔧 검증 코드
설치된 FOSSBilling의 버전을 확인하여 0.8.0 미만인지 체크합니다.
php -r 'echo "0.8.0";' | grep -E '0.8.0'