Django 6.0 또는 5.2를 운영 중이라면 각각 Django 6.0.8 또는 Django 5.2.17 이상으로 즉시 업데이트하세요. 2026년 8월 4일 공개된 공식 보안 릴리스는 GeoDjango 공간 조회를 통한 서버 파일 쓰기·서버 측 요청, 관리자 화면의 저장형 XSS, 중첩 geometry 서비스 거부 등 네 가지 취약점을 수정합니다.
어떤 취약점이 수정됐나
CVE-2026-15307: GeoDjango 공간 조회를 통한 파일 쓰기와 서버 요청
가장 심각도가 높은 문제입니다. 공간 조회가 래스터를 표현하는 str·dict 값을 GDALRaster에 전달할 수 있었고, GDAL 드라이버에 따라 Django 프로세스 권한으로 파일을 쓰거나 네트워크 요청을 보낼 수 있었습니다. 일부 드라이버 조합에서는 원격 코드 실행으로 이어질 가능성도 공식 공지에 명시됐습니다.
관리자 변경 목록의 필터는 ModelAdmin.lookup_allowed()를 통해 조회를 허용하므로, 공간 필드가 있는 등록 모델을 볼 수 있는 staff 사용자에게도 공격 경로가 열릴 수 있었습니다. Django 6.0.8·5.2.17부터 공간 조회는 dict와 유효한 GEOSGeometry가 아닌 문자열을 거부합니다.
CVE-2026-15830: 깊게 중첩된 geometry collection에 의한 서비스 거부
GEOSGeometry에 깊게 중첩된 GEOMETRYCOLLECTION을 전달하면 GEOS의 segmentation fault로 프로세스가 종료될 수 있었습니다. 수정 버전은 WKT의 중첩 깊이와 WKB의 전체 collection 수를 기본 198개로 제한하며, 필요한 경우 max_geom_collections로 조정할 수 있습니다.
CVE-2026-15920: 관리자 URLField 저장형 XSS
Django admin은 변경 목록과 읽기 전용 필드에서 URLField 값을 클릭 가능한 링크로 표시합니다. 수정 전에는 위험한 URL scheme이 안전한지 검증하지 않고 링크로 렌더링될 수 있었습니다. 패치 버전은 URLValidator를 통과한 값만 링크로 만들고, 실패한 값은 일반 텍스트로 표시합니다.
CVE-2026-15337: 매우 긴 언어 코드에 의한 메모리 소모
check_for_language()가 서로 다른 긴 언어 코드를 메모리 캐시 키로 저장해 메모리를 소비할 수 있었습니다. set_language() 뷰를 직접 활성화한 서비스는 특히 확인해야 합니다. 수정 버전은 500자를 넘는 언어 코드를 캐시 조회 전에 거부합니다.
가장 작은 업데이트 절차
현재 사용 중인 브랜치에서 최신 보안 패치로 올리세요. 다음 명령은 설명용 예시이며, 잠금 파일과 배포 도구에 맞게 버전을 고정해야 합니다.
# Django 6.0 계열
python -m pip install --upgrade "Django==6.0.8"
# Django 5.2 LTS 계열
python -m pip install --upgrade "Django==5.2.17"
python -m django --version
python manage.py check --deploy
python manage.py test
Poetry·uv·pip-tools를 사용한다면 해당 잠금 도구로 버전을 올린 뒤 새 해시와 간접 의존성을 함께 검토하세요. 운영 서버에서 직접 pip install을 실행하기보다 재현 가능한 이미지나 빌드 산출물을 새로 만드는 편이 안전합니다.
GeoDjango 사용자는 조회 코드를 추가로 점검하자
패치 뒤에는 과거에 허용되던 문자열·딕셔너리 래스터 조회가 실패할 수 있습니다. 정말 신뢰할 수 있는 서버 내부 경로를 조회해야 한다면 의도를 명확히 드러내도록 GDALRaster 객체로 감싸세요.
from django.contrib.gis.gdal import GDALRaster
trusted_raster = GDALRaster("/srv/rasters/base-map.tif")
# 실제 lookup 이름은 모델과 공간 백엔드에 맞게 사용한다.
results = MapLayer.objects.filter(raster__intersects=trusted_raster)
이 코드는 설명용 예시입니다. 업로드 파일명, 요청 본문, 쿼리 문자열을 그대로 GDALRaster에 전달하면 안 됩니다. Django 공식 문서는 GDALRaster가 새 래스터를 쓰기 모드로 열고, 빌드된 GDAL 기능에 따라 네트워크 리소스도 열 수 있다고 경고합니다.
호환성·제한·보안 주의점
- CVE-2026-15307 수정은 의도적인 하위 호환성 변경입니다. 문자열·딕셔너리 기반 공간 조회가 있으면 패치 후 오류가 발생할 수 있으므로 테스트 로그를 확인하세요.
RasterField에 값을 할당하는 경로는 조회 차단과 별개입니다. 문자열·경로·딕셔너리 할당은 여전히 래스터를 열 수 있으므로 사용자 입력을 별도로 검증해야 합니다.- 관리자 권한을 신뢰 경계 밖으로 보지 마세요. 공간 필드 모델의 조회 권한을 가진 staff 계정을 감사하고, 불필요한 필터와 모델 등록을 줄이세요.
- 기존
URLField데이터에 위험한 scheme이 저장돼 있을 수 있습니다. 패치가 렌더링을 차단하더라도 데이터 정제와 입력 검증을 함께 수행하세요. max_geom_collections제한을 높이면 서비스 거부 방어가 약해질 수 있습니다. 실제 데이터 요구가 확인된 경우에만 성능 테스트와 요청 크기 제한을 함께 적용하세요.- Django 6.1 최종판을 사용하는 경우에도 설치된 실제 패치 버전과 공식 릴리스 노트를 확인하세요. 버전 이름만 보고 보안 수정 포함 여부를 추정하지 마세요.
운영 체크리스트
- Django 6.0은 6.0.8 이상, Django 5.2는 5.2.17 이상으로 올렸다.
- 잠금 파일·컨테이너 이미지를 재생성하고 스테이징 테스트를 통과했다.
- GeoDjango 공간 필드와 관리자 필터를 사용하는 모델을 목록화했다.
- 문자열·딕셔너리 래스터 조회를 제거하거나 신뢰된
GDALRaster객체로 변경했다. -
RasterField할당 경로에서 사용자 입력과 외부 URL을 검증한다. - 관리자
URLField기존 값에서 위험한 scheme을 점검했다. - 긴 언어 코드와 중첩 geometry 입력에 요청 크기·시간 제한을 적용했다.
- 배포 후 5xx, 워커 재시작, 외부 네트워크 요청, 파일 생성 이벤트를 모니터링한다.
공식 출처
- Django 6.0.8·5.2.17 공식 보안 공지 — 2026-09-02 확인
- Django 6.0.8 공식 릴리스 노트와 CVE 상세 — 2026-09-02 확인
- Django GDALRaster 보안 고려사항 — 2026-09-02 확인
- Django 공식 다운로드와 지원 브랜치 — 2026-09-02 확인