Strona główna / Blog / Bifrost: build a RCE vs SSRF

Blog · case study

Bifrost: ten sam CVE daje RCE na buildzie dynamicznym, ale tylko SSRF na oficjalnym obrazie. Kiedy build jest częścią exploitability

CVE-2026-86242 to podatność, której nie da się obsłużyć samym produkt + wersja + CVSS. Bifrost HTTP Transport przed 2.0.0 pozwala zarejestrować custom plugin przez /api/plugins. Gdy management authentication jest wyłączone (domyślnie), atakujący może podać jako ścieżkę pluginu adres HTTP; serwer pobiera zawartość, zapisuje jako tymczasowy .so i próbuje otworzyć przez Go plugin.Open. Brzmi jak unauth RCE — ale tylko na pierwszy rzut oka.

CVE-2026-86242 (CVSS 3.1 8.1, AC:H): unauth /api/plugins + plugin path jako URL → pobranie i plugin.Open.
Build dynamiczny: załadowanie .so może się udać → wykonanie kodu jako user procesu Bifrost.
Statyczny oficjalny obraz Docker: dynamiczne ładowanie nie działa, plugin.Open kończy błędem → zostaje co najmniej SSRF, nie opisane RCE.

Severity to nie exploitability

CVSS mówi, co może się wydarzyć w warunkach wektora — nie że każdy Bifrost <2.0.0 daje RCE. Trzeba osobno odpowiedzieć: czy management endpoint jest osiągalny; czy governance.auth_config.is_enabled jest wyłączone; czy custom plugins są dostępne; czy proces zbudowano dynamicznie tak, by plugin.Open działał. Attack Complexity High nie jest przypadkiem — RCE nie jest deterministyczne dla każdego builda (plugin musi być zgodny m.in. z platformą i sposobem linkowania).

Właściwy model podatności

CVE-2026-86242 + unauth management + plugin path + dynamic build + compatible plugin = RCE CVE-2026-86242 + static build = inny, ograniczony outcome (SSRF)

To różnica między vulnerability presence a effective exploit path. Nie warto nazywać statycznego obrazu Not affected, skoro podatny kod wejściowy nadal występuje i generuje inny security outcome.

Build provenance obok SBOM

SBOM powie, że Bifrost jest obecny — nie zawsze powie, jak został skompilowany. To argument za przechowywaniem obok SBOM metadanych buildowych: provenance, flags, target architecture, sposób linkowania. Dobry model operacyjny rozdziela statusy: Affected / RCE path confirmed (dynamic + unauth), Affected / exploit impact reduced (static build), Mitigated (endpoint nieosiągalny lub auth wymuszone), Remediated (upgrade + weryfikacja runtime).

Czy management auth wystarcza jako control?

Jako redukcja exploitability — tak, jeśli jest realnie wymuszona na podatnej ścieżce i nie ma alternatywnego dotarcia do endpointu. Jako zamiennik poprawki — nie automatycznie. Zweryfikuj aktywnie: request bez credentiali ma zostać odrzucony przed logiką pobierania pluginu. Obecność ustawienia w pliku to nie dowód, jeśli konfigurację runtime może nadpisać environment/CLI. Remediation verification po upgrade: rzeczywista wersja procesu, próba rejestracji pluginu z HTTP URL (URL nie pobierany / nie trafia do loadera), enforcement auth, ograniczenie ekspozycji endpointu.

Wniosek

CVE-2026-86242 pokazuje sytuację, w której build jest częścią vulnerability context. To nie argument przeciw skanerom ani CVSS — to argument za tym, by Vulnerability Engineering zaczynał tam, gdzie kończy się proste version matching.

Powiązane na blogu

Źródła

Nota redakcyjna: stan informacji 7 września 2026. CVE-2026-86242 (Bifrost HTTP Transport < 2.0.0, CVSS 8.1): unauth plugin path jako URL → plugin.Open; na buildzie dynamicznym RCE, na statycznym oficjalnym obrazie zostaje SSRF. Artykuł koncentruje się na buildzie jako części exploitability i na metadanych buildowych obok SBOM.

Zapamiętaj jedno

Dwa systemy mogą mieć identyczny numer wersji, ten sam wpis w SBOM i ten sam CVE, ale jeden daje unauthenticated RCE, a drugi nie przechodzi przez końcowy etap chainu. Jeśli finding nie odpowiada na pytanie „jaki build naprawdę działa?”, to przy tej podatności nie zawiera jeszcze najważniejszej części evidence.