Достучаться до Композитора - Мой опыт борьбы с CVE-2026-109618 и CVE-2026-109619.
Посвященные знали заранее, а обычные админы и проггеры узнали вчера - все версии php критично уязвимы. Атаке может быть подвержен любой сервер, принимающий файлы по сети через "multipart/form-data". При этом не имеет значения, пользуетесь ли вы функционалом или нет в своих формах, при удачной атаке на сервере можно выполнить любой внедренный код.
Новые релизы были выпущены вчера 21.10.26 для версий php8.2-8.5 и для них никаких сложностей обновления не присутствует. У нас из 6 сайтов только один был на 8.4, остальные 8.0, 8.1 и 7.4. То есть надо было сначала установить новую версию php, исправить несовместимые фрагменты кода и обновить php через рекомендованный репо до версий, устраняющий уязвимость. А здесь уже возникают сложности. И одна из них, самая неожиданная, заключалась в том, что composer, точнее его репозитарий и серверы с кодовой базой оказались недоступны с территории нашей страны.
Обычный composer update отваливался по таймауту. Иммитация запросов к репо через curl показывала, что блокировка идет на "нашей" стороне во время TLS рукопожатий. Спасибо тем, кто следит за нашей безопасностью. При попытке использовать прокси соединение прерывал уже сервер репозитория repo.packagist.org, которому что-то не нравилось. Обложили с двух сторон.
В режиме полного логирования curl -vvvv удалось понять, что доступ к repo.packagist.org идет через cdn и адреса постоянно меняются. Из 20 запросов один все таки проходил. Тогда я написал (при помощи клода в том числе) небольшой скрипт, который сканирует разные адреса репо и выдает по ним отчет.
#!/bin/bash
HOSTS="repo.packagist.org packagist.org api.github.com codeload.github.com github.com objects.githubusercontent.com"
DNS="8.8.8.8 1.1.1.1 9.9.9.9 77.88.8.8 208.67.222.222"
for h in $HOSTS; do
ips=$(for d in $DNS; do dig +short +time=2 +tries=1 A "$h" @"$d" 2>/dev/null; done \
| grep -E '^[0-9.]+$' | sort -u)
[ -z "$ips" ] && ips=$(getent ahostsv4 "$h" | awk '{print $1}' | sort -u)
echo "== $h"
for ip in $ips; do
r=$(curl -s -o /dev/null -w '%{http_code} %{time_total}s' \
--connect-timeout 5 -m 10 --resolve "$h:443:$ip" "https://$h/")
echo " $ip ${r:-FAIL}"
done
done
Далее нужные ip добавил в hosts и композитор ответил!
Много нового узнал вчера про php от умных или считающих себя такими людей. И хотя альтернатив у php много, он все равно остается самым удобным языком для вэб-программирования.
Важные ссылки: