CVE-2021-3156 - sudo local root sebezhetőség

Heap-based buffer overflow sebezhetőséget fedeztek fel a sudo-ban. A sebezhetőséget sikeresen kihasználó helyi támadó root joghoz juthat az áldozat rendszerén. Az érintett sudo verziók:

We discovered a heap-based buffer overflow in Sudo
(https://www.sudo.ws/). This vulnerability:

- is exploitable by any local user (normal users and system users,
  sudoers and non-sudoers), without authentication (i.e., the attacker
  does not need to know the user's password);

- was introduced in July 2011 (commit 8255ed69), and affects all legacy
  versions from 1.8.2 to 1.8.31p2 and all stable versions from 1.9.0 to
  1.9.5p1, in their default configuration.

We developed three different exploits for this vulnerability, and
obtained full root privileges on Ubuntu 20.04 (Sudo 1.8.31), Debian 10
(Sudo 1.8.27), and Fedora 33 (Sudo 1.9.2). Other operating systems and
distributions are probably also exploitable.

 A sebezhetőségre több PoC exploit is elérhető:

Linkek:

Hozzászólások

if [ "$mindenrendben" == "igen" ] ; then
          # normal operation...
else
          provide_root_access
fi

Semmi esetre nem helyes, de a helyesség anyanyelvi nyelvhasználókat nem érdekli. Plusz ez szerintem elírás, először We were akart lenni, aztán átjavította I-ra és collaborationre, de elfelejtette egyeztetni a számot. Magyarban is vétenek ilyen hibát néha, mondat bizonyos számban kezdődik, de máshogy fejeződik be. Egyébként meg olyan van, hogy „You was”, sokan azt helytelennek tartják, de tájnyelvileg, régies beszédben használják.

Windows 95/98: 32 bit extension and a graphical shell for a 16 bit patch to an 8 bit operating system originally coded for a 4 bit microprocessor, written by a 2 bit company that can't stand 1 bit of competition.”

A C-ben írt dolgokkal ellentétben a Rust-ban írt szoftverek elterjedésének ez lesz a nagy előnye. Itt a nyelv garantálja, hogy ne lehessen hasonló overflow-jellegű sérülékenység a programban.
Félreértés ne essék, szeretem a C-t. De látom hogy nagyobb projekteknél a kódoló emberből van, benne felejt egy-egy ilyen esetet, ami előbb-utóbb ki is lesz használva.

... C-nél meg ha az ember akarná, akkor sem ellenőriz kellőképpen a fordító.

Egyébként a C biztonságosabbá tételére voltak törekvések. Ezeket a kísérleteket tulajdonképpen a Rust végleg háttérbe szorította:
   https://www.microsoft.com/en-us/research/project/checked-c/
   http://www.safe-c.org/start-en.html

Egyúttal egy adalék: Rust-nál az unsafe { .. } kulcsszó mellett azért tanulni kell az unsafe programming lehetőségeit, önmagában a kulcsszó betételétől nem válik a kód unsafe-fé.

Biztos vagy benne? Mert az Ubuntu oldala alapján a mai napig 1.9.1-es verzió van, ami elvileg sebezhető. Persze nem tartom kizártnak, hogy nálad frissülhetett, de akkor más forrásból, PPA, vagy valami testinges tárolóból. Ami egyébként pozitív, félre ne érts, csak az a baj, hogy az ubuntus, mintes, stb. felhasználók zöménél nem fog frissülni még jó ideig default. Esetleg az ubuntusok a patcht még a régi 1.9.1-es kódfába hekkelték bele, ez még elképzelhető.

Windows 95/98: 32 bit extension and a graphical shell for a 16 bit patch to an 8 bit operating system originally coded for a 4 bit microprocessor, written by a 2 bit company that can't stand 1 bit of competition.”

Ez picit másképp működik a disztribúcióknál. Például Debian Buster és a benne levő sudo changelog.Debian.gz állományából:

sudo (1.8.27-1+deb10u3) buster-security; urgency=high
  ...
  * Heap-based buffer overflow (CVE-2021-3156)

 -- Salvatore Bonaccorso <...@debian.org>  Wed, 20 Jan 2021 13:26:17 +0100
 

Szóval az 1.9.1 és alatta való verziók sérülékenyek? Nem, ha a disztróban ki van javítva.

Írtam is, hogy ezt elképzelhetőnek tartom, kösz a megerősítő infót. Bár azt nem tudom a disztrósok minek dolgoznának ilyennel, mivel jobb az 1.9.1-et patchelni, mint a sudo fejlesztők által kiadott upstream 1.9.5p2-őt betenni a tárolókba. Tudom, nem stabillll, összerogyik de bugról nem számoltak még be rollingokon sem. A másik, ha meg már patchelik, azt verziószámban is ki kéne fejezniük, tehát nem simán 1.9.1, meg 1.8.27, hanem rakjon a végére valami al/buildverziót. Mert ahogy mutatod, a Debian odabiggyesztett egy +deb10u3-at, ez így korrekt, jelezve van, de az Ubuntu nem jelöli, hogy patchelve van. Szóval nem azért, hogy a szavakat csűrjem, de a lényegben igazam volt, joggal feltételeztem, hogy az 1.9.1 sérülékeny. Ha azt patchelik, akkor viszont az nem az 1.9.1-es verzió többé, ha ezzel megtévesztenek, akkor az nem a user hibája. Azt is elhiszem, hogy az ubuntus changelog-ban is benne van, ha belenézünk a .deb csomagba, de hát ugye elvárjuk, hogy a felhasználó nyomozgasson ezért.

Archon, Fedorán azonnal látod a sudo -V vagy a csomagkezelő csomaginfójából, hogy 1.9.5p2, azonnal látszik hogy nem sima 1.9.5 vagy régebbi. Itt a hangsúly nem a frissességen van, hanem hogy jelölve van normálisan, és már önmagában a verziószám tájékoztató jellegű, aki ettől tart, könnyen ellenőrizheti mindenféle rejtvényfejtés, kincskeresés, gondolatolvasás, és nyomozgatás nélkül. Ez nem kemény munka, meg precízkedés, hanem leginkább korrektség és hozzáállás kérdése.

Windows 95/98: 32 bit extension and a graphical shell for a 16 bit patch to an 8 bit operating system originally coded for a 4 bit microprocessor, written by a 2 bit company that can't stand 1 bit of competition.”

Debian changelog-ból például látod a verziókat, vagy a "dpkg -l" csomaglistában is látod, mi van feltéve:

sudo (1.8.27-1+deb10u3) buster-security; urgency=high  (2021. január 20.)
sudo (1.8.27-1+deb10u2) buster; urgency=medium         (2020. február 02.)
sudo (1.8.27-1+deb10u1) buster-security; urgency=high  (2019. október 12.)
       Debian 10 --> 2019. július 6-án lett kiadva. Alább még "testing" fázisban emelték be az új verziót.
sudo (1.8.27-1) unstable; urgency=medium                     (2019. január 12.)

Hogy miért a hibára a patch és miért nem új képességekkel gazdagított új verzió?
  * Új verzió -> régi hiba nincs benne, ellenben új hibát hozhat be.
  * Új verzió -> valami ráépülő cucc törhet (más kapcsolóelnevezés, más alap LIB amire más építene, bármi eltérő)
Ezek kockázata mind megvan. Itt jön a mérlegelés: új verzióval akarsz integrációs tesztet végezni és a lehetséges új hibák kockázatát is bevállalod, vagy az adott verzió sérülékenységét akarod csak egy-két sor módosításával kijavítani? A disztribució karbantartójaként adott esetben melyik a célszerűbb?
PHP futtatókörnyezet esetén például olyan összetett javítások fordulnak elő, hogy általában verzióváltás mellett döntenek.

php7.3 (7.3.19-1~deb10u1) buster-security; urgency=high      (2020. július 5.)
php7.3 (7.3.14-1~deb10u1) buster-security; urgency=medium (2020. február 16.)
php7.3 (7.3.11-1~deb10u1) buster-security; urgency=medium (2019. október 26.)
php7.3 (7.3.9-1~deb10u1) buster-security; urgency=high        (2019. szeptember 18.)
php7.3 (7.3.4-2) unstable; urgency=medium                           (még "testing" verziós Debian, 2019. április 13.)

$ apt-get changelog sudo

sudo (1.8.31-1ubuntu1.2) focal-security; urgency=medium

  * SECURITY UPDATE: dir existence issue via sudoedit race
    - debian/patches/CVE-2021-23239.patch: fix potential directory existing
      info leak in sudoedit in src/sudo_edit.c.
    - CVE-2021-23239
  * SECURITY UPDATE: heap-based buffer overflow
    - debian/patches/CVE-2021-3156-pre1.patch: sanity check size when
      converting the first record to TS_LOCKEXCL in
      plugins/sudoers/timestamp.c.
    - debian/patches/CVE-2021-3156-1.patch: reset valid_flags to
      MODE_NONINTERACTIVE for sudoedit in src/parse_args.c.
    - debian/patches/CVE-2021-3156-2.patch: add sudoedit flag checks in
      plugin in plugins/sudoers/policy.c.
    - debian/patches/CVE-2021-3156-3.patch: fix potential buffer overflow
      when unescaping backslashes in plugins/sudoers/sudoers.c.
    - debian/patches/CVE-2021-3156-4.patch: fix the memset offset when
      converting a v1 timestamp to TS_LOCKEXCL in
      plugins/sudoers/timestamp.c.
    - debian/patches/CVE-2021-3156-5.patch: don't assume that argv is
      allocated as a single flat buffer in src/parse_args.c.
    - CVE-2021-3156

 -- Marc Deslauriers <marc.deslauriers@ubuntu.com>  Tue, 19 Jan 2021 09:21:02 -0500

 Marc Deslauriers megpacthelte az 1.8.31ubuntu1 csomagot tartalmát és kiadta1.8.31ubuntu2-ként.

READY.
󠀠󠀠‎‏‏‎▓

Ja, Archban is, nem is a javítás a jó szó, mert nem a disztró fejlesztői javították, hanem a sudo-fejlesztők, és a sudo 1.9.5p2 megjelenésének a napján (nem biztos, hogy 26-a volt, lehet előbb) már elérhető volt a tárolókban. Nem hiába, a rolling előnye. Időközben meg a Ubuntu-n és a többi disztróvonalon a mai napig sebezhető. De ne bántsuk őket, az ő rendszerük eltéessss, meg stabillll, valamint corporate grade, nem ilyen közösségi rolling hobbidisztró, amit csak kalandorok használnak. (szerk.)

Én egyébként egy ezzel kapcsolatos videó hatására elkezdtem az OpenBSD-s doas-t használni. Persze azért vannak hátrányai, pl. nincs rá sudoedit-hez hasonló megoldás még (ezt könnyű lenne megírni), meg nem támogatja Arch alatt a bash-completion (még ezt is kivédeném zsh-val), és néhány disztrón nem tudja 15 percig megjegyezni (Arch nem érintett), hogy már meg volt adva a jelszó, de nem sok hiányzik, hogy valós alternatíva legyen. Kevesebbet tud, mint a sudo, de épp emiatt pehelysúlyúbb, biztonságosabb, és könnyebben is konfigurálható. Egyelőre alternatív jelleggel használom, tesztelem.

Windows 95/98: 32 bit extension and a graphical shell for a 16 bit patch to an 8 bit operating system originally coded for a 4 bit microprocessor, written by a 2 bit company that can't stand 1 bit of competition.”

Nem nagyon tudom miről beszélsz. Ez van a legutolsó Ubuntu LTS-ben (azaz 20.04, Focal)  levő sudo csomagban:

===

sudo (1.8.31-1ubuntu1.2) focal-security; urgency=medium

  * SECURITY UPDATE: dir existence issue via sudoedit race
    - debian/patches/CVE-2021-23239.patch: fix potential directory existing
      info leak in sudoedit in src/sudo_edit.c.
    - CVE-2021-23239
  * SECURITY UPDATE: heap-based buffer overflow
    - debian/patches/CVE-2021-3156-pre1.patch: sanity check size when
      converting the first record to TS_LOCKEXCL in
      plugins/sudoers/timestamp.c.
    - debian/patches/CVE-2021-3156-1.patch: reset valid_flags to
      MODE_NONINTERACTIVE for sudoedit in src/parse_args.c.
    - debian/patches/CVE-2021-3156-2.patch: add sudoedit flag checks in
      plugin in plugins/sudoers/policy.c.
    - debian/patches/CVE-2021-3156-3.patch: fix potential buffer overflow
      when unescaping backslashes in plugins/sudoers/sudoers.c.
    - debian/patches/CVE-2021-3156-4.patch: fix the memset offset when
      converting a v1 timestamp to TS_LOCKEXCL in
      plugins/sudoers/timestamp.c.
    - debian/patches/CVE-2021-3156-5.patch: don't assume that argv is
      allocated as a single flat buffer in src/parse_args.c.
    - CVE-2021-3156

 -- Marc Deslauriers <marc.deslauriers@ubuntu.com>  Tue, 19 Jan 2021 09:21:02 -0500

===

És visít is elég hamar a frissítéskezelő (vagy hogy a szarba hívják.) Osztán hogy rábök-e a frissít gombra a tisztelt júzer, az kurvára rajta múlik.

A FreeBSD-imen pedig ez van:

sudo  1.9.5p2
Last Update: 2021-01-26 20:15:31

Szintén rajtunk múlik, hogy mikor kezdünk frissíteni.

 

(Ja, látom az uborka-rantot áthúztad közben.)

Én az általam mutatott linken a 20.10 tárolójában néztem, ott csak simán 1.9.1 van írva. De gondolom már az is patchelt, ugyanígy 26-ától. Csak mivel nem vagyok Thomas Magnum P.I., így nem nyomozgatom ki. És továbbá nem, nálam nincs frissítéskezelő, majd én kezelem őket, nem kell sallangnak futnia a háttérben. Kézzel frissítek, igaz az én rendszereimen minden nap, vagy minden használatkor (ha az adott gépet napi ritkábban kapcsolnám be). Mondom, nekem csak az nem tetszik, hogy nem tüntetik fel jobban, így meg sokan joggal megijednek, főleg, ha nincsenek az adott gép előtt, hogy jajj istenem, sebezhető, közben meg már napok óta foltozva van. FreeBSD-től nem is vártam mást, mert ugyan ott valóban van ez-az régebbi verzión hagyva, de ezeket a kritikus toolokat gyorsan szokták frissíteni. Plusz ott tudtommal alapból doas megy.

Egyébként most elindítottam újra a frissítést, nem egészen egy órája futott le Archon, erre most a doas-hoz talált frissítést, igaz csak új build, v6.8.1-3. Ez egy másik jó példa, hogy normálisan odaírják a verziószámot, a -3-ból világosan látszik, hogy nem új verzió, csak új build. Ez elég ritka is, hogy valamiből már a 3. build megy, általában megáll 1-en, néha 2-őn.

Windows 95/98: 32 bit extension and a graphical shell for a 16 bit patch to an 8 bit operating system originally coded for a 4 bit microprocessor, written by a 2 bit company that can't stand 1 bit of competition.”

Szerkesztve: 2021. 02. 16., k – 12:18

ezt a POC-ot futtattam:

https://github.com/r4j0x00/exploits/
commit ef6df68c08fa47182496d33e68e646a01549dec2
Date:   Wed Feb 3 19:31:01 2021 +0530

$ cd ./CVE-2021-3156/

$ sudo -V
Sudo version 1.8.5p2

$ gcc -std=gnu99 exploit.c -o exploit

$ ./exploit

...rengeteg:
*** glibc detected *** /usr/bin/sudoedit: malloc(): memory corruption: 0x08756c50 ***
======= Backtrace: =========
...meg:
======= Memory map: ========
...és végül:
Failed

akkor most túl kevés volt a próbálkozás?