വെറും 65 ബൈറ്റ് മാത്രമുള്ള ഒരു മോഡൽ ഫയൽ പ്രശസ്തമായ Llama CPP ഇൻഫറൻസ് എൻജിനെ പെട്ടെന്ന് നിലച്ചുപോകാൻ കാരണമായേക്കാം. ഈ ചെറിയ പേലോഡ് പാഴ്സറിനുള്ളിൽ (parser) 'division-by-zero' എന്ന അവസ്ഥയുണ്ടാക്കുകയും, അത് ഒരു SIGFPE ക്രാഷിന് കാരണമാവുകയും ചെയ്യുന്നു.
ഈ ക്രാഷ് പ്രധാനമാകുന്നത് എന്തുകൊണ്ട്
എന്താണ് സംഭവിച്ചത്
പാഴ്സർ മോഡൽ മെറ്റാഡാറ്റ C++ സ്ട്രക്ചറുകളിലേക്ക് വായിക്കുകയും ഓരോ ടെൻസർ ഡൈമൻഷനും (tensor dimension) "നെഗറ്റീവ് അല്ലാത്തതാണോ" (non-negative) എന്ന് പരിശോധിക്കുകയും ചെയ്യുന്നു. പൂജ്യം (Zero) ഈ നിബന്ധന പാലിക്കുന്നതിനാൽ പരിശോധന വിജയിക്കുന്നു. എന്നാൽ അടുത്ത വരിയിലെ കോഡ്, ആ ഡൈമൻഷൻ ഒരു പോസിറ്റീവ് സംഖ്യയാണെന്ന് കരുതി ഒരു കണക്കുകൂട്ടലിൽ ഡിവിഷർ (divisor) ആയി ഉപയോഗിക്കുന്നു. ഡൈമൻഷൻ പൂജ്യം ആയിരിക്കുമ്പോൾ, ഈ ഹരണം ഒരു ഫ്ലോട്ടിംഗ് പോയിന്റ് എക്സെപ്ഷൻ (SIGFPE) ഉണ്ടാക്കുകയും പ്രോഗ്രാം നിർത്തിവെക്കുകയും ചെയ്യുന്നു.
ഈ പരിശോധന ആവശ്യമായ നിബന്ധനയുടെ പകുതി ഭാഗം മാത്രമേ ഉൾക്കൊള്ളുന്നുള്ളൂ: ഇത് നെഗറ്റീവ് മൂല്യങ്ങളെ തടഞ്ഞുവെങ്കിലും പൂജ്യത്തെ അവഗണിച്ചു, ഇത് തുടർന്നുള്ള ഗണിതക്രിയകൾക്ക് (arithmetic) ഒരുപോലെ അപകടകരമാണ്.
ഡെവലപ്പർമാർ എന്തുചെയ്യണം
- മോഡൽ ഫയലുകളെ ബൈനറികളെപ്പോലെ കാണുക. ഒരു മോഡൽ ലോഡ് ചെയ്യുമ്പോൾ റോ ബൈറ്റുകളെ (raw bytes) മെമ്മറി സ്ട്രക്ചറുകളിലേക്ക് പാഴ്സ് ചെയ്യുന്നു. പരിശോധിക്കപ്പെടാത്ത ഡാറ്റ പ്രോസസ്സിനെ ക്രാഷ് ചെയ്യാനോ അതിലും മോശമായ കാര്യങ്ങൾ ചെയ്യാനോ സാധ്യതയുള്ള ഒരു പ്രധാന ഘട്ടമാണിത്.
- ഭാഗികമായ പരിശോധനകൾ ഒഴിവാക്കുക. ആവശ്യമായ നിബന്ധനയുടെ ഒരു ഭാഗം മാത്രം പരിശോധിക്കുന്നത് തെറ്റായ സുരക്ഷിതബോധം നൽകും. ഇവിടെ, “non-negative” എന്നത് മതിയാകുമായിരുന്നില്ല; കോഡിന് “positive” എന്ന നിബന്ധന ആവശ്യമായിരുന്നു.
- ഓരോ പരിശോധനയ്ക്ക് ശേഷവും അനുമാനങ്ങളെ ചോദ്യം ചെയ്യുക. ഒരു ബൗണ്ട്സ് ടെസ്റ്റ് (bounds test) നടത്തുമ്പോൾ, അതിനുശേഷമുള്ള കോഡ് കൂടുതൽ കർശനമായ ഒരു ഗുണത്തെ (stricter property) ആശ്രയിക്കുന്നില്ലെന്ന് ഉറപ്പുവരുത്തുക.
- ഫസിംഗ് ടൂളുകൾ (fuzzing tools) ഉപയോഗിക്കുക. ഇൻപുട്ടുകളിൽ മാറ്റം വരുത്തി പൂജ്യം കൊണ്ട് ഹരിക്കുക പോലുള്ള നിയമവിരുദ്ധമായ പ്രവർത്തനങ്ങളെ കണ്ടെത്താൻ സഹായിക്കുന്ന libFuzzer, AddressSanitizer എന്നിവ ഉപയോഗിച്ചാണ് ലേഖകൻ ഈ ബഗ് കണ്ടെത്തിയത്.
പരിഹാരം എങ്ങനെ നടപ്പിലാക്കി
ഡൈമൻഷൻ പൂജ്യം ആണെങ്കിൽ ഓവർഫ്ലോ കണക്കുകൂട്ടൽ ഒഴിവാക്കുന്ന ഒരു ഗാർഡ് (guard) ഈ പരിഹാരത്തിലൂടെ ചേർത്തു. ഈ ചെറിയ കണ്ടിഷണൽ മാറ്റം, ചില മോഡൽ വേരിയന്റുകളിൽ ഓപ്ഷണൽ ഫീച്ചറുകൾക്കായി ഉപയോഗിക്കുന്ന നിയമപരമായ സീറോ-സൈസ് ടെൻസറുകളെ (zero-sized tensors) നിലനിർത്തുന്നതോടൊപ്പം തന്നെ ക്രാഷ് ഉണ്ടാക്കുന്ന പാതയെയും ഇല്ലാതാക്കുന്നു.
ചുരുക്കത്തിൽ: വെറും 65 ബൈറ്റ് മാത്രമുള്ള ഒരു ഫയൽ വ്യാപകമായി ഉപയോഗിക്കപ്പെടുന്ന ഒരു ഇൻഫറൻസ് എൻജിനെപ്പോലും നിർത്തലാക്കിയേക്കാം; കൃത്യമായ പരിശോധനകളും (validation) വ്യവസ്ഥാപിതമായ ഫസിംഗും (fuzzing) മോഡൽ ലോഡറുകളെ സുരക്ഷിതമായി നിലനിർത്തുന്നു.
Source: https://dev.to/harrisonsec/your-model-file-is-untrusted-input-1eap
