ఒక 65-బైట్ల మోడల్ ఫైల్ ప్రసిద్ధ Llama CPP ఇన్ఫరెన్స్ ఇంజిన్ను అకస్మాత్తుగా నిలిపివేయగలదు. ఈ చిన్న పేలోడ్ పార్సర్లోని division-by-zero ప్రక్రియను ప్రేరేపించి, SIGFPE క్రాష్ను కలిగిస్తుంది.
ఈ క్రాష్ ఎందుకు ముఖ్యం
ఏం తప్పు జరిగింది
పార్సర్ మోడల్ మెటాడేటాను C++ స్ట్రక్చర్లలోకి చదువుతుంది మరియు ప్రతి టెన్సర్ డైమెన్షన్ "non-negative" అని తనిఖీ చేస్తుంది. సున్నా ఆ నిబంధనను సంతృప్తిపరుస్తుంది, కాబట్టి ఆ తనిఖీ విజయవంతమవుతుంది. తదుపరి కోడ్ లైన్ ఆ డైమెన్షన్ను ఒక ధన సంఖ్య (positive value) అని భావించి, లెక్కలో భాజకం (divisor)గా ఉపయోగిస్తుంది. డైమెన్షన్ సున్నా అయినప్పుడు, ఆ భాగహారం ఒక ఫ్లోటింగ్-పాయింట్ ఎక్సెప్షన్ను (SIGFPE) కలిగిస్తుంది మరియు ప్రోగ్రామ్ను నిలిపివేస్తుంది.
ఈ వ్యాలిడేషన్ అవసరమైన ఇన్వేరియంట్ (invariant)లో సగం మాత్రమే కవర్ చేసింది: ఇది రుణాత్మక విలువలను నిరోధించింది కానీ సున్నాను విస్మరించింది, ఇది తదుపరి గణిత ప్రక్రియలకు అంతే ప్రమాదకరం.
డెవలపర్లు ఏమి చేయాలి
- మోడల్ ఫైల్లను బైనరీల వలె పరిగణించండి. మోడల్ను లోడ్ చేయడం అనేది రా (raw) బైట్లను మెమరీ స్ట్రక్చర్లుగా పార్స్ చేస్తుంది, ఇది తనిఖీ చేయని డేటా వల్ల ప్రాసెస్ క్రాష్ అయ్యే లేదా అంతకంటే దారుణమైన పరిణామాలు ఎదురయ్యే ఒక క్లాసిక్ బౌండరీ.
- పాక్షిక తనిఖీలను నివారించండి. అవసరమైన ఇన్వేరియంట్లో కొంత భాగాన్ని మాత్రమే కవర్ చేసే కండిషన్ తప్పుడు భద్రతా భావాన్ని కలిగిస్తుంది. ఇక్కడ, "non-negative" సరిపోలేదు; కోడ్కు "positive" అవసరమైంది.
- ప్రతి తనిఖీ తర్వాత ఊహలను ప్రశ్నించండి. బౌండ్స్ టెస్ట్ (bounds test) చేసినప్పుడు, తదుపరి కోడ్ అంతకంటే కఠినమైన ప్రాపర్టీపై ఆధారపడటం లేదని నిర్ధారించుకోండి.
- ఫజరింగ్ (fuzzing) సాధనాలను ఉపయోగించండి. రచయిత AddressSanitizerతో libFuzzerని రన్ చేయడం ద్వారా ఈ బగ్ను కనుగొన్నారు, ఇది ఇన్పుట్లను మారుస్తూ (mutate) సున్నా ద్వారా భాగించడం వంటి చట్టవిరుద్ధమైన ఆపరేషన్లను గుర్తిస్తుంది.
పరిష్కారం ఎలా అమలు చేయబడింది
ఈ పరిష్కారం డైమెన్షన్ సున్నా అయినప్పుడు ఓవర్ఫ్లో గణనను స్కిప్ చేసేలా ఒక గార్డ్ను (guard) జోడిస్తుంది. ఈ చిన్న కండిషనల్, కొన్ని మోడల్ వేరియంట్లలో ఆప్షనల్ ఫీచర్ల కోసం ఉపయోగించే చట్టబద్ధమైన జీరో-సైజ్ టెన్సర్ల (zero-sized tensors) మద్దతును నిలుపుతూనే, క్రాష్ అయ్యే మార్గాన్ని తొలగిస్తుంది.
ముఖ్య గమనిక: కేవలం ఒక 65-బైట్ల ఫైల్ విస్తృతంగా ఉపయోగించబడే ఇన్ఫరెన్స్ ఇంజిన్ను నిలిపివేయగలదు; సమగ్రమైన వ్యాలిడేషన్ మరియు క్రమబద్ధమైన ఫజరింగ్ మోడల్ లోడర్లను సురక్షితంగా ఉంచుతాయి.
మూలం: https://dev.to/harrisonsec/your-model-file-is-untrusted-input-1eap
