< Powrót do artykułów
◆ Smart contracts · UUPS · test laboratoryjny

Zmiana implementacji.
Zmiana zasad.

Audyt smart kontraktów UUPS w praktyce: kontrola dostępu do upgrade’u, proxy i dowód wpływu w kontrolowanym teście laboratoryjnym.

PUBLIKACJA 19.10.2026TRYB kontrolowany benchmark i PoCAUTOR Zespół BSTA
UUPS
kontrola
aktualizacji
PROXY
kod i stan
wdrożenia
PoC
dowód
wpływu
TEST
kontrolowane
środowisko

Smart kontrakt może zmienić zachowanie po wdrożeniu

W pracach nad weryfikacją bezpieczeństwa Web3 zajmowaliśmy się kontraktami aktualizowalnymi. Jeden z kontrolowanych benchmarków obejmował celowo podatny wariant UUPS, w którym osoba bez wymaganych uprawnień mogła doprowadzić do zmiany implementacji. Chcieliśmy sprawdzić nie tylko sygnał w kodzie, ale także skutek tej zmiany w teście.

To opis testu laboratoryjnego i naszego sposobu walidacji. Nie jest raportem o przejęciu produkcyjnego protokołu ani o stracie środków klienta. Test dotyczył przygotowanego scenariusza. Nie wysyłaliśmy w jego ramach transakcji do cudzego wdrożenia na mainnecie.

Proxy to adres, implementacja to wykonywana logika

W uproszczeniu użytkownik wywołuje proxy, które kieruje wykonanie do implementacji. Aktualizacja zmienia kod odpowiedzialny za zachowanie systemu, podczas gdy użytkownicy nadal korzystają z adresu proxy. Dlatego uprawnienie do upgrade’u jest jedną z najważniejszych granic zaufania w takim projekcie.

Dokumentacja OpenZeppelin UUPS opisuje mechanizm aktualizacji umieszczony w implementacji oraz potrzebę właściwej autoryzacji. Samo wykorzystanie standardowej biblioteki nie zastępuje sprawdzenia, kto może uruchomić zmianę w konkretnym wdrożeniu.

Schemat poglądowy architektury
użytkownik → adres proxy → bieżąca implementacja upgrade → zmiana implementacji używanej przez proxy Pytanie audytowe: kto rzeczywiście może wykonać upgrade? Pytanie o wpływ: co zmienia się po jego wykonaniu?

Niechroniona aktualizacja w kontrolowanym benchmarku

W podatnym wariancie testowym sprawdziliśmy możliwość zmiany implementacji z konta, które nie powinno mieć uprawnień administracyjnych. Następnie test wprowadzał przygotowaną implementację demonstracyjną i weryfikował skutki jej działania na testowym saldzie. Asercja wymagała wykazania przyrostu salda kontrolowanego konta.

Dopiero taki wynik pozwalał potraktować scenariusz jako potwierdzony w granicach benchmarku. Zwykłe wywołanie funkcji bez błędu nie dowodziłoby ani skutecznego upgrade’u, ani wpływu na aktywa. Wynik testu musi odpowiadać dokładnie temu, co deklaruje opis podatności.

Wynik prac

W kontrolowanym teście potwierdzono zmianę implementacji i skutek dotyczący testowego salda. Nie przekładamy tego na twierdzenie, że dowolny kontrakt UUPS jest podatny albo że przejęliśmy środki istniejącego projektu.

Dlaczego samo „transakcja przeszła” nie wystarcza

Jednym z ważnych usprawnień naszej walidacji było oddzielenie sondy technicznej od dowodu wpływu. Sonda odpowiada na wąskie pytanie, np. czy dana ścieżka wywołania jest dostępna. Potwierdzenie skutku musi wykazać zmianę odpowiedniego stanu i naruszenie założonej granicy uprawnień.

Dla upgrade’u oznacza to przynajmniej sprawdzenie tożsamości wywołującego, implementacji przed i po operacji oraz wpływu nowej logiki na kontrolowany zasób. Test negatywny powinien pokazać, że poprawnie zabezpieczony wariant odrzuca tę samą próbę osoby postronnej. Tak przygotowany PoC jest użyteczny przy naprawie i reteście.

Przykładowe kryteria odbioru dowodu
1. Konto testowe nie ma wymaganej roli. 2. Wskazanie implementacji zmienia się w podatnym wariancie. 3. Występuje zadeklarowany skutek w stanie testowym. 4. Kontrola porównawcza odrzuca próbę bez uprawnień. To kryteria metodyczne, nie instrukcja ataku na wdrożenie.

Administrator protokołu nie jest anonimowym atakującym

W tych samych pracach porządkowaliśmy ocenę uprawnień administracyjnych. Poprawnie uprawniony właściciel, multisig lub ProxyAdmin może zgodnie z projektem wykonywać określone operacje. Samo istnienie takiej roli nie stanowi dowodu, że te same czynności wykona dowolna osoba.

Rozdzielamy więc dwie oceny. Pierwsza dotyczy błędu kontroli dostępu: ktoś bez wymaganych praw może zmienić zachowanie kontraktu. Druga dotyczy ryzyka zarządzania: jakie możliwości ma uprawniony administrator i jak zabezpieczono jego klucze. Oba tematy są ważne, ale wymagają innych dowodów i innych zaleceń.

Podobnie brak inicjalizacji samej implementacji nie jest automatycznie potwierdzeniem przejęcia proxy. Trzeba ustalić, w jakim kontekście wykonuje się kod i jaki stan jest modyfikowany. W naszej walidacji sygnał dotyczący inicjalizacji nie otrzymywał statusu pełnego dowodu tylko dlatego, że brzmiał groźnie.

Analizujemy wdrożenie, nie pojedynczy plik Solidity

Audyt smart kontraktów wymaga powiązania proxy, implementacji, ról i kontraktów zależnych. Ograniczony fragment kodu może pomijać właśnie ten komponent, który przechowuje stan lub egzekwuje autoryzację. Podczas naszych prac rozszerzyliśmy materiał analityczny o źródła, ABI i relacje między kontraktami.

Sprawdzamy również zgodność analizowanego kodu z wdrożeniem i siecią. Jeżeli brakuje krytycznej implementacji albo odczyt stanu się nie powiedzie, wynik powinien wskazywać lukę pokrycia. Błąd odczytu nie jest dowodem braku aktywów ani bezpieczeństwa kontraktu. Standardowe sloty proxy opisuje ERC-1967.

Od ustalenia do sprawdzalnej naprawy

Raport powinien określać komponent, wymagane uprawnienia, warunki uruchomienia i potwierdzony skutek. Dla mechanizmu aktualizacji istotne są zalecenia dotyczące ról, inicjalizacji i procesu wdrożeniowego. Po poprawce powtarza się scenariusz w uzgodnionym środowisku oraz sprawdza, czy legalne aktualizacje nadal działają.

Takie podejście pomaga zespołom budującym aplikacje Web3, tokeny, vaulty i protokoły DeFi. Wycena audytu zależy od złożoności kodu, architektury, zależności i oczekiwanego zakresu weryfikacji. Potrzebny jest zakres odnoszący się do konkretnego wydania, a nie ogólna deklaracja, że projekt „ma audyt”.

Pytania o audyt smart kontraktów UUPS

Czy kontrakty UUPS są z założenia niebezpieczne?

Nie. To wzorzec aktualizacji, którego bezpieczeństwo zależy m.in. od autoryzacji, inicjalizacji i zgodności wdrożenia. Opisany benchmark zawierał celowo podatny wariant, a nie dowód błędu całego standardu.

Czy test oznaczał transakcje na mainnecie?

Nie. Opisujemy kontrolowany scenariusz laboratoryjny. Praca na działających wdrożeniach i zakres ewentualnych operacji wymagają osobnego uzgodnienia.

Czy samo ostrzeżenie skanera wystarcza do zgłoszenia krytycznej podatności?

Ostrzeżenie jest punktem wyjścia do weryfikacji. Potrzebny jest kontekst wdrożenia, model uprawnień i dowód odpowiadający deklarowanemu wpływowi. Nie należy utożsamiać roli administratora z dostępem dowolnego użytkownika.

Jak zamówić audyt Solidity i Web3?

Zadzwoń pod 793 431 337 lub napisz do BSTA. Ustalimy zakres źródeł, wdrożeń, integracji i warunki walidacji. Przed rozpoczęciem poznasz zakres oraz wycenę.

◆ BSTA · testpenetracyjny.pl

Planujesz wdrożenie lub aktualizację smart kontraktów?

Sprawdzimy mechanizmy aktualizacji, role i granice zaufania. Dobierzemy przegląd Solidity oraz kontrolowane testy do architektury Twojego projektu Web3.

793 431 337Zapytaj o zakres i wycenę →
Uzgodniony zakres · poufność · raport z priorytetami napraw