Aaron Ballman, główny kompilator Clang i członek zespołów opracowujących standardy WG21 (C++) i WG14 (C), rozpoczął dyskusję na temat dodania do kompilatora Clang trybu wzmocnienia bezpieczeństwa. Nowy tryb pozwoli na jednoczesne włączenie zestawu opcji zwiększających ochronę, podobnie do flagi „-fhardened” dodanej w GCC 14, przy której aktywowane są opcje „-D_FORTIFY_SOURCE=3 -D_GLIBCXX_ASSERTIONS -ftrivial-auto-var-init=zero -fPIE -pie -Wl,-z,relro,-z,now -fstack-protector-strong -fstack-clash-protection -fcf-protection=full.”
Zauważono, że obecnie trwają prace nad dodaniem możliwości zwiększenia bezpieczeństwa do standardów C i C++, ale proces ten nie jest szybki, mimo że w Clang już dostępne są poszczególne opcje z dodatkowymi mechanizmami ochrony. Wdrażane metody ochrony często prowadzą do określonych niekompatybilności z istniejącym kodem lub naruszenia ABI, co uniemożliwia ich domyślne włączenie. Ponadto, takie opcje są rozproszone (flagi do zarządzania kompilacją, flagi generowania instrukcji maszynowych związane z architekturami sprzętowymi, ostrzeżenia, tryby diagnostyczne, makra), słabo udokumentowane i umykają wielu programistom.
Jedna konfiguracja ujednolica włączenie opcji związanych z bezpieczeństwem i upraszcza ich stosowanie. Rozważane są różne opcje aktywacji trybu wzmocnionego bezpieczeństwa, na przykład próbuje się aktywacji za pomocą flagi „-fhardened”, zestawu ustawień „—config=hardened”, osobnego sterownika (clang —driver-mode) lub oddzielnych opcji „-fhardened, -mhardened i -Whardened” związanych z kompilacją, generowaniem kodu i wyświetlaniem ostrzeżeń. Tryb może obejmować:
- Możliwości kompilatora: -ftrivial-auto-var-init, -fPIE, -fcf-protection itd.
- Możliwości związane z generowaniem kodu dla platform docelowych: -mspeculative-load-hardening, -mlvi-hardening itd.
- Ostrzeżenia: -Wall, -Wextra, -Werror=return-type itd.
- Tryby wzmacniania bezpieczeństwa w standardowej bibliotece funkcji.
- Makra: _FORTIFY_SOURCE, _GLIBCXX_ASSERTIONS itd.
- Wymaganie do wyraźnego wyboru używanego standardu języka.
- Odmowa kompilacji kodu z użyciem przestarzałych standardów C89 i C++98.
- Przekazywanie dodatkowych flag do łącznika, na przykład w celu włączenia randomizacji adresów.
Źródło: opennet.ru
