ایک 65-بائٹ کی ماڈل فائل مقبول Llama CPP inference engine کو اچانک روک سکتی ہے۔ یہ چھوٹا سا پے لوڈ (payload) پارسر کے اندر division-by-zero کا سبب بنتا ہے، جس سے SIGFPE کریش ہو جاتا ہے۔

یہ کریش کیوں اہم ہے

کیا غلط ہوا

پارسر ماڈل میٹا ڈیٹا کو C++ structures میں پڑھتا ہے اور یہ چیک کرتا ہے کہ ہر tensor dimension "non-negative" (غیر منفی) ہو۔ صفر اس شرط پر پورا اترتا ہے، اس لیے چیک پاس ہو جاتا ہے۔ کوڈ کی اگلی لائن اس dimension کو ایک ایسی کیلکولیشن میں divisor کے طور پر استعمال کرتی ہے جو یہ فرض کرتی ہے کہ ویلیو positive (مثبت) ہے۔ جب dimension صفر ہوتی ہے، تو یہ تقسیم ایک floating-point exception (SIGFPE) پیدا کرتی ہے اور پروگرام کو ختم کر دیتی ہے۔

ویلیڈیشن نے صرف مطلوبہ invariant کے آدھے حصے کو کور کیا: اس نے منفی ویلیوز کو تو روک دیا لیکن صفر کو نظر انداز کر دیا، جو کہ بعد میں ہونے والی ریاضیاتی کارروائیوں (arithmetic) کے لیے اتنا ہی غیر محفوظ ہے۔

ڈویلپرز کو کیا کرنا چاہیے

  • ماڈل فائلوں کو binaries کی طرح سمجھیں۔ ماڈل لوڈ کرنا خام بائٹس (raw bytes) کو میموری اسٹرکچرز میں تبدیل کرتا ہے، جو کہ ایک کلاسک باؤنڈری ہے جہاں غیر چیک شدہ ڈیٹا پروسیس کو کریش کر سکتا ہے یا اس سے بھی بدتر نقصان پہنچا سکتا ہے۔
  • جزوی چیک سے بچیں۔ ایسی شرط جو مطلوبہ invariant کے صرف ایک حصے کو کور کرتی ہے، وہ تحفظ کا غلط احساس دلاتی ہے۔ یہاں، "non-negative" کافی نہیں تھا؛ کوڈ کو "positive" کی ضرورت تھی۔
  • ہر چیک کے بعد مفروضوں پر سوال اٹھائیں۔ جب کوئی bounds test نظر آئے، تو اس بات کی تصدیق کریں کہ اس کے بعد والا کوڈ کسی زیادہ سخت پراپرٹی پر انحصار نہ کر رہا ہو۔
  • fuzzing tools کا استعمال کریں۔ مصنف نے libFuzzer کو AddressSanitizer کے ساتھ چلا کر اس بگ (bug) کو دریافت کیا، جو ان پٹس کو تبدیل (mutate) کرتا ہے اور division by zero جیسی غیر قانونی کارروائیوں کی نشاندہی کرتا ہے۔

اصلاح (fix) کیسے لاگو کی گئی

اس اصلاح میں ایک گارڈ (guard) شامل کیا گیا ہے جو اس وقت overflow کیلکولیشن کو چھوڑ دیتا ہے جب dimension صفر کے برابر ہو۔ یہ چھوٹا سا کنڈیشنل (conditional) جائز صفر سائز کے tensors کے لیے سپورٹ کو برقرار رکھتا ہے—جو کچھ ماڈل ورینٹس میں اختیاری فیچرز کے لیے استعمال ہوتے ہیں—اور ساتھ ہی کریش ہونے کے راستے کو ختم کر دیتا ہے۔

حاصلِ کلام: ایک اکیلی 65-بائٹ کی فائل بڑے پیمانے پر استعمال ہونے والے inference engine کو بند کر سکتی ہے؛ مکمل ویلیڈیشن اور منظم fuzzing ماڈل لوڈرز کو محفوظ رکھتی ہے۔

ماخذ: https://dev.to/harrisonsec/your-model-file-is-untrusted-input-1eap