Skip to content

백오피스 게이트 경로 판정을 dispatcher 와 같게 정규화 - #987

Merged
m-a-king merged 1 commit into
devfrom
fix/986-admin-gate-path-normalization
Aug 25, 2026
Merged

백오피스 게이트 경로 판정을 dispatcher 와 같게 정규화#987
m-a-king merged 1 commit into
devfrom
fix/986-admin-gate-path-normalization

Conversation

@m-a-king

Copy link
Copy Markdown
Collaborator

Situation

AdminAccessFilter.shouldNotFilter 가 게이트 적용 여부를 raw request.requestURI 로 판정하는데, Spring 은 디코딩·정규화된 경로로 라우팅한다. 판정 층과 라우팅 층이 다른 경로를 보고 있었다.

그래서 /admin 을 다르게 표기하면 게이트만 건너뛰고 컨트롤러에는 그대로 도달했다. getRequestURI() 가 디코딩되지 않은 /%61dmin/announcements 를 반환하므로 uri == "/admin"uri.startsWith("/admin/") 이 모두 false 가 되고, shouldNotFilter 가 true 를 리턴해 세션·세션-IP 바인딩·allowlist 검사가 한 줄도 실행되지 않았다.

형제 필터인 EnvironmentAccessFilter 는 이 우회 유형을 /%64ocs/index.html 예시까지 들어 주석에 문서화하고 UrlPathHelper 로 막아뒀다. 그 수정이 dev 문서 게이트에만 적용되고 prod 백오피스 게이트에는 적용되지 않았다.

Task

  • 게이트 판정 경로를 dispatcher 가 보는 경로와 일치시킨다.
  • 실제로 우회가 뚫렸는지, 수정으로 막히는지, grant 진입 흐름이 함께 막히지는 않는지를 추측이 아니라 실행으로 확정한다.

Action

  • shouldNotFilter 의 경로 판정을 UrlPathHelper.defaultInstance.getPathWithinApplication 기반으로 바꿨다. removeSemicolonContent·urlDecode 가 기본 on 이라 matrix param 제거와 percent-decoding 이 함께 적용된다.
  • 판정 로직을 isGatedRequest / isGatedPath 로 companion 에 노출해 EnvironmentAccessFilter 와 구조를 맞췄다. 두 게이트가 같은 모양이면 한쪽만 고쳐지는 이번 같은 어긋남이 눈에 띈다.
  • 경로 판정을 단위 테스트로 고정했다. 우회 표기(percent-encoding, matrix param)가 게이트에 걸리는 것과, /admin-access·/admin-assets 가 과매칭되지 않는 것을 함께 잠갔다. 후자가 깨지면 grant 진입 자체가 막혀 아무도 백오피스에 못 들어간다.

실측

로컬에서 ADMIN_LOCAL_BYPASS=false 로 게이트를 실제로 켜고, 수정 전후 같은 요청을 보냈다. 쿠키 없음, allowlist 미등록 상태다.

요청 수정 전 수정 후
/admin 404 404
/%61dmin/announcements 200 (공지 발송 페이지 HTML) 404
/admin/%69tem-quota - 404
/admin;x=1/announcements 401 404
//admin/announcements 401 404
/admin-access/grant - 400 (게이트 통과)

수정 전 /%61dmin/announcements 는 200 과 함께 백오피스 공지 발송 페이지 HTML 을 그대로 반환했다. 리뷰가 지적한 세 가지 표기 중 실제로 노출로 이어진 것은 percent-encoding 하나이고, matrix param 과 중복 슬래시는 게이트를 뚫은 뒤 메인 Security 체인이 401 로 막고 있었다. 다만 판정 층이 어긋나 있다는 사실은 셋 다 같으므로 함께 막았다.

/admin-access/grant 가 404 가 아니라 400 인 것은 게이트를 통과해 컨트롤러까지 도달했고 파라미터가 없어 400 이 났다는 뜻이다. 이 수정이 grant 진입을 함께 막지 않았음을 확인하는 값이다.

Result

  • prod 백오피스에 무인증으로 닿을 수 있던 경로가 닫혔다. 이 경로로는 공지 브로드캐스트, 등록 한도, 추출 정책이 모두 노출됐고, GET 만으로 공격자 세션에 CSRF 토큰이 발급돼 POST 폼도 동작하는 상태였다.
  • dev 에 이 코드가 배포돼 있던 기간의 access log 를 /% 류 경로로 훑어 실제 시도가 있었는지 확인해 볼 수 있다. 이번 PR 범위 밖이라 별도로 남긴다.

연관 이슈

- shouldNotFilter 가 raw requestURI 로 게이트 적용 여부를 판정하는데 Spring 은 디코딩 경로로 라우팅해, /%61dmin/announcements 가 세션·세션-IP 바인딩·allowlist 검사를 통째로 건너뛴 채 백오피스에 도달했다
- 로컬에서 게이트를 켜고(ADMIN_LOCAL_BYPASS=false) 실측: 수정 전 이 경로가 200 과 함께 공지 발송 페이지 HTML 을 그대로 반환했고, 수정 후 404 로 막힌다. 정상 /admin 은 세션 없으면 그대로 404, grant 진입점(/admin-access/**)은 400 으로 게이트를 통과해 흐름이 유지되는 것도 함께 확인했다
- matrix param(/admin;x=1/...)과 중복 슬래시(//admin/...)는 게이트는 뚫려도 메인 Security 체인이 401 로 막고 있었다. 실제 노출은 percent-encoding 경로 하나였지만, 판정 층이 어긋나 있다는 사실은 같으므로 함께 막는다
- 형제 필터 EnvironmentAccessFilter 가 같은 우회 유형을 이미 UrlPathHelper 로 막고 있었다. 그 구조(isGatedRequest/isGatedPath 를 companion 으로 노출)를 그대로 따라 두 게이트의 모양을 맞추고 경로 판정을 단위 테스트로 고정했다
@m-a-king m-a-king added the fix 외부 가시적 결함 수정 label Aug 25, 2026
@m-a-king m-a-king self-assigned this Aug 25, 2026
@github-actions

Copy link
Copy Markdown

Discord 스레드 연동용 메타데이터입니다. discord-pr-bot 워크플로가 자동 생성하며, 수정·삭제하면 PR 과 Discord 알림 연동이 끊깁니다.

@coderabbitai

coderabbitai Bot commented Aug 25, 2026

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: CHILL

Plan: Pro Plus

Run ID: d81c6a03-2911-4243-8001-bc256378e8cc


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@m-a-king
m-a-king merged commit c633666 into dev Aug 25, 2026
8 checks passed
@m-a-king
m-a-king deleted the fix/986-admin-gate-path-normalization branch August 25, 2026 06:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

fix 외부 가시적 결함 수정

Projects

None yet

Development

Successfully merging this pull request may close these issues.

백오피스 게이트가 raw URI 로 판정해 인코딩 경로로 우회됨

1 participant