65-பைட் அளவுள்ள ஒரு மாடல் கோப்பு, பிரபலமான Llama CPP inference engine-ஐ திடீரென முடக்கிவிடக்கூடும். இந்த மிகச்சிறிய payload, parser-க்குள் பூஜ்ஜியத்தால் வகுக்கும் (division-by-zero) பிழையைத் தூண்டி, SIGFPE crash-ஐ ஏற்படுத்துகிறது.
இந்த crash ஏன் முக்கியமானது
என்ன தவறு நடந்தது
Parser, மாடல் மெட்டாடேட்டாவை (metadata) C++ structures-க்குள் வாசித்து, ஒவ்வொரு tensor dimension-உம் “non-negative” (எதிர்மறையல்லாதது) தானா என்று சரிபார்க்கிறது. பூஜ்ஜியம் (Zero) அந்த நிபந்தனையைப் பூர்த்தி செய்வதால், அந்தச் சரிபார்ப்பு வெற்றிகரமாக முடிவடைகிறது. ஆனால், அடுத்த வரி குறியீடு (code), அந்த dimension-ஐ ஒரு வகுத்தியாக (divisor) பயன்படுத்தி ஒரு கணக்கீட்டைச் செய்கிறது; அந்த மதிப்பு நேர்மறையாக (positive) இருக்கும் என்று அது கருதுகிறது. Dimension பூஜ்ஜியமாக இருக்கும்போது, அந்த வகுத்தல் ஒரு floating-point exception (SIGFPE)-ஐத் தூண்டி, நிரலை (program) முடக்கிவிடுகிறது.
இந்தச் சரிபார்ப்பு (validation) தேவையான நிபந்தனையின் பாதியை மட்டுமே கவனித்தது: அது எதிர்மறை மதிப்புகளைத் (negative values) தடுத்தது, ஆனால் பூஜ்ஜியத்தைப் புறக்கணித்தது; இது அடுத்தடுத்த கணிதச் செயல்பாடுகளுக்கு (arithmetic) சமமான ஆபத்தையே விளைவிக்கும்.
டெவலப்பர்கள் என்ன செய்ய வேண்டும்
- மாடல் கோப்புகளை binaries போலக் கருதவும். ஒரு மாடலை லோட் செய்யும் போது, raw bytes ஆகியவை memory structures-ஆக மாற்றப்படுகின்றன. இது சரிபார்க்கப்படாத தரவுகள் (unchecked data) ஒரு செயல்முறையை (process) முடக்குவதற்கு அல்லது அதைவிட மோசமான விளைவுகளை ஏற்படுத்துவதற்கு வாய்ப்புள்ள ஒரு முக்கியமான எல்லைப் பகுதியாகும் (boundary).
- முழுமையற்ற சரிபார்ப்புகளைத் தவிர்க்கவும். தேவையான நிபந்தனையின் ஒரு பகுதியை மட்டுமே சரிபார்க்கும் ஒரு கண்டிஷன், தவறான பாதுகாப்பு உணர்வைத் தரும். இங்கே, “non-negative” என்பது போதுமானதாக இல்லை; குறியீட்டிற்கு “positive” என்ற நிபந்தனை தேவைப்பட்டது.
- ஒவ்வொரு சரிபார்ப்பிற்குப் பிறகும் அனுமானங்களைச் சந்தேகிக்கவும். ஒரு bounds test செய்யும்போது, அதைத் தொடர்ந்து வரும் குறியீடு இன்னும் கடுமையான ஒரு பண்பைச் (stricter property) சார்ந்து இயங்குகிறதா என்பதை உறுதிப்படுத்திக் கொள்ளுங்கள்.
- Fuzzing கருவிகளைப் பயன்படுத்தவும். ஆசிரியர், libFuzzer மற்றும் AddressSanitizer ஆகியவற்றைப் பயன்படுத்தி இந்த பிழையைக் கண்டறிந்தார்; இவை உள்ளீடுகளை (inputs) மாற்றி அமைத்து (mutate), பூஜ்ஜியத்தால் வகுத்தல் போன்ற சட்டவிரோதச் செயல்பாடுகளைக் கண்டறியும்.
சரிசெய்தல் முறை (Fix) எவ்வாறு செயல்படுத்தப்பட்டது
இந்தத் தீர்வு, ஒரு dimension பூஜ்ஜியமாக இருக்கும்போது overflow கணக்கீட்டைத் தவிர்க்கும் ஒரு guard-ஐச் சேர்க்கிறது. இந்தச் சிறிய நிபந்தனை (conditional), சில மாடல் வகைகளில் விருப்பத்தேர்வு அம்சங்களுக்காகப் (optional features) பயன்படுத்தப்படும் முறையான zero-sized tensors-க்கான ஆதரவைத் தக்கவைப்பதோடு, crash ஆகும் பாதையையும் நீக்குகிறது.
முக்கியக் கருத்து (Takeaway): ஒரு சிறிய 65-பைட் கோப்பு கூட பரவலாகப் பயன்படுத்தப்படும் ஒரு inference engine-ஐ முடக்கிவிடக்கூடும்; முறையான சரிபார்ப்பு (validation) மற்றும் முறையான fuzzing ஆகியவை மாடல் லோடர்களைப் பாதுகாப்பாக வைத்திருக்கும்.
Source: https://dev.to/harrisonsec/your-model-file-is-untrusted-input-1eap
