லினக்ஸ் கர்னலில் ரூட் பாதிப்பு மற்றும் systemd இல் சேவை மறுப்பு

Qualys இன் பாதுகாப்பு ஆராய்ச்சியாளர்கள் Linux கர்னல் மற்றும் systemd சிஸ்டம் மேனேஜரை பாதிக்கும் இரண்டு பாதிப்புகள் பற்றிய விவரங்களை வெளிப்படுத்தியுள்ளனர். கர்னலில் உள்ள பாதிப்பு (CVE-2021-33909) அதிக உள்ளமைக்கப்பட்ட கோப்பகங்களைக் கையாளுவதன் மூலம் ரூட் உரிமைகளுடன் குறியீடு செயல்படுத்தலை அடைய உள்ளூர் பயனரை அனுமதிக்கிறது.

Ubuntu 20.04/20.10/21.04, Debian 11 மற்றும் Fedora 34 ஆகியவற்றில் இயல்புநிலை உள்ளமைவில் செயல்படும் வேலைச் சுரண்டல்களை ஆராய்ச்சியாளர்கள் தயார் செய்ய முடிந்ததால் பாதிப்பின் ஆபத்து அதிகரிக்கிறது. மற்ற விநியோகங்கள் சோதிக்கப்படவில்லை என்பது குறிப்பிடத்தக்கது, ஆனால் கோட்பாட்டு ரீதியாகவும் அவை சிக்கலுக்கு ஆளாகின்றன மற்றும் தாக்கப்படலாம். எல்லா இடங்களிலும் சிக்கல் நீக்கப்பட்ட பிறகு சுரண்டல்களின் முழு குறியீடு வெளியிடப்படும் என்று உறுதியளிக்கப்பட்டுள்ளது, ஆனால் தற்போது வரையறுக்கப்பட்ட செயல்பாட்டின் முன்மாதிரி மட்டுமே கிடைக்கிறது, இதனால் கணினி செயலிழக்கச் செய்கிறது. ஜூலை 2014 முதல் இந்த சிக்கல் உள்ளது மற்றும் 3.16 முதல் கர்னல் வெளியீடுகளை பாதிக்கிறது. பாதிப்பு சரிசெய்தல் சமூகத்துடன் ஒருங்கிணைக்கப்பட்டு ஜூலை 19 அன்று கர்னலில் ஏற்றுக்கொள்ளப்பட்டது. முக்கிய விநியோகங்கள் ஏற்கனவே தங்கள் கர்னல் தொகுப்புகளுக்கு (டெபியன், உபுண்டு, ஃபெடோரா, RHEL, SUSE, Arch) புதுப்பிப்புகளை உருவாக்கியுள்ளன.

பதிவுகளின் வரிசையிலிருந்து கோப்புகளை உருவாக்கும் seq_file குறியீட்டில் செயல்பாடுகளைச் செய்வதற்கு முன், அளவு_t இன் இன்ட் மாற்றத்தின் முடிவைச் சரிபார்க்கத் தவறியதால் பாதிப்பு ஏற்படுகிறது. சரிபார்க்கத் தவறினால், மிகவும் உள்ளமைக்கப்பட்ட கோப்பகக் கட்டமைப்பை (பாதை அளவு 1 ஜிபிக்கு மேல்) உருவாக்கும்போது, ​​ஏற்றும்போது மற்றும் நீக்கும்போது இடையகத்திற்கு வரம்புக்கு அப்பாற்பட்ட எழுத்துகள் ஏற்படலாம். இதன் விளைவாக, ஒரு தாக்குபவர் "//நீக்கப்பட்ட" என்ற 10-பைட் சரத்தை "-2 ஜிபி - 10 பைட்டுகள்" ஆஃப்செட்டில் எழுதலாம், அது ஒதுக்கப்பட்ட இடையகத்திற்கு உடனடியாக முந்தைய பகுதியைச் சுட்டிக்காட்டுகிறது.

தயாரிக்கப்பட்ட சுரண்டலுக்கு 5 ஜிபி நினைவகம் மற்றும் 1 மில்லியன் இலவச ஐனோடுகள் தேவை. mkdir() ஐ அழைப்பதன் மூலம் சுரண்டல் வேலை செய்கிறது, இது 1 GB ஐ விட அதிகமான கோப்பு பாதை அளவை அடைய ஒரு மில்லியன் துணை அடைவுகளின் படிநிலையை உருவாக்குகிறது. இந்த கோப்பகம் பைண்ட்-மவுண்ட் வழியாக ஒரு தனி பயனர் பெயர்வெளியில் ஏற்றப்படுகிறது, அதன் பிறகு அதை அகற்ற rmdir() செயல்பாடு இயக்கப்படுகிறது. இணையாக, ஒரு சிறிய eBPF நிரலை ஏற்றும் ஒரு நூல் உருவாக்கப்பட்டது, இது eBPF சூடோகோடைச் சரிபார்த்த பிறகு கட்டத்தில் தடுக்கப்பட்டது, ஆனால் அதன் JIT தொகுப்பிற்கு முன்.

unprivileged userid நேம்ஸ்பேஸில், /proc/self/mountinfo கோப்பு திறக்கப்பட்டு, பைண்ட்-மவுண்டட் கோப்பகத்தின் நீண்ட பாதைப்பெயர் வாசிக்கப்படுகிறது, இதன் விளைவாக "//நீக்கப்பட்டது" என்ற சரம் பஃபர் தொடங்கும் முன் பகுதிக்கு எழுதப்படும். வரியை எழுதுவதற்கான நிலை தேர்ந்தெடுக்கப்பட்டது, இதனால் ஏற்கனவே சோதிக்கப்பட்ட ஆனால் இன்னும் தொகுக்கப்படாத eBPF திட்டத்தில் உள்ள வழிமுறைகளை மேலெழுதும்.

அடுத்து, eBPF நிரல் மட்டத்தில், btf மற்றும் map_push_elem கட்டமைப்புகளைக் கையாள்வதன் மூலம் மற்ற கர்னல் கட்டமைப்புகளைப் படிக்கவும் எழுதவும் கட்டுப்படுத்தப்படாத கட்டுப்பாடற்ற திறனாக மாற்றப்படுகிறது. இதன் விளைவாக, சுரண்டல் கர்னல் நினைவகத்தில் modprobe_path[] இடையகத்தின் இருப்பிடத்தைத் தீர்மானிக்கிறது மற்றும் அதில் உள்ள “/sbin/modprobe” பாதையை மேலெழுதுகிறது, இது ஒரு நிகழ்வின் போது ரூட் உரிமைகளுடன் எந்த இயங்கக்கூடிய கோப்பையும் தொடங்க உங்களை அனுமதிக்கிறது. request_module() call, இது செயல்படுத்தப்படுகிறது, எடுத்துக்காட்டாக, netlink சாக்கெட்டை உருவாக்கும் போது.

ஆராய்ச்சியாளர்கள் ஒரு குறிப்பிட்ட சுரண்டலுக்கு மட்டுமே பயனுள்ள பல தீர்வுகளை வழங்குகிறார்கள், ஆனால் சிக்கலை நீக்குவதில்லை. தனி பயனர் ஐடி பெயர்வெளியில் மவுண்டிங் கோப்பகங்களை முடக்க "/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 இன் உள்ளடக்கங்களைக் கண்காணித்து அலசுகிறது, மேலும் அலகு_பெயர்_பாத்_எஸ்கேப்() செயல்பாட்டில் உள்ள ஒவ்வொரு மவுண்ட் பாயிண்டையும் செயலாக்குகிறது, இது ஒரு strdupa() செயல்பாட்டைச் செய்கிறது, இது தரவை டைனமிக் ஒதுக்கப்பட்ட நினைவகத்தில் அல்லாமல் அடுக்கில் வைக்கிறது. . RLIMIT_STACK வழியாக அதிகபட்ச ஸ்டாக் அளவு வரம்பிடப்பட்டிருப்பதால், மவுண்ட் பாயிண்டிற்கு மிகப் பெரிய பாதையைச் செயலாக்குவது PID1 செயல்முறை செயலிழந்து கணினியை நிறுத்துகிறது. தாக்குதலுக்கு, நீங்கள் மிகவும் உள்ளமைக்கப்பட்ட கோப்பகத்தை மவுண்ட் பாயிண்டாகப் பயன்படுத்துவதன் மூலம் எளிமையான FUSE தொகுதியைப் பயன்படுத்தலாம், இதன் பாதை அளவு 8 MB ஐ விட அதிகமாகும்.

systemd 220 (ஏப்ரல் 2015) முதல் சிக்கல் தோன்றுகிறது, இது ஏற்கனவே முக்கிய systemd களஞ்சியத்தில் சரி செய்யப்பட்டது மற்றும் விநியோகங்களில் சரி செய்யப்பட்டது (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch). குறிப்பிடத்தக்க வகையில், systemd வெளியீடு 248 இல் /proc/self/mountinfo இன் செயலாக்கம் தோல்வியடையும் systemd குறியீட்டில் உள்ள பிழையின் காரணமாக சுரண்டல் வேலை செய்யாது. 2018 ஆம் ஆண்டில், இதேபோன்ற சூழ்நிலை ஏற்பட்டது மற்றும் லினக்ஸ் கர்னலில் CVE-2018-14634 பாதிப்புக்கு ஒரு சுரண்டலை எழுத முயற்சிக்கும்போது, ​​​​Qualys ஆராய்ச்சியாளர்கள் systemd இல் மூன்று முக்கியமான பாதிப்புகளைக் கண்டனர் என்பதும் சுவாரஸ்யமானது.

ஆதாரம்: opennet.ru

கருத்தைச் சேர்