![]()
CPython `_zoneinfo` 힙 버퍼 오버플로우 수정(gh-145883): “시간대 파싱은 라이브러리에게 맡기고, 우리는 업데이트를 자동화하자”
meta_description: CPython은 PR #148087(gh-145883)로 _zoneinfo에서 발견된 두 가지 heap-buffer-overflow를 수정했고(3.14 백포트), 테스트도 함께 보강했다. zoneinfo는 PEP 615 기반으로 시스템 tzdata 또는 PyPI tzdata를 사용하므로, 서비스는 ‘시간대 데이터+파서’ 조합을 안전하게 운영해야 한다. 이 글은 무엇이 바뀌었는지(개념), 운영자가 지금 당장 할 일(업데이트/검증/컨테이너/CI), 그리고 zoneinfo를 안전하게 쓰는 실전 체크리스트를 정리한다.
meta_keywords: python,zoneinfo,security,heap-buffer-overflow,timezone,tzdata,iana,pep 615,cpython,patch,upgrade,container,linux,windows,validation,CI,dependency
meta_robots: index,follow
“시간대 처리는 늘 골치 아프다”는 말이 있다.
그런데 더 골치 아픈 건, 시간대는 그냥 기능 문제가 아니라 보안/안정성 문제로도 번진다는 점이다.
이번에 CPython 쪽에서 그걸 상징적으로 보여주는 변경이 하나 들어갔다.
- gh-145883:
_zoneinfo의 두 가지 heap-buffer-overflow 수정 - CPython PR #148087 (3.14 백포트, merged 2026-04-04)
여기서 중요한 건 “내가 zoneinfo를 직접 건드릴 일이 있냐”가 아니다.
대부분의 서비스는 zoneinfo를 이렇게 쓴다.
- 사용자/외부 데이터에 들어있는 time zone을 읽고
- 서버에서 datetime을 만들고
- 저장/표시/정렬/스케줄링에 쓴다
즉, 입력이 엮이는 순간부터 운영 이슈가 된다.
오늘 글은 코어 개발자 관점의 코드 설명이 아니라, 서비스/팀 운영 관점에서 지금 당장 해야 할 일을 정리한다.
![]()
1) zoneinfo는 뭘 하고, 왜 운영이 필요한가
Python docs에 따르면 zoneinfo는 IANA time zone database를 사용하는 구체적인 타임존 구현이며(PEP 615),
- 기본적으로 시스템의 time zone data를 사용하고
- 시스템 데이터가 없으면 PyPI의
tzdata패키지로 폴백할 수 있다
이 말은 운영자 입장에서 이렇게 번역된다.
- 코드만 안정적이면 끝이 아니다
- (코드 + 시간대 데이터 + 배포 환경) 조합이 안정적이어야 한다
컨테이너/서버 이미지가 바뀌거나, tzdata가 갱신되거나, Python이 패치되면 결과가 달라질 수 있다.
그래서 “시간대는 그냥 라이브러리 호출”로 끝나지 않는다.
2) 이번 PR(#148087)에서 ‘운영자가 읽어야 하는 부분’
PR diff를 보면 파일이 이렇게 움직인다.
Modules/_zoneinfo.c(C 확장)Lib/zoneinfo/_zoneinfo.py,_common.pyLib/test/test_zoneinfo/test_zoneinfo.py- NEWS 항목
즉,
- 코어 로직을 손봤고
- 테스트를 같이 붙였고
- 릴리스 노트에 남길 성격의 변경이다
운영 관점에서 핵심은 이거다.
- “힙 버퍼 오버플로우” 급의 이슈는 기능 버그가 아니라, 업그레이드를 강제하는 종류다
이런 건 “우린 zoneinfo를 거의 안 쓰니까”로 넘기기 어렵다.
스케줄러, 리포트, 로그 타임스탬프, 유저 프로필 시간대… 생각보다 깊게 들어가 있다.
3) 당장 할 일: Python 업데이트를 ‘자동’으로 만들기(사람 손으로 하면 늦는다)
여기서부터는 현실적인 체크리스트다.
(1) 런타임 버전이 어디서 결정되는지부터 확인
- 컨테이너 이미지의 Python 버전인가?
- OS 패키지 매니저의 Python인가?
- pyenv/conda/런처인가?
포인트: 팀이 “Python은 알아서 최신이겠지”라고 믿는 순간, 이런 패치가 반영되지 않는다.
(2) “패치 릴리스는 자동 업데이트” 규칙을 세운다
기능 릴리스(예: 3.14 → 3.15)는 조심스럽게 가야 하지만,
- 같은 마이너(3.14.x)에서의 보안/버그픽스는
- 자동으로 따라가도록 설계하는 편이 운영 비용이 낮다
CI/빌드 파이프라인에서 주기적으로 베이스 이미지/런타임을 갱신하는 습관이 필요하다.
(3) zoneinfo 관련 스모크 테스트를 2개만 추가
테스트를 “완벽”하게 하려 하지 말고, 두 가지만 넣자.
ZoneInfo("UTC")같은 기본 동작 확인tzdata폴백이 필요한 환경에서도 실패/예외 처리가 정상인지 확인
(어떤 환경에서 tzdata가 필요한지는 배포 환경에 따라 다르니, 컨테이너 기준으로 한 번만 확인하면 된다.)
4) 실전: zoneinfo 입력을 안전하게 다루는 패턴
보안 이슈가 나왔다고 해서, 우리가 갑자기 C 코드를 리뷰할 수는 없다.
대신 “입력”을 조여야 한다.
(A) 사용자 입력 time zone은 화이트리스트로
from zoneinfo import ZoneInfo
ALLOWED_TZ = {
"UTC",
"Asia/Seoul",
"America/Los_Angeles",
}
def get_tz(name: str) -> ZoneInfo:
if name not in ALLOWED_TZ:
# 서비스 정책에 따라 기본값/에러
name = "UTC"
return ZoneInfo(name)
화이트리스트는 귀찮지만, 운영에서 가장 안전하다.
특히 B2B/웹훅처럼 외부가 주는 값이면 더 그렇다.
(B) 최소한의 방어: “존재 확인 + 예외 처리”
화이트리스트가 어렵다면 최소한 예외를 잡자.
from zoneinfo import ZoneInfo, ZoneInfoNotFoundError
def safe_zoneinfo(name: str) -> ZoneInfo:
try:
return ZoneInfo(name)
except ZoneInfoNotFoundError:
return ZoneInfo("UTC")
이걸 안 하면, 잘못된 입력이 500으로 이어지는 사고가 난다.
5) 컨테이너/서버에서 더 중요한 것: tzdata 업데이트
zoneinfo는 코드만 업데이트해도 끝이 아니다.
- 시스템 tzdata가 구버전이면
- 규칙이 바뀐 나라/기간에서
- “맞는 듯한데 틀린 시간”이 나올 수 있다
그래서 운영 체크리스트를 이렇게 두 줄로 남겨두면 좋다.
- Python 패치(3.14.x 등) 업데이트
- tzdata 업데이트(시스템 또는 PyPI tzdata)
둘 중 하나만 최신이면, 반쪽짜리다.
![]()
6) “운영자 관점”에서 제일 중요한 질문 5개
코어 패치 소식을 들었을 때, 개발자가 제일 먼저 해야 하는 질문은 기능 질문이 아니다.
아래 5개를 체크하면, 대응이 빨라진다.
1) 우리 서비스가 zoneinfo를 쓰나? 어디서 쓰나? - 직접 import 안 해도, datetime 처리 라이브러리/프레임워크가 내부에서 쓸 수 있다.
2) time zone 입력이 외부에서 들어오나? - 웹훅/프로필/CSV 업로드 등 ‘입력 경로’를 찾는 게 우선이다.
3) 우리 배포 환경의 tzdata는 어디서 오나? - OS 패키지인가, PyPI tzdata 폴백인가.
4) Python 업데이트가 자동인가, 수동인가? - 수동이면, 결국 늦는다.
5) 실패 시 정책이 정해져 있나? (UTC 폴백/에러/로그) - 이게 없으면 오류가 500으로 번지고, 장애가 된다.
이 다섯 질문을 팀 위키에 남겨두면, 다음 번에도 똑같이 대응할 수 있다.
보너스로, 이 이슈를 “남의 일”로 만들지 않게 하는 가장 쉬운 방법은 로그 한 줄이다.
- time zone 입력이 들어오는 엔드포인트/배치에서
- 실패한 time zone 문자열을 샘플링해서 남긴다
이렇게 하면 “실제로 어떤 입력이 들어오는지”가 눈에 보이고, 화이트리스트/폴백 정책을 더 빨리 잡을 수 있다.
7) 팀 적용 순서(30분) — “진짜로” 할 수 있는 것만
1) 런타임 Python이 어디서 결정되는지 문서화 2) 패치 릴리스 자동 업데이트 규칙(이미지/런타임) 3) zoneinfo 스모크 테스트 2개 추가 4) time zone 입력 처리(화이트리스트 or 예외 처리) 적용 5) tzdata 업데이트 경로(시스템/패키지) 확인
이 5개만 해도, 이런 류의 코어 패치가 나올 때마다 흔들리지 않는다.
Sources
- CPython PR #148087 — gh-145883: Fix two heap-buffer-overflows in
_zoneinfo(merged 2026-04-04)- https://github.com/python/cpython/pull/148087
- Python docs —
zoneinfomodule- https://docs.python.org/3/library/zoneinfo.html
Keywords
python,zoneinfo,security,heap-buffer-overflow,timezone,tzdata,iana,pep 615,cpython,patch,upgrade,container,linux,windows,validation,CI,dependency
이미지 크레딧/라이선스
- Beautiful technology (Unsplash).jpg — Thomas Kvistholt / CC0
- https://commons.wikimedia.org/wiki/File:Beautiful_technology_(Unsplash).jpg
- http://creativecommons.org/publicdomain/zero/1.0/deed.en
- Man with smartphone and laptop (Unsplash).jpg — Alejandro Escamilla / CC0
- https://commons.wikimedia.org/wiki/File:Man_with_smartphone_and_laptop_(Unsplash).jpg
- http://creativecommons.org/publicdomain/zero/1.0/deed.en
댓글
댓글 쓰기