Linux కెర్నల్‌లో రూట్ దుర్బలత్వం మరియు systemdలో సేవ యొక్క తిరస్కరణ

Qualys నుండి భద్రతా పరిశోధకులు Linux కెర్నల్ మరియు systemd సిస్టమ్ మేనేజర్‌ను ప్రభావితం చేసే రెండు దుర్బలత్వాల వివరాలను వెల్లడించారు. కెర్నల్‌లోని ఒక దుర్బలత్వం (CVE-2021-33909) అధిక సమూహ డైరెక్టరీలను మార్చడం ద్వారా రూట్ హక్కులతో కోడ్ అమలును సాధించడానికి స్థానిక వినియోగదారుని అనుమతిస్తుంది.

డిఫాల్ట్ కాన్ఫిగరేషన్‌లో Ubuntu 20.04/20.10/21.04, Debian 11 మరియు Fedora 34 లలో పని చేసే వర్కింగ్ ఎక్స్‌ప్లోయిట్‌లను పరిశోధకులు సిద్ధం చేయగలిగారనే వాస్తవం వల్ల దుర్బలత్వం యొక్క ప్రమాదం తీవ్రతరం అవుతుంది. ఇతర పంపిణీలు పరీక్షించబడలేదని గుర్తించబడింది, కానీ సిద్ధాంతపరంగా కూడా సమస్యకు గురికావచ్చు మరియు దాడి చేయవచ్చు. ప్రతిచోటా సమస్య తొలగించబడిన తర్వాత దోపిడీల యొక్క పూర్తి కోడ్ ప్రచురించబడుతుందని వాగ్దానం చేయబడింది, అయితే ప్రస్తుతానికి పరిమిత కార్యాచరణ యొక్క నమూనా మాత్రమే అందుబాటులో ఉంది, దీని వలన సిస్టమ్ క్రాష్ అవుతుంది. సమస్య జూలై 2014 నుండి ఉంది మరియు 3.16 నుండి ప్రారంభమయ్యే కెర్నల్ విడుదలలను ప్రభావితం చేస్తుంది. బలహీనత పరిష్కారం సంఘంతో సమన్వయం చేయబడింది మరియు జూలై 19న కెర్నల్‌లోకి ఆమోదించబడింది. ప్రధాన పంపిణీలు తమ కెర్నల్ ప్యాకేజీలకు (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch) ఇప్పటికే నవీకరణలను రూపొందించాయి.

seq_file కోడ్‌లో కార్యకలాపాలను నిర్వహించే ముందు పరిమాణం_t నుండి పూర్ణాంకానికి మార్పిడి ఫలితాన్ని తనిఖీ చేయడంలో వైఫల్యం కారణంగా ఈ దుర్బలత్వం ఏర్పడుతుంది, ఇది రికార్డుల క్రమం నుండి ఫైల్‌లను సృష్టిస్తుంది. తనిఖీ చేయడంలో వైఫల్యం చాలా సమూహ డైరెక్టరీ నిర్మాణాన్ని (1 GB కంటే ఎక్కువ పాత్ పరిమాణం) సృష్టించేటప్పుడు, మౌంట్ చేస్తున్నప్పుడు మరియు తొలగించేటప్పుడు బఫర్‌కు సరిహద్దుల వెలుపల వ్రాయబడవచ్చు. ఫలితంగా, దాడి చేసే వ్యక్తి "-10 GB - 2 బైట్‌ల" ఆఫ్‌సెట్‌లో వ్రాసిన 10-బైట్ స్ట్రింగ్ "//తొలగించబడింది" సాధించవచ్చు, ఇది కేటాయించిన బఫర్‌కు ముందు ఉన్న ప్రాంతాన్ని సూచిస్తుంది.

సిద్ధం చేయబడిన దోపిడీకి 5 GB మెమరీ మరియు 1 మిలియన్ ఉచిత ఐనోడ్‌లు అవసరం. 1 GB కంటే ఎక్కువ ఉన్న ఫైల్ పాత్ పరిమాణాన్ని సాధించడానికి సుమారు మిలియన్ సబ్ డైరెక్టరీల సోపానక్రమాన్ని సృష్టించడానికి mkdir()కి కాల్ చేయడం ద్వారా దోపిడీ పని చేస్తుంది. ఈ డైరెక్టరీ ప్రత్యేక వినియోగదారు నేమ్‌స్పేస్‌లో బైండ్-మౌంట్ ద్వారా మౌంట్ చేయబడింది, దాని తర్వాత దాన్ని తీసివేయడానికి rmdir() ఫంక్షన్ అమలు చేయబడుతుంది. సమాంతరంగా, ఒక చిన్న eBPF ప్రోగ్రామ్‌ను లోడ్ చేసే థ్రెడ్ సృష్టించబడుతుంది, ఇది eBPF సూడోకోడ్‌ను తనిఖీ చేసిన తర్వాత దశలో బ్లాక్ చేయబడుతుంది, కానీ దాని JIT సంకలనానికి ముందు.

అన్‌ప్రివిలేజ్డ్ యూజర్‌డి నేమ్‌స్పేస్‌లో, ఫైల్ /proc/self/mountinfo తెరవబడుతుంది మరియు బైండ్-మౌంటెడ్ డైరెక్టరీ యొక్క పొడవైన పాత్‌నేమ్ చదవబడుతుంది, ఫలితంగా బఫర్ ప్రారంభానికి ముందు స్ట్రింగ్ "//తొలగించబడింది" అని వ్రాయబడుతుంది. లైన్ రాయడానికి స్థానం ఎంపిక చేయబడింది, తద్వారా ఇది ఇప్పటికే పరీక్షించబడిన కానీ ఇంకా కంపైల్ చేయని eBPF ప్రోగ్రామ్‌లోని సూచనలను ఓవర్‌రైట్ చేస్తుంది.

తరువాత, eBPF ప్రోగ్రామ్ స్థాయిలో, btf మరియు map_push_elem స్ట్రక్చర్‌ల తారుమారు ద్వారా ఇతర కెర్నల్ నిర్మాణాలను చదవడానికి మరియు వ్రాయడానికి నియంత్రించబడని అవుట్-ఆఫ్-బఫర్ రైటింగ్ నియంత్రిత సామర్థ్యంగా మార్చబడుతుంది. ఫలితంగా, దోపిడీ కెర్నల్ మెమరీలో modprobe_path[] బఫర్ యొక్క స్థానాన్ని నిర్ణయిస్తుంది మరియు దానిలోని “/sbin/modprobe” మార్గాన్ని ఓవర్‌రైట్ చేస్తుంది, ఇది ఒక సందర్భంలో రూట్ హక్కులతో ఏదైనా ఎక్జిక్యూటబుల్ ఫైల్‌ను ప్రారంభించడాన్ని ప్రారంభించడానికి మిమ్మల్ని అనుమతిస్తుంది. request_module() కాల్, ఇది అమలు చేయబడుతుంది, ఉదాహరణకు, నెట్‌లింక్ సాకెట్‌ను సృష్టించేటప్పుడు.

పరిశోధకులు ఒక నిర్దిష్ట దోపిడీకి మాత్రమే ప్రభావవంతంగా ఉండే అనేక పరిష్కారాలను అందిస్తారు, కానీ సమస్యను స్వయంగా తొలగించరు. ప్రత్యేక వినియోగదారు ID నేమ్‌స్పేస్‌లో మౌంటు డైరెక్టరీలను నిలిపివేయడానికి "/proc/sys/kernel/unprivileged_userns_clone"ని 0కి మరియు eBPF ప్రోగ్రామ్‌లను లోడ్ చేయడాన్ని నిలిపివేయడానికి "/proc/sys/kernel/unprivileged_bpf_disabled"ని 1కి సెట్ చేయాలని సిఫార్సు చేయబడింది.

పెద్ద డైరెక్టరీని మౌంట్ చేయడానికి బైండ్-మౌండ్‌కు బదులుగా FUSE మెకానిజంను ఉపయోగించడంతో కూడిన ప్రత్యామ్నాయ దాడిని విశ్లేషిస్తున్నప్పుడు, పరిశోధకులు systemd సిస్టమ్ మేనేజర్‌ను ప్రభావితం చేసే మరొక దుర్బలత్వాన్ని (CVE-2021-33910) చూశారు. FUSE ద్వారా 8 MB కంటే ఎక్కువ పాత్ సైజుతో డైరెక్టరీని మౌంట్ చేయడానికి ప్రయత్నిస్తున్నప్పుడు, కంట్రోల్ ఇనిషియలైజేషన్ ప్రాసెస్ (PID1) స్టాక్ మెమరీ అయిపోతుంది మరియు క్రాష్ అవుతుంది, ఇది సిస్టమ్‌ను "పానిక్" స్థితిలో ఉంచుతుంది.

సమస్య ఏమిటంటే, systemd /proc/self/mountinfo యొక్క కంటెంట్‌లను ట్రాక్ చేస్తుంది మరియు అన్వయిస్తుంది మరియు యూనిట్_name_path_escape() ఫంక్షన్‌లో ప్రతి మౌంట్ పాయింట్‌ను ప్రాసెస్ చేస్తుంది, ఇది డేటాను డైనమిక్‌గా కేటాయించిన మెమరీలో కాకుండా స్టాక్‌పై ఉంచే strdupa() ఆపరేషన్‌ను చేస్తుంది. . గరిష్ట స్టాక్ పరిమాణం RLIMIT_STACK ద్వారా పరిమితం చేయబడినందున, మౌంట్ పాయింట్‌కి చాలా పెద్ద మార్గాన్ని ప్రాసెస్ చేయడం వలన PID1 ప్రాసెస్ క్రాష్ అవుతుంది మరియు సిస్టమ్ ఆపివేయబడుతుంది. దాడి కోసం, మీరు అత్యంత సమూహ డైరెక్టరీని మౌంట్ పాయింట్‌గా ఉపయోగించడంతో కలిపి సరళమైన FUSE మాడ్యూల్‌ను ఉపయోగించవచ్చు, దీని పాత్ పరిమాణం 8 MB కంటే ఎక్కువగా ఉంటుంది.

systemd 220 (ఏప్రిల్ 2015) నుండి సమస్య కనిపిస్తుంది, ఇది ఇప్పటికే ప్రధాన systemd రిపోజిటరీలో పరిష్కరించబడింది మరియు పంపిణీలలో పరిష్కరించబడింది (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch). ముఖ్యంగా, systemd విడుదల 248లో /proc/self/mountinfo యొక్క ప్రాసెసింగ్ విఫలమయ్యే systemd కోడ్‌లోని బగ్ కారణంగా దోపిడీ పనిచేయదు. 2018లో, ఇదే విధమైన పరిస్థితి ఏర్పడింది మరియు Linux కెర్నల్‌లో CVE-2018-14634 దుర్బలత్వం కోసం దోపిడీని వ్రాయడానికి ప్రయత్నిస్తున్నప్పుడు, Qualys పరిశోధకులు systemdలో మూడు క్లిష్టమైన దుర్బలత్వాలను ఎదుర్కొన్నారు.

మూలం: opennet.ru

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