-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Description
문제 설명
removeWaiting 메서드에서 사용자별 웨이팅 제한 카운트를 감소시킬 때 반환값을 검증하지 않아, 카운트가 음수로 내려가는 문제가 발생합니다.
발생 가능한 시나리오
- 키가 존재하지 않거나 만료된 상태에서
removeWaiting호출 → 카운트가 -1로 설정됨 - 중복 취소 요청 시 카운트가 -2, -3 등으로 계속 감소
incrementAndCheckWaitingLimit에서current > maxLimit만 검증하므로, 음수 값은 3L보다 작아 검증을 통과- 사용자가 최대 3회 대기 제한을 우회할 수 있는 취약점 발생
추가 문제점
userWaitingLimitCountKey에 TTL이 설정되지 않아 일일 한도 리셋 메커니즘이 작동하지 않음
관련 파일
nowait-domain/domain-redis/src/main/java/com/nowait/domaincoreredis/reservation/repository/WaitingRedisRepository.java- 해당 메서드:
removeWaiting(Long storeId, Long userId)(Line 148-167)
관련 링크
- Pull Request: Refactor : User 웨이팅 등록 및 삭제 기능 리팩토링 #349
- 리뷰 코멘트: Refactor : User 웨이팅 등록 및 삭제 기능 리팩토링 #349 (comment)
제안된 해결 방안
decrement후 반환값을 검증하여 0 미만이면 0으로 설정WaitingPermitLuaRepository의 Lua 스크립트 패턴을 활용하여 원자적 연산으로 처리userWaitingLimitCountKey에 TTL 설정 추가 (일일 리셋 메커니즘)
이 이슈는 @Jjiggu의 요청으로 생성되었습니다.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels