HeadlinesBriefing favicon HeadlinesBriefing.com

Kesalahan Keamanan IDNA di Python str.lower() Telah Diperbaiki

Hacker News •
×

Beberapa standar internet hanya mendukung karakter ASCII, tetapi dunia menggunakan jauh lebih banyak dari alfabet Latin. Oleh karena itu, diperlukan pemetaan Unicode ke ASCII untuk digunakan dalam nama domain. Name Prep adalah bagian dari solusi tersebut, didefinisikan dalam RFC 3491 sebagai profil String Prep, dan merupakan komponen krusial dari Internationalizing Domain Names in Applications (IDNA), juga dikenal sebagai "IDNA 2003". Algoritma String Prep didefinisikan dalam RFC 3454. IDNA 2003 telah diganti oleh IDNA 2008 yang didefinisikan dalam RFC 5890, 5891, 5892, dan 5893. Python mendukung IDNA 2003 melalui codec idna (str.encode('idna')) dan IDNA 2008 didukung oleh paket idna di Indeks Paket Python. Implementasi Python String Prep diimplementasikan dalam modul stringprep di perpustakaan standar.

Secara umum, Anda seharusnya menggunakan paket idna (IDNA 2008) dan bukan .encode("idna") (IDNA 2003), tetapikadang Anda memang memerlukan perilaku yang lebih lama. String Prep mendefinisikan langkah "case folding" (folding case) dalam Bagian 3.2, memungkinkan perbandingan string yang tidak sensitif terhadap huruf kapital, dengan memetakan semua karakter melalui tabel pemetaan B.2 dan B.3. B.2 pada dasarnya adalah str.lower(), mengubah semua karakter menjadi huruf kecil sesuai dengan aturan Unicode dan B.3 berisi pengecualian.

Panggilan str.lower() dalam fungsi ini adalah kerentanan! Karena str menggunakan data Unicode apa pun yang disertakan dengan interpreter Python tertentu, Anda dapat mengetahui versi Unicode yang digunakan interpreter Python Anda dengan mengakses unicodedata.unidata_version. Ada juga database data Unicode 3.2.0 yang tersedia di semua versi Python (unicodedata.ucd_3_2_0) khusus untuk algoritma String Prep dan IDNA. String Prep bergantung pada versi Unicode tersebut untuk beroperasi secara konsisten, tabel B.2 dan B.3 dalam RFC 3454 pada dasarnya adalah aturan case-folding Unicode 3.2.0 yang dikodekan dalam sebuah tabel. Jadi kita perlu menggunakan aturan case-folding Unicode 3.2.0, bukan aturan case-folding Unicode yang lebih baru.

Perbaikannya adalah membuat pengecualian baru sehingga str.lower() akan berperilaku seolah-olah menggunakan Unicode 3.2.0 untuk fungsi tertentu. Terima kasih kepada Bitshift yang melaporkan kerentanan tersebut, Stan Ulbrych yang berkolaborasi mengembangkan perbaikan, dan Marc-Andre Lemburg serta Petr Viktorin yang meninjau perbaikan tersebut. Lihat CVE-2026-17084 untuk detail lebih lanjut.

Entitas Kunci: Perusahaan: Python Software Foundation, Alpha-Omega | Orang: Seth Larson, Bitshift, Stan Ulbrych, Marc-Andre Lemburg, Petr Viktorin