Strata precyzji i exploity zaokrągleń
Kontrakty inteligentne nie potrzebują błędu w kontroli dostępu, aby tracić pieniądze.
Czasami exploit jest ukryty w zwykłym dzieleniu.
Finansowe kontrakty inteligentne używają arytmetyki całkowitoliczbowej. Ułamki są odrzucane. Kierunek tego zaokrąglenia decyduje o tym, kto otrzymuje wartość. Błąd rzędu jednej jednostki może powtarzać się w tysiącach transakcji.
W protokole finansowym zaokrąglanie jest polityką transferu wartości.
Każde dzielenie musi odpowiadać na trzy pytania:
- W którą stronę zaokrągla obliczenie?
- Która strona czerpie korzyści z tego kierunku?
- Czy atakujący może powtórzyć lub wzmocnić tę korzyść?
Typowe błędy matematyczne obejmują:
Zbyt wczesne dzielenie Jeśli dzielisz przed mnożeniem, tracisz precyzję. Przykład:
(amount / 1e18) * rate. Pośrednie dzielenie odrzuca dane, zanim nastąpi mnożenie. Zasada: Zawsze najpierw mnoż, potem dziel.Przepełnienia pośrednie Mnożenie jako pierwsze może spowodować przepełnienie (overflow), nawet jeśli końcowy wynik mieści się w
uint256. Użyj biblioteki takiej jak OpenZeppelin Math, aby wykonywać mnożenie i dzielenie z pełną precyzją w jednym kroku.Zaokrąglanie w niewłaściwym kierunku Zaokrąglanie to nie sugestia. To zasada bezpieczeństwa. Konserwatywny protokół stosuje następujące zasady:
- Zaokrąglaj dług w górę.
- Zaokrąglaj wymagane płatności w górę.
- Zaokrąglaj wartość zabezpieczenia w dół.
- Zaokrąglaj wypłacane użytkownikom aktywa w dół.
- Zaokrąglaj pobierane od użytkowników udziały w górę.
Gdy dokładny wynik jest niemożliwy, zaokrąglaj na niekorzyść strony próbującej wyciągnąć wartość.
Ataki inflacyjne W skarbcach o niskiej płynności atakujący mogą wykorzystywać darowizny do manipulowania kursami wymiany. Przekazują aktywa, aby zwiększyć całkowitą liczbę aktywów bez zwiększania liczby udziałów. Powoduje to, że nowe depozyty są zaokrąglane w dół do zera udziałów. Łagodzenie: Używaj wirtualnych aktywów lub udziałów, aby ustanowić stabilny kurs początkowy.
At