రూట్ అధికారాలతో సర్వర్‌లో కోడ్‌ని అమలు చేయడానికి అనుమతించే ఎగ్జిమ్‌లో క్లిష్టమైన దుర్బలత్వం

Exim మెయిల్ సర్వర్‌లో గుర్తించారు క్రిటిచెస్కాయా దుర్బలత్వం (CVE-2019-10149), ఇది ప్రత్యేకంగా రూపొందించిన అభ్యర్థనను ప్రాసెస్ చేస్తున్నప్పుడు రూట్ హక్కులతో సర్వర్‌లో రిమోట్ కోడ్ అమలుకు దారి తీస్తుంది. 4.87 నుండి 4.91 వరకు ఉన్న వెర్షన్‌లలో లేదా EXPERIMENTAL_EVENT ఎంపికతో నిర్మించేటప్పుడు సమస్యను ఉపయోగించుకునే అవకాశం గుర్తించబడింది.

డిఫాల్ట్ కాన్ఫిగరేషన్‌లో, స్థానిక వినియోగదారు ద్వారా అనవసరమైన సమస్యలు లేకుండా దాడిని నిర్వహించవచ్చు, ఎందుకంటే "వెరిఫై = స్వీకర్త" ACL వర్తించబడుతుంది, ఇది బాహ్య చిరునామాల కోసం అదనపు తనిఖీలను చేస్తుంది. మరొక డొమైన్ కోసం సెకండరీ MX వలె పని చేయడం, "verify=recipient" ACLని తీసివేయడం లేదా local_part_suffixకి కొన్ని మార్పులు వంటి సెట్టింగ్‌లను మార్చినప్పుడు రిమోట్ దాడి సంభవించవచ్చు. దాడి చేసే వ్యక్తి సర్వర్‌కి కనెక్షన్‌ను 7 రోజుల పాటు తెరిచి ఉంచగలిగితే రిమోట్ దాడి కూడా సాధ్యమవుతుంది (ఉదాహరణకు, సమయం ముగియడాన్ని దాటవేయడానికి నిమిషానికి ఒక బైట్ పంపడం). అదే సమయంలో, సమస్య యొక్క రిమోట్ దోపిడీ కోసం సరళమైన దాడి వెక్టర్స్ ఉండే అవకాశం ఉంది.

/src/deliver.c ఫైల్‌లో నిర్వచించబడిన deliver_message() ఫంక్షన్‌లో గ్రహీత యొక్క చిరునామా యొక్క తప్పు ధృవీకరణ వలన దుర్బలత్వం ఏర్పడుతుంది. చిరునామా ఫార్మాటింగ్‌ను మార్చడం ద్వారా, దాడి చేసే వ్యక్తి తన డేటాను రూట్ హక్కులతో execv() ఫంక్షన్ ద్వారా పిలిచే కమాండ్ ఆర్గ్యుమెంట్‌లలోకి మార్చవచ్చు. ఆపరేషన్‌కు బఫర్ ఓవర్‌ఫ్లోస్ లేదా మెమరీ కరప్షన్ కోసం ఉపయోగించే సంక్లిష్ట సాంకేతికతలను ఉపయోగించడం అవసరం లేదు; సాధారణ అక్షర ప్రత్యామ్నాయం సరిపోతుంది.

సమస్య చిరునామా మార్పిడి కోసం నిర్మాణం యొక్క ఉపయోగానికి సంబంధించినది:

deliver_localpart = Expand_string(
string_sprintf("${local_part:%s}", new->చిరునామా));
deliver_domain = Expand_string(
string_sprintf("${డొమైన్:%s}", కొత్త->చిరునామా));

Expand_string() ఫంక్షన్ అనేది "${run{కమాండ్ ఆర్గ్యుమెంట్స్}" కమాండ్‌ను గుర్తించడంతో పాటు, ఒక అతి క్లిష్టతతో కూడిన కంబైనర్, ఇది బాహ్య హ్యాండ్లర్ ప్రారంభానికి దారి తీస్తుంది. అందువల్ల, SMTP సెషన్‌లో దాడి చేయడానికి, స్థానిక వినియోగదారు 'RCPT TO “username+${run{...}}@localhost”' వంటి ఆదేశాన్ని మాత్రమే పంపాలి, ఇక్కడ స్థానిక_డొమైన్‌ల జాబితా నుండి హోస్ట్‌లలో స్థానిక హోస్ట్ ఒకటి, మరియు వినియోగదారు పేరు అనేది ఇప్పటికే ఉన్న స్థానిక వినియోగదారు పేరు.

సర్వర్ మెయిల్ రిలేగా పనిచేస్తుంటే, రిమోట్‌గా 'RCPTని “${run{...}}@relaydomain.com”కి పంపితే సరిపోతుంది, ఇక్కడ relaydomain.com అనేది relay_to_domainsలో జాబితా చేయబడిన హోస్ట్‌లలో ఒకటి. సెట్టింగుల విభాగం. ఎగ్జిమ్ ప్రివిలేజ్ మోడ్‌ను వదలడానికి డిఫాల్ట్ చేయనందున (deliver_drop_privilege = తప్పు), "${run{...}}" ద్వారా పంపబడిన ఆదేశాలు రూట్‌గా అమలు చేయబడతాయి.

దుర్బలత్వం ఉండటం గమనార్హం తొలగించబడింది ఫిబ్ర‌వ‌రిలో విడుద‌లైన 4.92లో, ఈ ప‌రిష్కారం భ‌ద్ర‌త స‌మ‌స్య‌ల‌కు దారితీస్తుంద‌ని నొక్కి చెప్ప‌కుండా. ఎగ్జిమ్ డెవలపర్‌లు ఉద్దేశపూర్వకంగా దుర్బలత్వాన్ని దాచిపెట్టారని నమ్మడానికి ఎటువంటి కారణం లేదు, ఎందుకంటే సమస్య సమయంలో పరిష్కరించబడింది దిద్దుబాట్లను తప్పు చిరునామాలు ప్రసారం చేయబడినప్పుడు వైఫల్యం సంభవిస్తుంది మరియు ఎగ్జిమ్‌లో మార్పుల ఆడిట్ సమయంలో క్వాలిస్ ద్వారా దుర్బలత్వం గుర్తించబడింది.

డిస్ట్రిబ్యూషన్‌లలో ఉపయోగించడం కొనసాగించే మునుపటి సంస్కరణల కోసం పరిష్కారం ప్రస్తుతం అందుబాటులో ఉంది పాచ్. సమస్యను పరిష్కరించడానికి మునుపటి శాఖలకు సంబంధించిన దిద్దుబాటు విడుదలలు జూన్ 11న షెడ్యూల్ చేయబడ్డాయి. ప్యాకేజీ నవీకరణలు సిద్ధంగా ఉన్నాయి డెబియన్, ఉబుంటు, ఓపెన్ SUSE. ఆర్చ్ లైనక్స్ и Fedora వారు వెర్షన్ 4.92ని సరఫరా చేస్తారు, దీనిలో సమస్య కనిపించదు. RHEL మరియు CentOS సమస్య లొంగనిది కాదు, Exim వారి సాధారణ ప్యాకేజీ రిపోజిటరీలో చేర్చబడలేదు కాబట్టి.

మూలం: opennet.ru

ఒక వ్యాఖ్యను జోడించండి