Раскрыты подробности критичСской уязвимости Π² Exim

ΠžΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ выпуск Exim 4.92.2 с устранСниСм критичСской уязвимости (CVE-2019-15846), которая Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΠΎΠΌΡƒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ ΠΊΠΎΠ΄Π° Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠ° с ΠΏΡ€Π°Π²Π°ΠΌΠΈ root. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° проявляСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ TLS ΠΈ эксплуатируСтся Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΎΡ„ΠΎΡ€ΠΌΠ»Π΅Π½Π½ΠΎΠ³ΠΎ клиСнтского сСртификата ΠΈΠ»ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ значСния Π² SNI. Π£ΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ выявлСна ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠ΅ΠΉ Qualys.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° присутствуСт Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ экранирования спСцсимволов Π² строкС (string_interpret_escape() ΠΈΠ· string.c) ΠΈ Π²Ρ‹Π·Π²Π°Π½Π° Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ символ ‘\’ Π² ΠΊΠΎΠ½Ρ†Π΅ строки интСрпрСтируСтся ΠΏΠ΅Ρ€Π΅Π΄ Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ символом (‘\0’) ΠΈ экранируСт Π΅Π³ΠΎ. ΠŸΡ€ΠΈ экранировании ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ‘\’ ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π΄Π°Π»Π΅Π΅ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ ΠΊΠΎΠ΄ ΠΊΠΎΠ½Ρ†Π° строки обрабатываСтся ΠΊΠ°ΠΊ ΠΎΠ΄ΠΈΠ½ символ ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ сдвигаСтся Π½Π° Π΄Π°Π½Π½Ρ‹Π΅ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ строки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ Π΅Ρ‘ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅.

Код, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ string_interpret_escape(), выдСляСт Π±ΡƒΡ„Π΅Ρ€ ΠΏΠΎΠ΄ стоку, Ρ€ΡƒΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΡƒΡΡΡŒ фактичСским Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ, ΠΈ выставлСнный ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ оказываСтся Π² области Π²Π½Π΅ Π³Ρ€Π°Π½ΠΈΡ† Π±ΡƒΡ„Π΅Ρ€Π°. БоотвСтствСнно, ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ строки Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ситуация чтСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· области Π²Π½Π΅ Π³Ρ€Π°Π½ΠΈΡ† Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π±ΡƒΡ„Π΅Ρ€Π°, Π° ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° записи разэкранированной строки ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ записи Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ Π±ΡƒΡ„Π΅Ρ€Π°.

Π’ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ эксплуатирована Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΎΡ„ΠΎΡ€ΠΌΠ»Π΅Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π² SNI ΠΏΡ€ΠΈ установкС Π·Π°Ρ‰ΠΈΡ‰Ρ‘Π½Π½ΠΎΠ³ΠΎ соСдинСния ΠΊ сСрвСру. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ эксаплуатирована Ρ‡Π΅Ρ€Π΅Π· ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ peerdn Π² конфигурациях, настроСнных для Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΏΠΎ сСртификату ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π΅ сСртификатов. Атака Ρ‡Π΅Ρ€Π΅Π· SNI ΠΈ peerdn Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° начиная с выпуска Exim 4.80, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ функция string_unprinting() Π±Ρ‹Π»Π° ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π° для разэкранирования содСрТимого peerdn ΠΈ SNI.

Для Π°Ρ‚Π°ΠΊΠΈ Ρ‡Π΅Ρ€Π΅Π· SNI ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ эксплоита, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ Π½Π° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ… i386 ΠΈ amd64 Π² Linux-систСмах с Glibc. Π’ эксплоитС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½Π°Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΊΡƒΡ‡ΠΈ, приводящСС ΠΊ пСрСзаписи памяти, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ хранится имя Ρ„Π°ΠΉΠ»Π° Π»ΠΎΠ³Π°. Имя Ρ„Π°ΠΉΠ»Π° замСняСтся Π½Π° «/../../../../../../../../etc/passwd». Π”Π°Π»Π΅Π΅ пСрСзаписываСтся пСрСмСнная с адрСсом отправитСля, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ сохраняСтся Π² Π»ΠΎΠ³, Ρ‡Ρ‚ΠΎ позволяСт Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π² систСму.

ОбновлСния ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² с устранСниСм уязвимости Π²Ρ‹ΠΏΡƒΡ‰Π΅Π½ΠΎ дистрибутивами Debian, Ubuntu, Fedora, SUSE/openSUSE ΠΈ FreeBSD. RHEL ΠΈ CentOS ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅ Π½Π΅ ΠΏΠΎΠ΄Π²Π΅Ρ€ΠΆΠ΅Π½Ρ‹, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Exim Π½Π΅ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² ΠΈΡ… ΡˆΡ‚Π°Ρ‚Π½Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² (Π² EPEL ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡƒΠΆΠ΅ сформировано, Π½ΠΎ ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ΠΎ Π² ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ). Π’ ΠΊΠΎΠ΄Π΅ Exim ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° устраняСтся однострочным ΠΏΠ°Ρ‚Ρ‡Π΅ΠΌ, ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅ΠΌ ΡΠΊΡ€Π°Π½ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ дСйствиС ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ слэша, Ссли ΠΎΠ½ находится Π² ΠΊΠΎΠ½Ρ†Π΅ строки.

Π’ качСствС ΠΎΠ±Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡƒΡ‚ΠΈ для блокирования уязвимости ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ TLS ΠΈΠ»ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π²
ΡΠ΅ΠΊΡ†ΠΈΡŽ ACL «acl_smtp_mail»:

deny condition = ${if eq{\\}{${substr{-1}{1}{$tls_in_sni}}}}
deny condition = ${if eq{\\}{${substr{-1}{1}{$tls_in_peerdn}}}}

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

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ