Deserializacja danych za pomocą bytes2var() w poprzednich wersjach Godota miała kilka usterek umożliwiających wyciek danych lub zawieszenie silnika. Błąd dotyczy przede wszystkim obsługi sieci i zapisów stanu gry.
Problem został znaleziony przez Fabia Alessandrelli, który natrafił na przypadek tablicy zawieszającej silnik:
[python]
bytes2var(PoolByteArray([20, 0, 0, 0, 0, 0, 0, 255]))
[/python]
Po dalszych badaniach znalazł więcej podatności takich jak:
- niepoprawne alokacje pamięci ze względu na porównywanie wartości bez znaku z wartościami ze znakiem;
- potencjalne przepełnienie bufora;
- ewentualny wyciek danych.
Najprostszym sposobem odtworzenia tego błędu jest uruchomienie skryptu, który uruchomi poniższy kod (GDscript):
[python]
bytes2var(PoolByteArray([20, 0, 0, 0, 0, 0, 0, 255]))
[/python]
Na githubie dostępny jest także projekt testowy.
Nowości
Wprowadzono nowy typ kompilacji Godota headless będący czymś pośrednim między zwykłą kompilacją, a wersją serwer. Wersja serwerowa z powodu optymalizacji została pozbawiona możliwości importowania asetów i eksportowania gry. Do tego celu należy użyć właśnie kompilacji headless (w przypadku tworzenia potoku ciągłej integracji).
OpenSSL został zaktualizowany do wersji 1.0.2o.
Inne poprawki
Wersja 3.0.6 wprowadza kolejne poprawki do eksperymentalnej obsługi skryptów w .NET (mono). Naprawiono także zdarzenia dotyku na platformie Windows i kilka innych błędów powodujących zawieszenie edytora silnika.
Pełna lista zmian dostępna jest tutaj.
Silnik można pobrać na stronie projektu.