Skip to content

웨이팅 취소 시 카운트 음수 처리 및 대기 한도 우회 취약점 #355

@coderabbitai

Description

@coderabbitai

문제 설명

removeWaiting 메서드에서 사용자별 웨이팅 제한 카운트를 감소시킬 때 반환값을 검증하지 않아, 카운트가 음수로 내려가는 문제가 발생합니다.

발생 가능한 시나리오

  1. 키가 존재하지 않거나 만료된 상태에서 removeWaiting 호출 → 카운트가 -1로 설정됨
  2. 중복 취소 요청 시 카운트가 -2, -3 등으로 계속 감소
  3. incrementAndCheckWaitingLimit에서 current > maxLimit만 검증하므로, 음수 값은 3L보다 작아 검증을 통과
  4. 사용자가 최대 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)

관련 링크

제안된 해결 방안

  1. decrement 후 반환값을 검증하여 0 미만이면 0으로 설정
  2. WaitingPermitLuaRepository의 Lua 스크립트 패턴을 활용하여 원자적 연산으로 처리
  3. userWaitingLimitCountKey에 TTL 설정 추가 (일일 리셋 메커니즘)

이 이슈는 @Jjiggu의 요청으로 생성되었습니다.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions