🇰🇷 한글 설명
APITable 1.13.0-beta.1 이하 버전에서 InternalUserController의 특정 엔드포인트가 인증 없이 접근 가능하도록 설정되어 있습니다. 공격자는 인증되지 않은 상태로 사용자 계정 목록을 열거하고, 삭제 대기 중인 계정을 강제로 완전히 폐쇄하여 복구를 불가능하게 만들 수 있습니다.
💡 쉬운 설명
로그인하지 않은 외부인이 시스템의 관리자 기능을 몰래 사용하여 사용자 계정을 영구적으로 삭제할 수 있는 보안 결함입니다. 삭제 대기 중인 계정까지 강제로 지워버리기 때문에 한 번 삭제되면 데이터를 되살릴 수 없습니다.
🇺🇸 원문 (English)
APITable through 1.13.0-beta.1 annotates both getUserHistories and closePausedUserAccount in InternalUserController with requiredLogin = false. ResourceInterceptor honours that annotation by returning before any session or API key is validated, and the nginx gateway shipped with the product proxies every /api request to the backend server, so both endpoints are reachable by any unauthenticated client that can reach the gateway. An attacker can POST to /api/v1/internal/getUserHistories to enumerate the accounts sitting in the 30-day cooling-off period that follows a deletion request, then POST to /api/v1/internal/users/{userId}/close for each one. The closure path clears the account's email address, phone number and nickname, cancels its space subscriptions, removes its space memberships and deletes its OAuth bindings, so the cooling-off window that exists to let a user reverse a deletion request is bypassed and the account cannot be recovered.
📍 영향받는 시스템
APITable 1.13.0-beta.1 및 그 이전 버전
⚔️ 공격 벡터
인증되지 않은 상태에서 API 엔드포인트(/api/v1/internal/...)에 직접 POST 요청을 보내 계정 정보 탈취 및 강제 폐쇄 수행
🛡️ 대응 방법
해당 엔드포인트의 requiredLogin 설정을 true로 수정하거나, 최신 보안 패치가 적용된 버전으로 업데이트하십시오.
🔧 검증 코드
명령어 실행 시 에러 메시지 없이 데이터가 반환되면 인증 없이 접근 가능한 취약한 상태입니다.
curl -s -X POST http://<target-ip>/api/v1/internal/getUserHistories | grep -q 'error' || echo 'Vulnerable'