Shiny for Python의 북마크 복원 기능에서 클라이언트가 제공하는 _state_id_ 쿼리스트링 값이 적절한 검증 없이 서버 측 경로에 결합되면서, 공격자가 서버의 북마크 저장 위치를 벗어난 임의의 파일 경로에 접근할 수 있는 경로 순회(Path Traversal) 보안 문제가 발생했습니다.
CVE-2026-108258 취약점 개요
최근 Shiny for Python의 북마크 복원(bookmark restore) 기능에서 심각한 경로 순회 취약점이 발견됐습니다. 이 취약점은 공식적으로 CVE-2026-108258로 기록되었으며, 보안 분류상 CWE-22(경로 순회)에 해당합니다. 상세 내용은 posit-dev의 보안 어드바이저리 GHSA-47c3-hpmg-7j6p에 공개되어 있습니다.
이 문제는 사용자가 이전에 저장한 애플리케이션 상태를 복원하는 북마크 기능의 처리 과정에서 발생합니다. 특히 서버 측에서 파일 경로를 생성할 때 입력값에 대한 엄격한 검증이 누락되어, 공격자가 특수하게 조작된 페이로드로 시스템 내의 허용되지 않은 파일에 접근할 위험이 있습니다.
기술적 분석 및 취약점 원인
경로 구성의 결함
Shiny for Python의 북마크 복원 경로는 클라이언트로부터 전달받은 _state_id_라는 쿼리스트링 값을 사용합니다. 수정 전 버전에서는 이 값이 서버 측의 북마크 디렉토리 경로인 <cwd>/shiny_bookmarks/<id>와 결합될 때 해당 ID 값이 경로 구성 요소로 안전한지 검증되지 않았습니다.
이로 인해 공격자가 ../와 같은 경로 순회 페이로드를 _state_id_ 값에 포함하여 전송할 경우, 애플리케이션은 서버의 지정된 북마크 저장 위치를 벗어나 파일 시스템의 다른 경로로 접근을 시도하게 됩니다.
위험 가중 조건
특정 설정 조합을 사용하는 애플리케이션에서는 해당 취약점으로 인한 피해가 더욱 심각해질 수 있습니다. 다음과 같은 설정이 적용되어 있다면 위험도가 높습니다.
bookmark_store="server"설정이 활성화된 경우ui.input_file()함수를 함께 사용하는 경우
이 환경에서는 파일 입력 복원 핸들러(file-input restore handler)가 복원 디렉토리 외부에 있는 파일을 복사해 옵니다. 공격자가 선택한 디렉토리 내의 특정 파일 이름을 지정하면 서버 내의 민감한 파일 내용을 애플리케이션 내부로 읽어 들일 수 있는 심각한 보안 위협으로 이어집니다.
영향 범위 및 위험도
해당 취약점은 북마크 기능이 처음 도입된 버전부터 수정 버전 이전까지 넓은 구간에 걸쳐 영향을 미칩니다. 북마크 기능은 Shiny for Python 1.4.0 버전에서 도입되었으므로 그 이전 릴리스에는 해당 코드 경로가 존재하지 않아 이 취약점의 영향을 받지 않습니다.
상세 영향 범위는 다음과 같습니다.
| 항목 | 상세 내용 |
|---|---|
| 취약점 식별 번호 | CVE-2026-108258 |
| 영향을 받는 버전 | Shiny for Python 1.4.0 ~ 1.6.3 |
| 취약점 분류 | CWE-22 (Path Traversal) |
| 수정 버전 | Shiny for Python 1.6.4 |
시스템 관리자와 개발자는 현재 운영 중인 Shiny for Python의 버전부터 즉시 확인하십시오. 1.4.0에서 1.6.3 사이의 버전을 사용하고 있다면 즉각적인 조치가 필요합니다.
수정 사항 및 대응 방안
보안 패치 내용
Shiny for Python 개발 팀은 1.6.4 버전에서 해당 취약점을 해결하는 보안 업데이트를 배포했습니다. 수정의 핵심은 북마크 ID에 대한 엄격한 입력값 검증을 도입한 것입니다.
1.6.4 버전부터는 북마크 ID를 단일 경로 세그먼트에 해당하는 정규표현식 [A-Za-z0-9_-]+ 허용 목록(allowlist)과 대조해 검증합니다. 이 허용 목록은 알파벳 대소문자, 숫자, 하이픈(-), 언더바(_) 이외의 문자(예: 경로 순회에 사용되는 / 또는 .)가 포함된 요청을 사전에 차단해 경로 순회 공격을 근본적으로 방지합니다.
권장 대응 절차
시스템 관리자는 다음 단계로 보안 조치를 진행하면 됩니다.
- 버전 확인: 현재 설치된
shiny패키지의 버전을 확인합니다. 1.4.0 이상 1.6.3 이하 버전이라면 즉시 업데이트 대상입니다. - 패키지 업데이트: Python 패키지 관리자 pip로 최신 보안 버전인 1.6.4 이상으로 업그레이드합니다.
- 실행 명령어:
pip install --upgrade shiny
- 설정 검토: 특히
bookmark_store="server"설정과ui.input_file()을 동시에 사용하는 애플리케이션이라면, 패치 적용 전까지 외부 노출을 최소화하거나 접근 제어를 강화해야 합니다. - 검증: 업데이트 후에는 애플리케이션이 정상적으로 동작하는지 확인하고, 북마크 복원 기능이 의도한 대로 작동하는지 테스트합니다.