Π’ Clang Π½Π°ΠΌΠ΅Ρ€Π΅Π½Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ€Π΅ΠΆΠΈΠΌ усилСнной бСзопасности

Аарон Π‘Π°Π»Π»ΠΌΠ°Π½ (Aaron Ballman), Π³Π»Π°Π²Π½Ρ‹ΠΉ ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠΆΠ΄Π°ΡŽΡ‰ΠΈΠΉ компилятор Clang ΠΈ участник ΠΊΠΎΠΌΠ°Π½Π΄ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ стандартов WG21 (C++) ΠΈ WG14 (C), Π½Π°Ρ‡Π°Π» обсуТдСниС добавлСния Π² компилятор Clang Ρ€Π΅ΠΆΠΈΠΌΠ° усилСния бСзопасности. Новый Ρ€Π΅ΠΆΠΈΠΌ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Ρ€Π°Π·ΠΎΠΌ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°Π±ΠΎΡ€ ΠΎΠΏΡ†ΠΈΠΉ для усилСния Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΏΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ с Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹ΠΌ Π² GCC 14 Ρ„Π»Π°Π³ΠΎΠΌ Β«-fhardenedΒ», ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΠΏΡ†ΠΈΠΈ Β«-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Β».

ΠžΡ‚ΠΌΠ΅Ρ‡Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ Π² настоящСС врСмя вСдётся Ρ€Π°Π±ΠΎΡ‚Π° ΠΏΠΎ добавлСнию возмоТностСй для усилСния бСзопасности Π² стандарты C ΠΈ C++, Π½ΠΎ этот процСсс Π½Π΅ быстрый, ΠΏΡ€ΠΈ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² Π‘lang ΡƒΠΆΠ΅ доступны ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΡ†ΠΈΠΈ с Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ² Π·Π°Ρ‰ΠΈΡ‚Ρ‹. Π Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π·Π°Ρ‰ΠΈΡ‚Ρ‹ часто приводят ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ нСсовмСстимостям с ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ ΠΈΠ»ΠΈ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΡŽ ABI, Ρ‡Ρ‚ΠΎ Π½Π΅ позволяСт Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ ΠΎΠΏΡ†ΠΈΠΈ Ρ€Π°Π·Ρ€ΠΎΠ·Π½Π΅Π½Ρ‹ (Ρ„Π»Π°Π³ΠΈ для управлСния компиляциСй, Ρ„Π»Π°Π³ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹Ρ… инструкций, привязанныС ΠΊ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹ΠΌ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°ΠΌ, прСдупрСТдСния, Ρ€Π΅ΠΆΠΈΠΌΡ‹ диагностики, макросы), ΠΏΠ»ΠΎΡ…ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΈ Π²Ρ‹ΠΏΠ°Π΄Π°ΡŽΡ‚ ΠΈΠ· поля зрСния ΠΌΠ½ΠΎΠ³ΠΈΡ… Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ².

Единая настройка ΡƒΠ½ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ связанных с Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΎΠΏΡ†ΠΈΠΉ ΠΈ упростит ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅. РассматриваСтся нСсколько Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΠΈ Ρ€Π΅ΠΆΠΈΠΌΠ° усилСнной бСзопасности, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, обсуТдаСтся активация Ρ‡Π΅Ρ€Π΅Π· Ρ„Π»Π°Π³ Β«-fhardenedΒ», Π½Π°Π±ΠΎΡ€ настроСк Β«β€”config=hardenedΒ», ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ (clang β€”driver-mode) ΠΈΠ»ΠΈ Ρ€Π°Π·Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΡ†ΠΈΠΈ Β«-fhardened, -mhardened ΠΈ -WhardenedΒ», привязанныС ΠΊ компиляции, Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π° ΠΈ Π²Ρ‹Π²ΠΎΠ΄Ρƒ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ. Π Π΅ΠΆΠΈΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ:

  • ВозмоТности компилятора: -ftrivial-auto-var-init, -fPIE, -fcf-protection ΠΈ Ρ‚.ΠΏ.
  • ВозмоТности, привязанныС ΠΊ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π° для Ρ†Π΅Π»Π΅Π²Ρ‹Ρ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ: -mspeculative-load-hardening, -mlvi-hardening ΠΈ Ρ‚.ΠΏ.
  • ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΡ: -Wall, -Wextra, -Werror=return-type ΠΈ Ρ‚.ΠΏ.
  • Π Π΅ΠΆΠΈΠΌΡ‹ усилСния бСзопасности Π² стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.
  • ΠœΠ°ΠΊΡ€ΠΎΡΡ‹: _FORTIFY_SOURCE, _GLIBCXX_ASSERTIONS ΠΈ Ρ‚.ΠΏ.
  • Π’Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊ явному Π²Ρ‹Π±ΠΎΡ€Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ стандарта языка.
  • ΠžΡ‚ΠΊΠ°Π· ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ с использованиСм ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΡ… стандартов C89 ΠΈ C++98.
  • ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„Π»Π°Π³ΠΎΠ² ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΡƒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Ρ€Π°Π½Π΄ΠΎΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ адрСсов.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ