Root-ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ Π² инструмСнтарии управлСния ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌΠΈ Snap

Компания Qualys выявила Ρ‚Ρ€Π΅Ρ‚ΡŒΡŽ Π² этому Π³ΠΎΠ΄Ρƒ ΠΎΠΏΠ°ΡΠ½ΡƒΡŽ ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ (CVE-2022-3328) Π² ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π΅ snap-confine, поставляСмой с Ρ„Π»Π°Π³ΠΎΠΌ SUID root ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ процСссом snapd для формирования исполняСмого окруТСния для ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, распространяСмых Π² самодостаточных ΠΏΠ°ΠΊΠ΅Ρ‚Π°Ρ… Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ snap. Π£ΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ позволяСт Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ Π½Π΅ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌΡƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ выполнСния ΠΊΠΎΠ΄Π° с ΠΏΡ€Π°Π²Π°ΠΌΠΈ root Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Ubuntu ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° устранСна Π² выпускС snapd 2.57.6. ОбновлСния ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Π²Ρ‹ΠΏΡƒΡ‰Π΅Π½Ρ‹ для всСх ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… Π²Π΅Ρ‚ΠΎΠΊ Ubuntu.

Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ, Ρ‡Ρ‚ΠΎ рассматриваСмая ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ Π±Ρ‹Π»Π° внСсСна Π² процСссС исправлСния ΠΏΠΎΡ…ΠΎΠΆΠ΅ΠΉ Ρ„Π΅Π²Ρ€Π°Π»ΡŒΡΠΊΠΎΠΉ уязвимости Π² snap-confine. Π˜ΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ эксплоит, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ root-доступ Π² Ubuntu Server 22.04, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΊΡ€ΠΎΠΌΠ΅ уязвимости Π² snap-confine Ρ‚Π°ΠΊΠΆΠ΅ задСйствованы Π΄Π²Π΅ уязвимости Π² процСссС multipathd (CVE-2022-41974, CVE-2022-41973), связанныС с ΠΎΠ±Ρ…ΠΎΠ΄ΠΎΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΏΠΎΠ»Π½ΠΎΠΌΠΎΡ‡ΠΈΠΉ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈ нСбСзопасной Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ с символичСскими ссылками.

Π£ΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ Π² snap-confine Π²Ρ‹Π·Π²Π°Π½Π° состояниСм Π³ΠΎΠ½ΠΊΠΈ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ must_mkdir_and_open_with_perms(), Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΠΎΠΉ для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΎΡ‚ ΠΏΠΎΠ΄ΠΌΠ΅Π½Ρ‹ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° /tmp/snap.$SNAP_NAME Π½Π° ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ссылку Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ послС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π°, Π½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ΠΌ ΠΊ систСмному Π²Ρ‹Π·ΠΎΠ²Ρƒ mount для bind-монтирования Π² Π½Π΅Π³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² для ΠΏΠ°ΠΊΠ΅Ρ‚Π° Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ snap. ДобавлСнная Π·Π°Ρ‰ΠΈΡ‚Π° сводилась ΠΊ ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΡŽ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° /tmp/snap.$SNAP_NAME Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π² /tmp со случайным ΠΈΠΌΠ΅Π½Π΅ΠΌ, Ссли ΠΎΠ½ сущСствуСт ΠΈ Π½Π΅ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ root.

ΠŸΡ€ΠΈ эксплуатации ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ пСрСимСнования ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° /tmp/snap.$SNAP_NAME исслСдоватСли воспользовались Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ snap-confine Ρ‚Π°ΠΊΠΆΠ΅ создаёт ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ /tmp/snap.rootfs_XXXXXX для корня содСрТимого ΠΏΠ°ΠΊΠ΅Ρ‚Π° snap. Π§Π°ΡΡ‚ΡŒ «XXXXXX» Π² ΠΈΠΌΠ΅Π½ΠΈ выбираСтся случайно ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ mkdtemp(), Π½ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚ с ΠΈΠΌΠ΅Π½Π΅ΠΌ «rootfs_XXXXXX» ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sc_instance_name_validate (Ρ‚.Π΅. идСя Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ имя $SNAP_NAME приняло Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ «rootfs_XXXXXX» ΠΈ Ρ‚ΠΎΠ³Π΄Π° опСрация пСрСимСнования ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ пСрСзаписи ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° /tmp/snap.rootfs_XXXXXX с ΠΊΠΎΡ€Π½Π΅ΠΌ snap).

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ использования /tmp/snap.rootfs_XXXXXX ΠΈ пСрСимСнования /tmp/snap.$SNAP_NAME Π±Ρ‹Π»ΠΎ Π·Π°ΠΏΡƒΡ‰Π΅Π½ΠΎ Π΄Π²Π° экзСмпляра snap-confine. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ экзСмпляр создавал /tmp/snap.rootfs_XXXXXX процСсс блокировался ΠΈ запускался Π²Ρ‚ΠΎΡ€ΠΎΠΉ экзСмпляр с ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚Π° rootfs_XXXXXX, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ»ΠΎ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ /tmp/snap.$SNAP_NAME Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ экзСмпляра становился ΠΊΠΎΡ€Π½Π΅Π²Ρ‹ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠΌ /tmp/snap.rootfs_XXXXXX ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ. Π‘Ρ€Π°Π·Ρƒ послС выполнСния пСрСимСнования Π²Ρ‚ΠΎΡ€ΠΎΠΉ экзСмпляр Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π»ΡΡ, Π° /tmp/snap.rootfs_XXXXXX подмСнялся с манипуляциСй состояниСм Π³ΠΎΠ½ΠΊΠΈ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ эксплуатации Ρ„Π΅Π²Ρ€Π°Π»ΡŒΡΠΊΠΎΠΉ уязвимости. ПослС ΠΏΠΎΠ΄ΠΌΠ΅Π½Ρ‹ с ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ экзСмпляра снималась Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° выполнСния ΠΈ Π°Ρ‚Π°ΠΊΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π»ΠΈ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π½Π°Π΄ ΠΊΠΎΡ€Π½Π΅Π²Ρ‹ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠΌ snap.

На послСднСм этапС создавалась символичСская ссылка /tmp/snap.rootfs_XXXXXX/tmp, которая использовалась Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ sc_bootstrap_mount_namespace() для bind-монтирования доступного Π½Π° запись Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° /tmp Π² любой ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π€Π‘, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π²Ρ‹Π·ΠΎΠ² mount() слСдуСт символичСским ссылкам ΠΏΠ΅Ρ€Π΅Π΄ ΠΌΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ. ПодобноС ΠΌΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ блокируСтся ограничСниями AppArmor, Π½ΠΎ для ΠΎΠ±Ρ…ΠΎΠ΄Π° этой Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π² эксплоитС Π±Ρ‹Π»ΠΈ задСйствован Π΄Π²Π΅ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ уязвимости Π² multipathd.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru