Seth Michael Larson: 파이썬에서 str.lower()가 보안 취약점인 경우
인터넷 표준은 종종 비-ASCII 문자에 대한 지원이 부족하여 도메인 이름에 대한 매핑이 필요합니다. RFC 3491에 정의된 NamePrep은 IDNA 2003의 일부로 이 목적을 위해 설계되었습니다. 이 이전 IDNA 표준은 이후 RFC 5890-5893에 명시된 IDNA 2008로 대체되었습니다. Python은 두 버전을 모두 지원하며, IDNA 2003은 idna 코덱을 통해, IDNA 2008은 외부 idna 패키지를 통해 접근할 수 있습니다. Python 표준 라이브러리의 stringprep 모듈은 StringPrep을 구현합니다. StringPrep의 중요한 단계는 "대소문자 접기(case folding)"로, 대소문자를 구분하지 않는 비교를 위해 문자를 소문자 또는 대문자로 매핑하는 것을 포함합니다. 이 과정은 Unicode 3.2.0 규칙을 기반으로 하는 RFC 3454의 매핑 테이블 B.2 및 B.3을 사용합니다. Python 구현에서 표준 str.lower() 함수가 최신 Unicode 버전을 사용하여 요구되는 Unicode 3.2.0 대소문자 접기 규칙에서 벗어나는 취약점이 확인되었습니다. 이 불일치로 인해 특정 문자에 대해 다른 IDNA 인코딩이 발생했습니다. 수정은 Python의 str.lower() 동작이 StringPrep 및 IDNA 계산에 대해 Unicode 3.2.0과 일치하도록 특정 예외를 만드는 것을 포함했습니다. 이 수정은 IDNA 2003의 사양과의 일관성을 보장합니다.
str.lower()함수가 최신 Unicode 버전을 사용하여 요구되는 Unicode 3.2.0 대소문자 접기 규칙에서 벗어나는 취약점이 확인되었습니다. 이 불일치로 인해 특정 문자에 대해 다른 IDNA 인코딩이 발생했습니다. 수정은 Python의str.lower()동작이 StringPrep 및 IDNA 계산에 대해 Unicode 3.2.0과 일치하도록 특정 예외를 만드는 것을 포함했습니다. 이 수정은 IDNA 2003의 사양과의 일관성을 보장합니다.