రూట్ అధికారాలతో రిమోట్ కోడ్ అమలును అనుమతించే OpenSMTPDలో దుర్బలత్వం

OpenBSD ప్రాజెక్ట్ ద్వారా అభివృద్ధి చేయబడిన మెయిల్ సర్వర్‌లో OpenSMTPD గుర్తించారు క్లిష్టమైన దుర్బలత్వం (CVE-2020-7247), ఇది రూట్ వినియోగదారు హక్కులతో సర్వర్‌లో షెల్ ఆదేశాలను రిమోట్‌గా అమలు చేయడానికి మిమ్మల్ని అనుమతిస్తుంది. క్వాలిస్ సెక్యూరిటీ (మునుపటి OpenSMTPD ఆడిట్) నిర్వహించిన రీ-ఆడిట్ సమయంలో దుర్బలత్వం గుర్తించబడింది చేపట్టారు 2015లో, మరియు కొత్త దుర్బలత్వం మే 2018 నుండి ఉంది). సమస్య తొలగించబడింది OpenSMTPD 6.6.2 విడుదలలో. వినియోగదారులందరూ వెంటనే నవీకరణను ఇన్‌స్టాల్ చేయమని సిఫార్సు చేయబడ్డారు (OpenBSD కోసం, ప్యాచ్‌ను syspatch ద్వారా ఇన్‌స్టాల్ చేయవచ్చు).

రెండు దాడి ఎంపికలు ప్రతిపాదించబడ్డాయి. మొదటి ఎంపిక డిఫాల్ట్ OpenSMTPD కాన్ఫిగరేషన్‌లో పనిచేస్తుంది (లోకల్ హోస్ట్ నుండి అభ్యర్థనలను మాత్రమే ఆమోదించడం) మరియు దాడి చేసేవారు సర్వర్‌లో స్థానిక నెట్‌వర్క్ ఇంటర్‌ఫేస్ (లూప్‌బ్యాక్) యాక్సెస్ చేయగలిగినప్పుడు (ఉదాహరణకు, హోస్టింగ్ సిస్టమ్‌లలో) సమస్యను స్థానికంగా ఉపయోగించుకోవడానికి మిమ్మల్ని అనుమతిస్తుంది. . బాహ్య నెట్‌వర్క్ అభ్యర్థనలను స్వీకరించడానికి OpenSMTPD కాన్ఫిగర్ చేయబడినప్పుడు రెండవ ఎంపిక జరుగుతుంది (మూడవ పక్షం మెయిల్‌ను అంగీకరించే మెయిల్ సర్వర్). ఓపెన్‌బిఎస్‌డి 6.6లో చేర్చబడిన ఓపెన్‌ఎస్‌ఎమ్‌టిపిడి వెర్షన్ మరియు ఇతర ఆపరేటింగ్ సిస్టమ్‌ల కోసం పోర్టబుల్ వెర్షన్‌తో (డెబియన్ టెస్టింగ్‌లో నిర్వహించబడింది) విజయవంతంగా పనిచేసే ఎక్స్‌ప్లోయిట్ ప్రోటోటైప్‌ను పరిశోధకులు సిద్ధం చేశారు.

smtp_mailaddr() ఫంక్షన్‌లో లోపం కారణంగా సమస్య ఏర్పడింది, ఇది పంపినవారు/గ్రహీతను నిర్వచించే మరియు కనెక్షన్ సమయంలో పంపబడే "మెయిల్ ఫ్రమ్" మరియు "RCPT TO" ఫీల్డ్‌లలోని విలువల యొక్క ఖచ్చితత్వాన్ని తనిఖీ చేయడానికి పిలువబడుతుంది. మెయిల్ సర్వర్‌తో. “@” గుర్తుకు ముందు వచ్చే ఇమెయిల్ చిరునామాలోని భాగాన్ని తనిఖీ చేయడానికి, smtp_mailaddr() ఫంక్షన్ అంటారు
Valid_localpart(), ఇది RFC 5322 ద్వారా అవసరమైన "!#$%&'*/?^`{|}~+-=_" అక్షరాలను (MAILADDR_ALLOWED) అంగీకరిస్తుంది.

ఈ సందర్భంలో, స్ట్రింగ్ యొక్క డైరెక్ట్ ఎస్కేపింగ్ mda_expand_token() ఫంక్షన్‌లో నిర్వహించబడుతుంది, ఇది “!#$%&'*?`{|}~” (MAILADDR_ESCAPE) అక్షరాలను మాత్రమే భర్తీ చేస్తుంది. తదనంతరం, 'execle("/bin/sh", "/bin/sh", "-c", mda_command,...' కమాండ్‌ని ఉపయోగించి డెలివరీ ఏజెంట్ (MDA)కి కాల్ చేస్తున్నప్పుడు mda_expand_token()లో సిద్ధం చేయబడిన లైన్ ఉపయోగించబడుతుంది. . /bin/sh ద్వారా mboxకి అక్షరాలను ఉంచే సందర్భంలో, “/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}” లైన్ ప్రారంభించబడుతుంది, ఇక్కడ విలువ “% {mbox.from}”లో "MAIL FROM" పరామితి నుండి తప్పించుకున్న డేటా ఉంటుంది.

దుర్బలత్వం యొక్క సారాంశం ఏమిటంటే, smtp_mailaddr()కి తార్కిక లోపం ఉంది, దీని కారణంగా ఖాళీ డొమైన్ ఇమెయిల్‌కు పంపబడినట్లయితే, ఫంక్షన్ విజయవంతమైన ధృవీకరణ కోడ్‌ను అందిస్తుంది, “@”కి ముందు చిరునామాలోని భాగం చెల్లని అక్షరాలను కలిగి ఉన్నప్పటికీ . ఇంకా, స్ట్రింగ్‌ను సిద్ధం చేస్తున్నప్పుడు, mda_expand_token() ఫంక్షన్ అన్ని షెల్ ప్రత్యేక అక్షరాల నుండి తప్పించుకోదు, కానీ ఇమెయిల్ చిరునామాలో ప్రత్యేక అక్షరాలు మాత్రమే అనుమతించబడతాయి. అందువల్ల, మీ ఆదేశాన్ని అమలు చేయడానికి, ఇమెయిల్ యొక్క స్థానిక భాగంలో “;” చిహ్నాన్ని ఉపయోగించడం సరిపోతుంది. మరియు స్పేస్, MAILADDR_ESCAPE సెట్‌లో చేర్చబడలేదు మరియు తప్పించుకోబడలేదు. ఉదాహరణకి:

$nc 127.0.0.1 25

HELO professor.falken
మెయిల్:<;sleep 66;>
RCPT టు:
సమాచారం
.
క్విట్

ఈ సెషన్ తర్వాత, OpenSMTPD, mboxకి డెలివరీ చేయబడినప్పుడు, షెల్ ద్వారా కమాండ్‌ను ప్రారంభిస్తుంది

/usr/libexec/mail.local -f ;నిద్ర 66; రూట్

అదే సమయంలో, చిరునామా యొక్క స్థానిక భాగం 64 అక్షరాలను మించకూడదు మరియు ప్రత్యేక అక్షరాలు '$' మరియు '|' కారణంగా దాడి అవకాశాలు పరిమితం చేయబడ్డాయి. తప్పించుకునేటప్పుడు ":"తో భర్తీ చేయబడతాయి. ఈ పరిమితిని దాటవేయడానికి, ఇన్‌పుట్ స్ట్రీమ్ ద్వారా /usr/libexec/mail.localని అమలు చేసిన తర్వాత లేఖ యొక్క శరీరం ప్రసారం చేయబడుతుందనే వాస్తవాన్ని మేము ఉపయోగిస్తాము, అనగా. చిరునామాను మార్చడం ద్వారా, మీరు sh కమాండ్ ఇంటర్‌ప్రెటర్‌ను మాత్రమే ప్రారంభించగలరు మరియు లేఖ యొక్క భాగాన్ని సూచనల సమితిగా ఉపయోగించవచ్చు. సర్వీస్ SMTP హెడర్‌లు లేఖ ప్రారంభంలో సూచించబడినందున, వాటిని దాటవేయడానికి లూప్‌లో రీడ్ కమాండ్‌ని ఉపయోగించమని సూచించబడింది. పని దోపిడీ ఇలా కనిపిస్తుంది:

$nc 192.168.56.143 25

HELO professor.falken
మెయిల్ నుండి మెయిల్:<;నేను 0 1 2 3 4 5 6 7 8 9 abcd; కోసం చదవండి r;done;sh;exit 0;>
RCPT టు:[ఇమెయిల్ రక్షించబడింది]>
సమాచారం
#0
#1
...
#d
WOPRలో i కోసం; చేయండి
echo -n "($i) " && id || బ్రేక్
పూర్తయింది > /root/x."`id -u`.""$$"
.
క్విట్

మూలం: opennet.ru

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