६५-बाइटची एक मॉडेल फाईल लोकप्रिय Llama CPP इन्फरन्स इंजिनला अचानक थांबवू शकते. हा छोटासा पेलोड पार्सरमध्ये 'division-by-zero' घडवून आणतो, ज्यामुळे SIGFPE क्रॅश होतो.
हा क्रॅश का महत्त्वाचा आहे
काय चुकले
पार्सर मॉडेल मेटाडेटा C++ स्ट्रक्चर्समध्ये वाचतो आणि प्रत्येक टेन्सर डायमेंशन "non-negative" आहे की नाही हे तपासतो. शून्य ही अट पूर्ण करते, त्यामुळे ही तपासणी यशस्वी होते. त्यानंतरच्या कोडच्या ओळीत, या डायमेंशनचा वापर विभाजक (divisor) म्हणून अशा गणनेत केला जातो जिथे मूल्य 'positive' असेल असे मानले जाते. जेव्हा डायमेंशन शून्य असते, तेव्हा ही भागाकार प्रक्रिया 'floating-point exception' (SIGFPE) निर्माण करते आणि प्रोग्राम बंद पडतो.
ही व्हॅलिडेशन प्रक्रिया आवश्यक असलेल्या इनव्हेरिएंटच्या (invariant) केवळ अर्ध्या भागावर लक्ष केंद्रित करत होती: तिने ऋण मूल्ये रोखली, परंतु शून्याकडे दुर्लक्ष केले, जे पुढील गणिती क्रियांसाठी तितकेच असुरक्षित आहे.
डेव्हलपर्सनी काय केले पाहिजे
- मॉडेल फाईल्सना बायनरीजप्रमाणे (binaries) समजा. मॉडेल लोड करताना रॉ बाइट्स (raw bytes) मेमरी स्ट्रक्चर्समध्ये पार्स केले जातात; ही एक अशी सीमा आहे जिथे अनचेक केलेला डेटा प्रोसेस क्रॅश करू शकतो किंवा त्याहूनही वाईट परिणाम करू शकतो.
- अपूर्ण तपासणी टाळा. आवश्यक इनव्हेरिएंटचा केवळ काही भाग कव्हर करणारी अट सुरक्षेचा खोटा आभास देते. येथे, "non-negative" पुरेसे नव्हते; कोडला "positive" ची आवश्यकता होती.
- प्रत्येक तपासणीनंतर गृहितकांवर प्रश्न उचला. जेव्हा बाउंड्स टेस्ट (bounds test) केली जाते, तेव्हा त्यानंतरचा कोड एखाद्या अधिक कडक गुणधर्मावर (stricter property) अवलंबून नाही ना, याची खात्री करा.
- फझिंग टूल्सचा (fuzzing tools) वापर करा. लेखकाने AddressSanitizer सोबत libFuzzer चालवून हा बग शोधून काढला, जे इनपुट्समध्ये बदल (mutate) करते आणि शून्याने भागण्यासारख्या अवैध क्रियांचे संकेत देते.
फिक्स (fix) कसा लागू करण्यात आला
या फिक्समध्ये एक 'गार्ड' (guard) जोडण्यात आला आहे जो डायमेंशन शून्य असल्यास ओव्हरफ्लो गणना (overflow calculation) वगळतो. ही छोटी कंडिशनल अट काही मॉडेल व्हेरिएंट्समध्ये पर्यायी वैशिष्ट्यांसाठी वापरल्या जाणाऱ्या वैध शून्य-आकाराच्या टेन्सर्सना (zero-sized tensors) सपोर्ट कायम ठेवते आणि क्रॅश होण्याचा मार्ग काढून टाकते.
निष्कर्ष: एक ६५-बाइटची फाईल मोठ्या प्रमाणावर वापरले जाणारे इन्फरन्स इंजिन बंद करू शकते; संपूर्ण व्हॅलिडेशन आणि पद्धतशीर फझिंग मॉडेल लोडर्सना सुरक्षित ठेवते.
स्रोत: https://dev.to/harrisonsec/your-model-file-is-untrusted-input-1eap
