প্রকাশিত: মার্চ 19, 2025
Skrifa মরিচা-এ লেখা, এবং আমাদের সমস্ত ব্যবহারকারীদের জন্য Chrome-এ ফন্ট প্রক্রিয়াকরণকে নিরাপদ করতে FreeType-এর প্রতিস্থাপন হিসাবে তৈরি করা হয়েছে। Skifra রাস্টের মেমরি সুরক্ষার সুবিধা নেয় এবং Chrome-এ ফন্ট প্রযুক্তির উন্নতিতে আমাদেরকে দ্রুত পুনরাবৃত্তি করতে দেয়। FreeType থেকে Skrifa-এ চলে যাওয়া আমাদের ফন্ট কোডে পরিবর্তন করার সময় আমাদের চটপটে এবং নির্ভীক হতে দেয়। আমরা এখন নিরাপত্তা বাগগুলি ঠিক করতে অনেক কম সময় ব্যয় করি, যার ফলে দ্রুত আপডেট হয়, এবং উন্নত কোডের গুণমান।
এই পোস্টটি শেয়ার করে যে কেন Chrome FreeType থেকে দূরে সরে গেছে, এবং এই পদক্ষেপটি সক্ষম হয়েছে তার উন্নতির কিছু আকর্ষণীয় প্রযুক্তিগত বিবরণ।
কেন FreeType প্রতিস্থাপন?
ওয়েবটি অনন্য যে এটি ব্যবহারকারীদের বিভিন্ন ধরণের অবিশ্বস্ত উত্স থেকে অবিশ্বস্ত সংস্থানগুলিকে এই প্রত্যাশার সাথে আনতে দেয় যে জিনিসগুলি ঠিক কাজ করবে এবং তারা এটি করতে নিরাপদ। এই অনুমানটি সাধারণত সঠিক, তবে ব্যবহারকারীদের কাছে সেই প্রতিশ্রুতি পালন করা একটি ব্যয়বহুল। উদাহরণস্বরূপ, নিরাপদে একটি ওয়েব ফন্ট ব্যবহার করতে (নেটওয়ার্কের মাধ্যমে একটি ফন্ট বিতরণ করা হয়) Chrome বেশ কয়েকটি নিরাপত্তা প্রশমন নিযুক্ত করে:
- ফন্ট প্রক্রিয়াকরণ দুটি নিয়ম অনুসারে স্যান্ডবক্স করা হয়: তারা অবিশ্বস্ত এবং সেবনকারী কোড অনিরাপদ।
- প্রক্রিয়াকরণের আগে ফন্টগুলি ওপেনটাইপ স্যানিটাইজারের মাধ্যমে পাস করা হয়।
- ফন্ট ডিকম্প্রেসিং এবং প্রক্রিয়াকরণের সাথে জড়িত সমস্ত লাইব্রেরি ফাজ পরীক্ষা করা হয়।
ক্রোম ফ্রি টাইপের সাথে পাঠায় এবং এটিকে Android, ChromeOS এবং Linux-এ প্রাথমিক ফন্ট প্রসেসিং লাইব্রেরি হিসাবে ব্যবহার করে। তার মানে FreeType-এ কোনো দুর্বলতা থাকলে অনেক ব্যবহারকারীর সামনে পড়ে।
ফ্রি টাইপ লাইব্রেরিটি ক্রোম দ্বারা মেট্রিক্স গণনা করতে এবং ফন্ট থেকে নির্দেশিত রূপরেখা লোড করতে ব্যবহৃত হয়। সামগ্রিকভাবে, FreeType-এর ব্যবহার Google-এর জন্য একটি বিশাল জয়। এটি একটি জটিল কাজ করে, এবং এটি ভাল করে, আমরা এটির উপর ব্যাপকভাবে নির্ভর করি এবং এতে আবার অবদান রাখি। যাইহোক, এটি অনিরাপদ কোডে লেখা এবং এর উৎপত্তি এমন সময়ে হয়েছে যখন দূষিত ইনপুট কম ছিল। শুধুমাত্র অস্পষ্টতার মাধ্যমে পাওয়া সমস্যাগুলির স্ট্রিমের সাথে তাল মিলিয়ে চলার জন্য Google কমপক্ষে 0.25 ফুল টাইম সফ্টওয়্যার ইঞ্জিনিয়ারদের খরচ করে৷ আরও খারাপ, আমরা ব্যবহারকারীদের কাছে কোডটি পাঠানোর পরেই পর্যবেক্ষণযোগ্যভাবে সবকিছু খুঁজে পাই না বা জিনিসগুলি খুঁজে পাই না।
সমস্যার এই প্যাটার্নটি FreeType-এর জন্য অনন্য নয়, আমরা লক্ষ্য করি যে অন্যান্য অনিরাপদ লাইব্রেরিগুলি যখন আমরা খুঁজে পেতে পারি এমন সেরা সফ্টওয়্যার ইঞ্জিনিয়ার ব্যবহার করলেও সমস্যা স্বীকার করে, প্রতিটি পরিবর্তনের কোড পর্যালোচনা করে এবং পরীক্ষার প্রয়োজন হয়।
কেন সমস্যাগুলি লুকিয়ে থাকে
আমরা যখন FreeType-এর নিরাপত্তা মূল্যায়ন করেছি, তখন আমরা তিনটি প্রধান শ্রেণীতে সমস্যাটি লক্ষ্য করেছি (অ-সম্পূর্ণ):
একটি অনিরাপদ ভাষার ব্যবহার
প্যাটার্ন/ইস্যু | উদাহরণ |
---|---|
ম্যানুয়াল মেমরি ব্যবস্থাপনা |
|
আনচেক করা অ্যারে অ্যাক্সেস | CVE-2022-27404 |
পূর্ণসংখ্যা ওভারফ্লো | CFF অঙ্কন এবং ইঙ্গিতের TrueType ইঙ্গিতের জন্য এমবেডেড ভার্চুয়াল মেশিনগুলি সম্পাদনের সময় https://issues.oss-fuzz.com/issues?q=FreeType%20Integer-overflow |
শূন্যের ভুল ব্যবহার বনাম অ-শূন্য বরাদ্দ | https://gitlab.freedesktop.org/freetype/freetype/-/merge_requests/94- এ আলোচনা, 8টি ফাজার সমস্যা পরে পাওয়া গেছে |
অবৈধ কাস্ট | ম্যাক্রো ব্যবহারের উপর নিচের সারিটি দেখুন |
প্রকল্প নির্দিষ্ট সমস্যা
প্যাটার্ন/ইস্যু | উদাহরণ |
---|---|
ম্যাক্রোগুলি স্পষ্ট আকারের টাইপিংয়ের অস্পষ্ট অভাব |
|
নতুন কোড ধারাবাহিকভাবে বাগ যোগ করে, এমনকি যখন আত্মরক্ষামূলকভাবে লেখা হয়। |
|
পরীক্ষার অভাব |
|
নির্ভরতা সমস্যা
Fuzzing লাইব্রেরিতে বারবার সমস্যা চিহ্নিত করেছে FreeType নির্ভর করে, যেমন bzip2, libpng এবং zlib। একটি উদাহরণ হিসাবে, freetype_bdf_fuzzer তুলনা করুন: inflate-এ ব্যবহার-অপ্রাথমিক-মান ।
ফাজিং যথেষ্ট নয়
র্যান্ডমাইজ করা অবৈধ সহ বিস্তৃত ইনপুট সহ অটোমেটেড টেস্টিং-এর অর্থ হল Chrome-এর স্থিতিশীল রিলিজে অনেক ধরনের সমস্যা খুঁজে বের করা। আমরা Google-এর oss-fuzz প্রকল্পের অংশ হিসাবে FreeType fuzz করি৷ এটি সমস্যাগুলি খুঁজে পায়, তবে ফন্টগুলি নিম্নোক্ত কারণগুলির জন্য অস্পষ্ট হওয়ার জন্য কিছুটা প্রতিরোধী প্রমাণিত হয়েছে।
ফন্ট ফাইলগুলি জটিল, ভিডিও ফাইলগুলির সাথে তুলনীয় কারণ এতে একাধিক বিভিন্ন ধরণের তথ্য রয়েছে৷ ফন্ট ফাইলগুলি একাধিক টেবিলের জন্য একটি ধারক বিন্যাস, যেখানে প্রতিটি টেবিল স্ক্রীনে সঠিকভাবে অবস্থান করা গ্লিফ তৈরি করার জন্য পাঠ্য এবং ফন্টগুলিকে একসাথে প্রক্রিয়া করার জন্য আলাদা উদ্দেশ্য পরিবেশন করে। একটি ফন্ট ফাইলে আপনি পাবেন:
- স্ট্যাটিক মেটাডেটা যেমন ফন্টের নাম এবং পরিবর্তনশীল ফন্টের পরামিতি।
- ইউনিকোড অক্ষর থেকে গ্লিফ পর্যন্ত ম্যাপিং।
- গ্লিফের স্ক্রিন লেআউটের জন্য একটি জটিল নিয়ম এবং ব্যাকরণ।
- ভিজ্যুয়াল তথ্য: স্ক্রিনে রাখা গ্লিফগুলি কেমন দেখায় তা বর্ণনা করে গ্লিফ আকার এবং চিত্র তথ্য।
- ভিজ্যুয়াল টেবিলের মধ্যে ট্রুটাইপ ইঙ্গিত প্রোগ্রামগুলি অন্তর্ভুক্ত থাকতে পারে, যেগুলি গ্লাইফ আকৃতি পরিবর্তন করার জন্য কার্যকর করা ছোট প্রোগ্রাম।
- CFF বা CFF2 টেবিলের চার স্ট্রিং যা CFF রেন্ডারিং ইঞ্জিনে কার্যকর করা আবশ্যিক বক্ররেখা অঙ্কন এবং ইঙ্গিত নির্দেশাবলী।
ফন্ট ফাইলগুলির নিজস্ব প্রোগ্রামিং ভাষা এবং স্টেট মেশিন প্রক্রিয়াকরণের সমতুল্য জটিলতা রয়েছে, সেগুলি চালানোর জন্য নির্দিষ্ট ভার্চুয়াল মেশিনের প্রয়োজন।
বিন্যাসের জটিলতার কারণে, ফন্ট ফাইলগুলিতে সমস্যাগুলি খুঁজে পেতে অস্পষ্টতার ত্রুটি রয়েছে।
ভাল কোড কভারেজ বা ফাজার অগ্রগতি নিম্নলিখিত কারণে অর্জন করা কঠিন:
- ফাজিং ট্রু টাইপ হিন্টিং প্রোগ্রাম, সিএফএফ চার স্ট্রিং এবং ওপেনটাইপ লেআউট ব্যবহার করে সাধারণ বিট-ফ্লিপিং/শিফ্ট/ইনসার্শন/ডিলিট-স্টাইল মিউটেটরগুলি রাজ্যের সমস্ত সংমিশ্রণে পৌঁছানোর জন্য লড়াই করে।
- Fuzzing অন্তত আংশিক বৈধ কাঠামো উত্পাদন প্রয়োজন. র্যান্ডম মিউটেশন খুব কমই তা করে, ভাল কভারেজ অর্জন করা কঠিন করে তোলে, বিশেষ করে কোডের গভীর স্তরের জন্য।
- ClusterFuzz এবং oss-fuzz-এ বর্তমান অস্পষ্ট প্রচেষ্টা এখনও কাঠামো-সচেতন মিউটেশন ব্যবহার করছে না। ব্যাকরণ- বা স্ট্রাকচার-সচেতন মিউটেটরগুলির ব্যবহার প্রাথমিকভাবে প্রত্যাখ্যান করা রূপগুলির উত্পাদন এড়াতে সাহায্য করতে পারে, বিকাশে আরও সময় নেওয়ার খরচে, এবং অনুসন্ধানের স্থানের অংশগুলি মিস করার সম্ভাবনার প্রবর্তন করতে পারে।
অগ্রগতির জন্য অস্পষ্ট করার জন্য একাধিক টেবিলের ডেটা সিঙ্কে থাকা প্রয়োজন:
- ফুজারগুলির স্বাভাবিক মিউটেশন প্যাটার্নগুলি আংশিকভাবে বৈধ ডেটা তৈরি করে না তাই অনেকগুলি পুনরাবৃত্তি প্রত্যাখ্যান করা হয় এবং অগ্রগতি ধীর হয়ে যায়।
- গ্লাইফ ম্যাপিং, ওপেনটাইপ লেআউট টেবিল এবং গ্লাইফ অঙ্কন সংযুক্ত এবং একে অপরের উপর নির্ভর করে, একটি সংমিশ্রিত স্থান তৈরি করে যার কোণগুলি অস্পষ্ট হয়ে পৌঁছানো কঠিন।
- উদাহরণস্বরূপ, উচ্চ-তীব্রতার tt_face_get_paint COLRv1 দুর্বলতা খুঁজে পেতে 10 মাসেরও বেশি সময় লেগেছে।
আমাদের সর্বোত্তম প্রচেষ্টা সত্ত্বেও, ফন্ট সুরক্ষা সমস্যাগুলি বারবার শেষ ব্যবহারকারীদের কাছে পৌঁছেছে। একটি মরিচা বিকল্প দিয়ে FreeType প্রতিস্থাপন করা দুর্বলতার একাধিক সম্পূর্ণ শ্রেণীর প্রতিরোধ করবে।
ক্রোমে স্ক্রিফা
স্কিয়া হল Chrome দ্বারা ব্যবহৃত গ্রাফিক্স লাইব্রেরি। ফন্ট থেকে মেটাডেটা এবং লেটারফর্ম লোড করতে স্কিয়া ফ্রি টাইপের উপর নির্ভর করে। Skrifa হল একটি Rust লাইব্রেরি, লাইব্রেরির ফন্টেশন পরিবারের অংশ, যা Skia দ্বারা ব্যবহৃত FreeType-এর অংশগুলির জন্য একটি নিরাপদ প্রতিস্থাপন প্রদান করে।
ফ্রি টাইপকে স্কিয়াতে রূপান্তর করতে ক্রোম টিম স্ক্রিফার উপর ভিত্তি করে একটি নতুন স্কিয়া ফন্ট ব্যাকএন্ড তৈরি করেছে এবং ধীরে ধীরে ব্যবহারকারীদের কাছে পরিবর্তনটি চালু করেছে:
- ক্রোম 128 (আগস্ট 2024) এ আমরা নিরাপদ ট্রায়াল রান হিসাবে কম ব্যবহৃত ফন্ট ফরম্যাটে, যেমন রঙ ফন্ট এবং CFF2-এর জন্য ব্যবহার করার জন্য ফন্টেশন সক্ষম করেছি ।
- ক্রোম 133 (ফেব্রুয়ারি 2025) এ আমরা Linux, Android এবং ChromeOS-এ সমস্ত ওয়েব ফন্ট ব্যবহারের জন্য এবং Windows এবং Mac-এ ফলব্যাক হিসাবে ওয়েব ফন্ট ব্যবহারের জন্য ফন্টেশন সক্ষম করেছি —যে ক্ষেত্রে সিস্টেমটি ফন্ট ফর্ম্যাট সমর্থন করে না কিন্তু Chrome-এর এটি প্রদর্শন করা প্রয়োজন।
Chrome-এ ইন্টিগ্রেশনের জন্য, আমরা Chrome সিকিউরিটি টিম দ্বারা প্রবর্তিত কোডবেসে মরিচা-এর মসৃণ ইন্টিগ্রেশনের উপর নির্ভর করি৷
ভবিষ্যতে আমরা অপারেটিং সিস্টেমের ফন্টগুলির জন্যও হরফগুলি স্যুইচ করব, লিনাক্স এবং ক্রোমওএস দিয়ে শুরু করে, তারপরে অ্যান্ড্রয়েডে৷
নিরাপত্তা, প্রথম এবং সর্বাগ্রে
আমাদের প্রাথমিক লক্ষ্য হ'ল মেমরিতে সীমার বাইরে অ্যাক্সেসের কারণে সৃষ্ট সুরক্ষা দুর্বলতাগুলি হ্রাস করা (বা আদর্শভাবে দূর করা!)। যতক্ষণ না আপনি কোনও অনিরাপদ কোড ব্লক এড়ান ততক্ষণ মরিচা এটিকে বাক্সের বাইরে সরবরাহ করে।
আমাদের কর্মক্ষমতা লক্ষ্যগুলির জন্য আমাদের এমন একটি অপারেশন করতে হবে যা বর্তমানে অনিরাপদ: একটি দৃঢ়ভাবে টাইপ করা ডেটা স্ট্রাকচার হিসাবে স্বেচ্ছাচারী বাইটের পুনর্ব্যাখ্যা। এটি আমাদেরকে অপ্রয়োজনীয় কপি না করে একটি ফন্ট ফাইল থেকে ডেটা পড়তে দেয় এবং একটি দ্রুত ফন্ট পার্সার তৈরির জন্য অপরিহার্য।
আমাদের নিজস্ব অনিরাপদ কোড এড়াতে, আমরা বাইটমকের এই দায়িত্ব আউটসোর্স করার জন্য বেছে নিয়েছি যা এই উদ্দেশ্যে বিশেষভাবে ডিজাইন করা একটি মরিচা লাইব্রেরি এবং বাস্তুতন্ত্র জুড়ে ব্যাপকভাবে পরীক্ষিত এবং ব্যবহৃত হয়। বাইটেমাকে কাঁচা ডেটা পুনর্ব্যাখ্যাকে কেন্দ্রীভূত করা নিশ্চিত করে যে আমাদের এই কার্যকারিতা এক জায়গায় আছে এবং নিরীক্ষিত হয়েছে এবং উদ্দেশ্যের জন্য অনিরাপদ কোড পুনরাবৃত্তি করা এড়াতে হবে। নিরাপদ ট্রান্সমিউট প্রকল্পের লক্ষ্য হল এই কার্যকারিতাটি সরাসরি রাস্ট কম্পাইলারে অন্তর্ভুক্ত করা এবং আমরা এটি উপলব্ধ হওয়ার সাথে সাথে সুইচটি তৈরি করব।
সঠিকতা বিষয়
Skrifa স্বাধীন উপাদান দিয়ে তৈরি করা হয়েছে যেখানে বেশিরভাগ ডেটা স্ট্রাকচার অপরিবর্তনীয় হওয়ার জন্য ডিজাইন করা হয়েছে। এটি পঠনযোগ্যতা, রক্ষণাবেক্ষণযোগ্যতা এবং মাল্টিথ্রেডিং উন্নত করে। এটি ইউনিট পরীক্ষার জন্য কোডটিকে আরও উপযুক্ত করে তোলে। আমরা এই সুযোগের সদ্ব্যবহার করেছি এবং প্রায় 700টি ইউনিট পরীক্ষার একটি স্যুট তৈরি করেছি যা নিম্ন স্তরের পার্সিং রুটিন থেকে উচ্চ স্তরের ইঙ্গিত ভার্চুয়াল মেশিন পর্যন্ত আমাদের সম্পূর্ণ স্ট্যাককে কভার করে।
শুদ্ধতাও বিশ্বস্ততাকে বোঝায় এবং ফ্রি টাইপ উচ্চ মানের রূপরেখা তৈরির জন্য অত্যন্ত সম্মানিত। একটি উপযুক্ত প্রতিস্থাপন হতে আমাদের অবশ্যই এই গুণটি মেলে। সেই লক্ষ্যে, আমরা ফন্টলেট নামে একটি বেসপোক টুল তৈরি করেছি যা বিস্তৃত কনফিগারেশন জুড়ে ফন্ট ফাইলগুলির ব্যাচগুলির জন্য স্ক্রিফা এবং ফ্রি টাইপের আউটপুট তুলনা করে। এটি আমাদের কিছু আশ্বাস দেয় যে আমরা মানের ক্ষেত্রে রিগ্রেশন এড়াতে পারি।
উপরন্তু, Chromium-এ একীভূত হওয়ার আগে, আমরা Skia-এ পিক্সেল তুলনার একটি বিস্তৃত সেট চালিয়েছিলাম, সমস্ত প্রয়োজনীয় রেন্ডারিং মোডগুলিতে (বিভিন্ন অ্যান্টিলিয়াসিং এবং হিন্টিং মোড জুড়ে) পিক্সেল পার্থক্যগুলি একেবারে ন্যূনতম নিশ্চিত করার জন্য ফ্রি টাইপ রেন্ডারিংয়ের সাথে Skrifa এবং Skia রেন্ডারিংয়ের তুলনা করেছিলাম।
সফ্টওয়্যারের একটি অংশ কীভাবে বিকৃত এবং দূষিত ইনপুটগুলিতে প্রতিক্রিয়া দেখাবে তা নির্ধারণ করার জন্য ফাজ টেস্টিং একটি গুরুত্বপূর্ণ হাতিয়ার। আমরা 2024 সালের জুন থেকে আমাদের নতুন কোডটি ক্রমাগত অস্পষ্ট করছি। এটি রাস্ট লাইব্রেরি এবং ইন্টিগ্রেশন কোডকে কভার করে। যদিও fuzzer (এই লেখার হিসাবে) 39টি বাগ খুঁজে পেয়েছে, এটি লক্ষণীয় যে এগুলোর কোনোটিই নিরাপত্তা সংক্রান্ত সমালোচনামূলক ছিল না । তারা অবাঞ্ছিত চাক্ষুষ ফলাফল বা এমনকি নিয়ন্ত্রিত ক্র্যাশ হতে পারে, কিন্তু শোষণযোগ্য দুর্বলতার দিকে পরিচালিত করবে না।
অগ্রগামী !
আমরা পাঠ্যের জন্য মরিচা ব্যবহার করার আমাদের প্রচেষ্টার ফলাফল নিয়ে খুব খুশি। ব্যবহারকারীদের কাছে নিরাপদ কোড সরবরাহ করা এবং বিকাশকারীর উত্পাদনশীলতা অর্জন করা আমাদের জন্য একটি বিশাল জয়। আমরা আমাদের টেক্সট স্ট্যাকগুলিতে মরিচা ব্যবহার করার সুযোগগুলি সন্ধান করার পরিকল্পনা করছি। আপনি যদি আরও জানতে চান, অক্সিডাইজ কিছু Google ফন্টের ভবিষ্যত পরিকল্পনার রূপরেখা দেয়।