Π£ΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ php-fpm, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ Π½Π° сСрвСрС

Доступны ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Ρ€Π΅Π»ΠΈΠ·Ρ‹ PHP 7.3.11, 7.1.33 ΠΈ 7.2.24, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… устранСна критичСская ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ (CVE-2019-11043) Π² Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΈ PHP-FPM (ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ процСссов FastCGI), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ свой ΠΊΠΎΠ΄ Π² систСмС. Для Π°Ρ‚Π°ΠΊΠΈ Π½Π° сСрвСры, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ для запуска PHP-скриптов PHP-FPM Π² связкС с Nginx, ΡƒΠΆΠ΅ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎ доступСн Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ эксплоит.

Атака Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° Π² конфигурациях nginx, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… проброс Π² PHP-FPM осущСствляСтся c Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ частСй URL ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ «fastcgi_split_path_info» ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ окруТСния PATH_INFO, Π½ΠΎ Π±Π΅Π· ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ сущСствования Ρ„Π°ΠΉΠ»Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ «try_files $fastcgi_script_name» ΠΈΠ»ΠΈ конструкциСй «if (!-f $document_root$fastcgi_script_name)». ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ числС проявляСтся Π² настройках, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΡ‹Ρ… для ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ NextCloud. НапримСр, уязвимы ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ с конструкциями Π²ΠΈΠ΄Π°:

location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass php:9000;
}

ΠŸΡ€ΠΎΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° устранСниСм ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π² дистрибутивах ΠΌΠΎΠΆΠ½ΠΎ Π½Π° Π΄Π°Π½Π½Ρ‹Ρ… страницах: Debian, RHEL, Ubuntu, SUSE/openSUSE, FreeBSD, Arch, Fedora. Π’ качСствС ΠΎΠ±Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π·Π°Ρ‰ΠΈΡ‚Ρ‹ послС строки «fastcgi_split_path_info» ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ сущСствования Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½Π½ΠΎΠ³ΠΎ PHP-Ρ„Π°ΠΉΠ»Π°:

try_files $fastcgi_script_name =404;

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π²Ρ‹Π·Π²Π°Π½Π° ошибкой ΠΏΡ€ΠΈ манипуляции с указатСлями Π² Ρ„Π°ΠΉΠ»Π΅ sapi/fpm/fpm/fpm_main.c. ΠŸΡ€ΠΈ присвоСнии указатСля прСдполагаСтся, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ окруТСния PATH_INFO ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ содСрТит прСфикс, ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠΉ с ΠΏΡƒΡ‚Ρ‘ΠΌ ΠΊ PHP-скрипту.
Если Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π΅ fastcgi_split_path_info ΡƒΠΊΠ°Π·Π°Π½ΠΎ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΡƒΡ‚ΠΈ ΠΊ скрипту с использованиСм рСгулярного выраТСния, Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ символа ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… прСдлагаСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ «^(.+?\.php)(/.*)$»), Ρ‚ΠΎ Π°Ρ‚Π°ΠΊΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ записи Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ окруТСния PATH_INFO пустого значСния. Π’ этом случаС Π΄Π°Π»Π΅Π΅ ΠΏΠΎ Ρ…ΠΎΠ΄Ρƒ выполнСния осущСствляСтся запись Π² path_info[0] нуля ΠΈ Π²Ρ‹Π·ΠΎΠ² FCGI_PUTENV.

Запросив ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΎΡ„ΠΎΡ€ΠΌΠ»Π΅Π½Π½Ρ‹ΠΉ URL Π°Ρ‚Π°ΠΊΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ смСщСния указатСля path_info Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π±Π°ΠΉΡ‚ структуры «_fcgi_data_seg», Π° запись нуля Π² этот Π±Π°ΠΉΡ‚ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΡŽ указатСля «char* pos» Π½Π° Ρ€Π°Π½Π΅Π΅ ΠΈΠ΄ΡƒΡ‰ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти. Π’Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ слСдом FCGI_PUTENV ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡˆΠ΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ Π² этой памяти Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π°Ρ‚Π°ΠΊΡƒΡŽΡ‰ΠΈΠΉ. Π’ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ памяти Π² Ρ‚ΠΎΠΌ числС хранятся значСния Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… FastCGI ΠΈ записав свои Π΄Π°Π½Π½Ρ‹Π΅ Π°Ρ‚Π°ΠΊΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„ΠΈΠΊΡ‚ΠΈΠ²Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ PHP_VALUE ΠΈ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ выполнСния своСго ΠΊΠΎΠ΄Π°.

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