Rust 1.98.1 خطای تولید نادرست Vtable را اصلاح میکند؛ Trait Objectها را بررسی کنید
نسخه Rust 1.98.1 یک باگ rustc را برطرف میکند که ممکن بود در vtable مربوط به trait object، بهجای اشارهگر تابع، اشارهگر تهی قرار دهد. این رخداد نشان میدهد ارتقای کامپایلر باید بخشی از اعتبارسنجی باینری و بررسی امنیتی باشد.

Rust 1.98.1 در ۳ سپتامبر منتشر شد و یک خطای تولید نادرست در rustc هنگام ساخت vtableهای مربوط به trait object را اصلاح کرد. شرح باگ محدود است، اما پیامد احتمالی آن جدی است: در برخی شرایط، کامپایلر ممکن بود در خانهای از vtable که باید اشارهگر تابع قرار گیرد، اشارهگر تهی بگذارد. اعلامیه رسمی Rust میگوید کد تولیدشده در این حالت دچار رفتار تعریفنشده میشود؛ نشانهای مانند segmentation fault ممکن است رخ دهد و، مانند هر رفتار تعریفنشده، نمیتوان پیامدهای دلخواه دیگر را کاملاً منتفی دانست.
پیام عملی برای تیمهای Rust این نیست که همه باینریهای ساختهشده با Rust 1.98.0 ناامن هستند. نکته این است که یک نسخه کامپایلر میتواند وضعیت اعتماد یک artifact از قبل ساختهشده را تغییر دهد. برنامهای که از dispatch پویا، مانند dyn Trait، استفاده میکند ممکن است بدون خطا کامپایل شود و آزمونهای معمول را پشت سر بگذارد، اما همچنان به metadata تولیدشده توسط کامپایلر وابسته باشد که در یک حالت خاص نادرست تولید شده است.
نسخه 1.98.1 یک اصلاح هدفمند است، نه اضافهشدن قابلیت جدید. نسخه رسمی GitHub این تغییر را اصلاح miscompilation هنگام تولید vtable معرفی میکند و وبلاگ Rust برای نصبهای موجود rustup، اجرای rustup update stable را پیشنهاد میدهد. تیمهایی که canister، سرویس یا مؤلفه native تولید میکنند باید این بهروزرسانی را یک کار مربوط به زنجیره تأمین و بازتولیدپذیری بدانند: نسخه کامپایلر را ثبت کنند، artifactهای مربوط را دوباره بسازند و، هرجا فرایند اجازه میدهد، checksum یا خروجی استقرار را مقایسه کنند.
در بازبینی، تمرکز را روی کدهایی بگذارید که از trait object در مرزهای مهم استفاده میکنند: registryهای plugin، handlerهای boxed، callback tableها، dispatch نزدیک به FFI و buildهای بهینهسازیشده release. آزمونهایی را که همه مسیرهای مهم dispatch پویا را اجرا میکنند دوباره انجام دهید و artifact بازسازیشده را از همان دروازههای اعتبارسنجی معمول عبور دهید. اگر باینری ساختهشده با 1.98.0 فعلاً قابل بازسازی نیست، منشأ و نسخه ساخت آن را دقیق نگه دارید و اجرای موفق را بهتنهایی نشانه بیاثر بودن باگ تلقی نکنید.
یک محدودیت مهم باقی میماند: یادداشت انتشار مشخص نمیکند کدام targetها، تنظیمات بهینهسازی یا الگوهای کد تحت تأثیر قرار میگیرند. بنابراین توسعهدهندگان نباید از این توضیح کوتاه، نه آسیبپذیری همگانی و نه ایمنی همگانی را نتیجه بگیرند. بازتولید محلی هم ممکن است دشوار باشد، چون باگ به رفتار کامپایلر و شکل برنامه وابسته است؛ پاسخ عملی محتاطانه، بهروزرسانی و بازسازی، سپس اعتبارسنجی artifact است.
تضمینهای ایمنی حافظه در Rust، نگرانی مربوط به صحت کامپایلر را از بین نمیبرد. کامپایلری که metadata نادرست برای dispatch تولید کند میتواند خطا را به لایهای پایینتر از سطحی ببرد که آزمونهای برنامه معمولاً بررسی میکنند. Rust 1.98.1 یادآوری میکند که خود کامپایلر نیز باید در سطح بررسی امنیت و قابلیت اطمینان تولید قرار گیرد.
خبرخوان را در ایمیل بگیرید
هر سیگنال تازه، مستقیم از خط تولید. بدون مزاحمت، لغو عضویت در هر زمان.


