HeadlinesBriefing favicon HeadlinesBriefing.com

Python str.lower() IDNA নিরাপত্তা বাগ ঠিক করা হয়েছে

Hacker News •
×

কিছু ইন্টারনেট মানদণ্ড কেবলমান ASCII অক্ষরগুলিকে সমর্থন করে, কিন্তু বিশ্বজুড়ে ল্যাটিন বর্ণমালার বইরে বেশি ব্যবহৃত হয়। তাই, ডোমেইন নামগুলিতে ব্যবহারের জন্য Unicode কে ASCII-এ ম্যাপ করার প্রয়োজন রয়েছে। Name Prep এই সমাধানের একটি অংশ ছিল, RFC 3491-এ String Prep-এর একটি প্রোফাইল হিসেবে পরিভাষিত ছিল, এবং Internationalizing Domain Names in Applications (IDNA)-এর একটি মূল উপাদান ছিল, যা "IDNA 2003" বলে ও পরিচিত। String Prep এ্যালগরিদমটি RFC 3454-এ পরিভাষিত ছিল। IDNA 2003 কে RFC 5890, 5891, 5892 এবং 5893-এ পরিভাষিত IDNA 2008 দ্বারা পুনর্বিংশায়িত করা হয়েছে। Python IDNA 2003কে idna কোডেক (str.encode('idna')) মাধ্যমে সমর্থন করে এবং IDNA 2008 Python প্যাকেজ ইনডেক্সে অবস্থিত idna প্যাকেজ দ্বারা সমর্থিত। Python-এর String Prep-এর ইমপ্লিমেন্টেশন সাধারণ লাইব্রেরিতে stringprep মডিউলে ইমপ্লিমেন্ট করা হয়েছে।

সাধারণত, আপনি idna প্যাকেজ (IDNA 2008) ব্যবহার করা উচিত এবং .encode("idna") (IDNA 2003) নয়, কিন্তু কখনও কখনও আপনাকে পুরনো আচরণ প্রয়োজন হয়। String Prep সেকশন 3.2-এ "case folding" ধাপ নির্ধারণ করে (case folding প্রায় "কীভাবে একটি কোডপয়িন্টকে লো/হাই কেসে কনভার্ট করবে" এমন), যা স্ট্রিংগুলির কেস-ইনসেন্সিটিভ কম্পেরিজন সম্ভব করে, ব্যবহার করে মানচিত্র B.2 এবং B.3 টেবিলগুলির মাধ্যমে সমস্ত অক্ষরকে ম্যাপ করে। B.2 মূলত str.lower() হলো, যা Unicode নিয়মগুলির অনুসারে সমস্ত অক্ষরকে লোরকেসে রূপান্তর করে এবং B.3 তে ব্যতিক্রম থাকে।

এই ফাংশনের str.lower() কলটি একটি বাগ যুক্ত করে দেয়! কারণ str নির্দিষ্ট Python ইন্টারপ্রেটারের সঙ্গে যুক্ত কোনো Unicode ডেটা ব্যবহার করে, আপনি unicodedata.unidata_version অ্যাক্সেস করে আপনার নির্দিষ্ট Python ইন্টারপ্রেটার কোন Unicode সংস্করণ ব্যবহার করে তা জানা যায়। প্রতিটি Python সংস্করণে Unicode 3.2.0 এর একটি ডাটাবেসও উপলব্ধ আছে (unicodedata.ucd_3_2_0) বিশেষভাবে String Prep এবং IDNA এ্যালগরিদমগুলির জন্য। String Prep এই নির্দিষ্ট Unicode সংস্করণের ওপর নির্ভর করে যাতে সমানভাবে কাজ করে, RFC 3454-এ B.2 এবং B.3 টেবিলগুলি মূলত Unicode 3.2.0 এর case-folding নিয়মগুলি একটি টেবিলে কোডেড করা হয়েছে। তাই, আমরা আধুনিক Unicode case-folding নিয়মগুলি ব্যবহার করার বদলে Unicode 3.2.0 এর case-folding নিয়মগুলি ব্যবহার করতে হব।

এই সমস্যার সমাধান হল একটি নতুন ব্যতিক্রম তৈরি করা যাতে str.lower() কেবলমান নির্দিষ্ট কিছু ফাংশনের জন্য Unicode 3.2.0 ব্যবহার করার মতো আচরণ করে। Bitshift-কে এই বাগ রিপোর্ট করার জন্য ধন্যবাদ, Stan Ulbrych-কে রিমেডিয়েশন উভয়ে সহ-ডেভেলপ করার জন্য ধন্যবাদ, এবং Marc-Andre Lemburg এবং Petr Viktorin-কে রিমেডিয়েশন রিভিউ করার জন্য ধন্যবাদ। আরও বিবরণের জন্য CVE-2026-17084 দেখুন।

কী এনটিটিজ়: কম্পানিগুলি: Python Software Foundation, Alpha-Omega | লোকজন: Seth Larson, Bitshift, Stan Ulbrych, Marc-Andre Lemburg, Petr Viktorin