ಲಿನಕ್ಸ್ ಕರ್ನಲ್‌ನಲ್ಲಿ ರೂಟ್ ದುರ್ಬಲತೆ ಮತ್ತು systemd ನಲ್ಲಿ ಸೇವೆಯ ನಿರಾಕರಣೆ

ಕ್ವಾಲಿಸ್‌ನ ಭದ್ರತಾ ಸಂಶೋಧಕರು Linux ಕರ್ನಲ್ ಮತ್ತು systemd ಸಿಸ್ಟಮ್ ಮ್ಯಾನೇಜರ್ ಮೇಲೆ ಪರಿಣಾಮ ಬೀರುವ ಎರಡು ದೋಷಗಳ ವಿವರಗಳನ್ನು ಬಹಿರಂಗಪಡಿಸಿದ್ದಾರೆ. ಕರ್ನಲ್‌ನಲ್ಲಿನ ದುರ್ಬಲತೆ (CVE-2021-33909) ಸ್ಥಳೀಯ ಬಳಕೆದಾರರಿಗೆ ಹೆಚ್ಚು ನೆಸ್ಟೆಡ್ ಡೈರೆಕ್ಟರಿಗಳ ಕುಶಲತೆಯ ಮೂಲಕ ಮೂಲ ಹಕ್ಕುಗಳೊಂದಿಗೆ ಕೋಡ್ ಎಕ್ಸಿಕ್ಯೂಶನ್ ಸಾಧಿಸಲು ಅನುಮತಿಸುತ್ತದೆ.

ಡೀಫಾಲ್ಟ್ ಕಾನ್ಫಿಗರೇಶನ್‌ನಲ್ಲಿ Ubuntu 20.04/20.10/21.04, Debian 11 ಮತ್ತು Fedora 34 ನಲ್ಲಿ ಕೆಲಸ ಮಾಡುವ ವರ್ಕಿಂಗ್ ಶೋಷಣೆಗಳನ್ನು ಸಿದ್ಧಪಡಿಸಲು ಸಂಶೋಧಕರು ಸಮರ್ಥರಾಗಿದ್ದಾರೆ ಎಂಬ ಅಂಶದಿಂದ ದುರ್ಬಲತೆಯ ಅಪಾಯವು ಉಲ್ಬಣಗೊಂಡಿದೆ. ಇತರ ವಿತರಣೆಗಳನ್ನು ಪರೀಕ್ಷಿಸಲಾಗಿಲ್ಲ ಎಂದು ಗಮನಿಸಲಾಗಿದೆ, ಆದರೆ ಸೈದ್ಧಾಂತಿಕವಾಗಿ ಸಹ ಸಮಸ್ಯೆಗೆ ಒಳಗಾಗುತ್ತದೆ ಮತ್ತು ದಾಳಿ ಮಾಡಬಹುದು. ಶೋಷಣೆಗಳ ಸಂಪೂರ್ಣ ಕೋಡ್ ಅನ್ನು ಎಲ್ಲೆಡೆ ಸಮಸ್ಯೆಯನ್ನು ತೊಡೆದುಹಾಕಿದ ನಂತರ ಪ್ರಕಟಿಸಲಾಗುವುದು ಎಂದು ಭರವಸೆ ನೀಡಲಾಗಿದೆ, ಆದರೆ ಇದೀಗ ಸೀಮಿತ ಕಾರ್ಯನಿರ್ವಹಣೆಯ ಮೂಲಮಾದರಿಯು ಮಾತ್ರ ಲಭ್ಯವಿದೆ, ಇದರಿಂದಾಗಿ ಸಿಸ್ಟಮ್ ಕ್ರ್ಯಾಶ್ ಆಗುತ್ತದೆ. ಸಮಸ್ಯೆಯು ಜುಲೈ 2014 ರಿಂದ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ ಮತ್ತು 3.16 ರಿಂದ ಪ್ರಾರಂಭವಾಗುವ ಕರ್ನಲ್ ಬಿಡುಗಡೆಗಳ ಮೇಲೆ ಪರಿಣಾಮ ಬೀರುತ್ತದೆ. ದುರ್ಬಲತೆಯ ಪರಿಹಾರವನ್ನು ಸಮುದಾಯದೊಂದಿಗೆ ಸಂಯೋಜಿಸಲಾಗಿದೆ ಮತ್ತು ಜುಲೈ 19 ರಂದು ಕರ್ನಲ್‌ಗೆ ಸ್ವೀಕರಿಸಲಾಗಿದೆ. ಮುಖ್ಯ ವಿತರಣೆಗಳು ಈಗಾಗಲೇ ತಮ್ಮ ಕರ್ನಲ್ ಪ್ಯಾಕೇಜುಗಳಿಗೆ (ಡೆಬಿಯನ್, ಉಬುಂಟು, ಫೆಡೋರಾ, ಆರ್ಹೆಚ್ಇಎಲ್, ಎಸ್ಯುಎಸ್ಇ, ಆರ್ಚ್) ನವೀಕರಣಗಳನ್ನು ರಚಿಸಿವೆ.

seq_file ಕೋಡ್‌ನಲ್ಲಿ ಕಾರ್ಯಾಚರಣೆಗಳನ್ನು ನಿರ್ವಹಿಸುವ ಮೊದಲು ಗಾತ್ರ_t ಇಂಟ್ ಪರಿವರ್ತನೆಯ ಫಲಿತಾಂಶವನ್ನು ಪರಿಶೀಲಿಸುವಲ್ಲಿ ವಿಫಲತೆಯಿಂದಾಗಿ ದುರ್ಬಲತೆಯು ಉಂಟಾಗುತ್ತದೆ, ಇದು ದಾಖಲೆಗಳ ಅನುಕ್ರಮದಿಂದ ಫೈಲ್‌ಗಳನ್ನು ರಚಿಸುತ್ತದೆ. ಪರಿಶೀಲಿಸಲು ವಿಫಲವಾದರೆ, ಬಹಳ ನೆಸ್ಟೆಡ್ ಡೈರೆಕ್ಟರಿ ರಚನೆಯನ್ನು ರಚಿಸುವಾಗ, ಆರೋಹಿಸುವಾಗ ಮತ್ತು ಅಳಿಸುವಾಗ (1 GB ಗಿಂತ ಹೆಚ್ಚಿನ ಮಾರ್ಗದ ಗಾತ್ರ) ಬಫರ್‌ಗೆ ಹೊರಗಿನ ಬರಹಗಳಿಗೆ ಕಾರಣವಾಗಬಹುದು. ಪರಿಣಾಮವಾಗಿ, ಆಕ್ರಮಣಕಾರರು "-10 GB - 2 ಬೈಟ್‌ಗಳ" ಆಫ್‌ಸೆಟ್‌ನಲ್ಲಿ ಬರೆಯಲಾದ 10-ಬೈಟ್ ಸ್ಟ್ರಿಂಗ್ ಅನ್ನು "// ಅಳಿಸಲಾಗಿದೆ" ಸಾಧಿಸಬಹುದು.

ಸಿದ್ಧಪಡಿಸಿದ ಶೋಷಣೆಯು ಕಾರ್ಯನಿರ್ವಹಿಸಲು 5 GB ಮೆಮೊರಿ ಮತ್ತು 1 ಮಿಲಿಯನ್ ಉಚಿತ ಐನೋಡ್‌ಗಳ ಅಗತ್ಯವಿದೆ. 1 GB ಗಿಂತ ಹೆಚ್ಚಿನ ಫೈಲ್ ಪಾತ್ ಗಾತ್ರವನ್ನು ಸಾಧಿಸಲು ಸುಮಾರು ಒಂದು ಮಿಲಿಯನ್ ಉಪ ಡೈರೆಕ್ಟರಿಗಳ ಶ್ರೇಣಿಯನ್ನು ರಚಿಸಲು mkdir() ಗೆ ಕರೆ ಮಾಡುವ ಮೂಲಕ ಶೋಷಣೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ. ಈ ಡೈರೆಕ್ಟರಿಯನ್ನು ಬೈಂಡ್-ಮೌಂಟ್ ಮೂಲಕ ಪ್ರತ್ಯೇಕ ಬಳಕೆದಾರ ನೇಮ್‌ಸ್ಪೇಸ್‌ನಲ್ಲಿ ಅಳವಡಿಸಲಾಗಿದೆ, ಅದರ ನಂತರ ಅದನ್ನು ತೆಗೆದುಹಾಕಲು rmdir() ಕಾರ್ಯವನ್ನು ಚಾಲನೆ ಮಾಡಲಾಗುತ್ತದೆ. ಸಮಾನಾಂತರವಾಗಿ, ಒಂದು ಸಣ್ಣ eBPF ಪ್ರೋಗ್ರಾಂ ಅನ್ನು ಲೋಡ್ ಮಾಡುವ ಥ್ರೆಡ್ ಅನ್ನು ರಚಿಸಲಾಗಿದೆ, ಇದು eBPF ಸೂಡೊಕೋಡ್ ಅನ್ನು ಪರಿಶೀಲಿಸಿದ ನಂತರ ಹಂತದಲ್ಲಿ ನಿರ್ಬಂಧಿಸಲ್ಪಡುತ್ತದೆ, ಆದರೆ ಅದರ JIT ಸಂಕಲನದ ಮೊದಲು.

ಸವಲತ್ತುಗಳಿಲ್ಲದ userid ನೇಮ್‌ಸ್ಪೇಸ್‌ನಲ್ಲಿ, ಫೈಲ್ /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 ನ ವಿಷಯಗಳನ್ನು ಟ್ರ್ಯಾಕ್ ಮಾಡುತ್ತದೆ ಮತ್ತು ಪಾರ್ಸ್ ಮಾಡುತ್ತದೆ ಮತ್ತು ಘಟಕ_ಹೆಸರು_path_escape() ಫಂಕ್ಷನ್‌ನಲ್ಲಿ ಪ್ರತಿ ಮೌಂಟ್ ಪಾಯಿಂಟ್ ಅನ್ನು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸುತ್ತದೆ, ಇದು ಸ್ಟ್ರಡುಪಾ() ಕಾರ್ಯಾಚರಣೆಯನ್ನು ನಿರ್ವಹಿಸುತ್ತದೆ, ಅದು ಡೇಟಾವನ್ನು ಡೈನಾಮಿಕ್ ಆಗಿ ನಿಯೋಜಿಸಲಾದ ಮೆಮೊರಿಯಲ್ಲಿ ಇರಿಸುವ ಬದಲು ಸ್ಟಾಕ್‌ನಲ್ಲಿ ಇರಿಸುತ್ತದೆ. . ಗರಿಷ್ಠ ಸ್ಟಾಕ್ ಗಾತ್ರವು 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 ದುರ್ಬಲತೆಗಾಗಿ ಶೋಷಣೆಯನ್ನು ಬರೆಯಲು ಪ್ರಯತ್ನಿಸುವಾಗ, ಕ್ವಾಲಿಸ್ ಸಂಶೋಧಕರು systemd ನಲ್ಲಿ ಮೂರು ನಿರ್ಣಾಯಕ ದೋಷಗಳನ್ನು ಕಂಡರು ಎಂಬುದು ಕುತೂಹಲಕಾರಿಯಾಗಿದೆ.

ಮೂಲ: opennet.ru

ಕಾಮೆಂಟ್ ಅನ್ನು ಸೇರಿಸಿ