Fil-C — компилятор для языков C ΠΈ C++, Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ

Π€ΠΈΠ»ΠΈΠΏΠΏ Пизло (Filip Pizlo) прСдставил Π½Π° ΠΊΠΎΠ½Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΈ SPLASH’24 ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ C/C++ компилятор Fil-C, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ Π·Π°Ρ‰ΠΈΡ‚Ρƒ ΠΎΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, Π²Ρ‹Π·Π²Π°Π½Π½Ρ‹Ρ… ошибками ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ. ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ Π½Π°Ρ†Π΅Π»Π΅Π½ Π½Π° обСспСчСниС ΠΏΠΎΠ»Π½ΠΎΠΉ совмСстимости с ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ Π½Π° языках C ΠΈ C++ — для обСспСчСния бСзопасной Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ достаточно просто ΠΏΠ΅Ρ€Π΅ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ построСн с использованиСм ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΎΡ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° LLVM ΠΈ распространяСтся ΠΏΠΎΠ΄ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠ΅ΠΉ Apache 2.0. Runtime поставляСтся ΠΏΠΎΠ΄ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠ΅ΠΉ BSD. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π½Π΅Π΄Π°Π²Π½ΠΎ анонсированного ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° TrapC, находящСгося Π½Π° стадии проСктирования, компилятор Fil-C ΡƒΠΆΠ΅ Π΄ΠΎΠ²Π΅Π΄Ρ‘Π½ Π΄ΠΎ готовности сборки ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ΄Π°.

ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ бСзопасно Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠ΅ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ стандартных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ C (libc) ΠΈ C++ (libc++), основанныС Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ… Musl ΠΈ LLVM libc++. Π‘Ρ€Π΅Π΄ΠΈ ΠΏΡ€ΠΎΡ‡Π΅Π³ΠΎ, Π² собираСмых ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΊΠΈΠ΅ возмоТности, ΠΊΠ°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сигналов, ΠΌΠ°ΠΏΠΏΠΈΠ½Π³ Ρ„Π°ΠΉΠ»ΠΎΠ² Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ (mmap), longjmp/setjmp ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Π² C++. ΠŸΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Fil-C Π±Π΅Π· внСсСния ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ собраны ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ bzip2, zip, pcre ΠΈ ncurses. Π‘ Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ модификациями поддСрТиваСтся сборка OpenSSH, OpenSSL, CPython, SQLite, Lua, Curl, Lynx, jpeg6b, zsh, xzutils ΠΈ simdutf.

Π—Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ обСспСчиваСтся благодаря ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡŽ 128-разрядных ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ MonoCaps с ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΈΠΏΠΎΠ² ΠΈ отслСТивания Π³Ρ€Π°Π½ΠΈΡ† Π±ΡƒΡ„Π΅Ρ€ΠΎΠ², Π° Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Π½ΠΈΡŽ сборщика мусора FUGC, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ всС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΡŽ ΠΈ освобоТдСнию памяти. Π’ случаС ошибок ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ сразу Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ Π½Π΅ позволяСт ΡΠΊΡΠΏΠ»ΡƒΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ уязвимости.

ЗаявлСно, Ρ‡Ρ‚ΠΎ комбинация ΠΈΠ· MonoCaps ΠΈ FUGC позволяСт ΠΎΡ‚Π»Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС ошибки, связанныС с Π²Ρ‹Ρ…ΠΎΠ΄ΠΎΠΌ Π·Π° Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ Π±ΡƒΡ„Π΅Ρ€Π° Π² стСкС ΠΈ ΠΊΡƒΡ‡Π΅, ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ΠΌ ΠΊ ΡƒΠΆΠ΅ освобоТдённой памяти, состояниями Π³ΠΎΠ½ΠΊΠΈ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с указатСлями, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ Ρ‚ΠΈΠΏΠΎΠ² (Type Confusion) Π² контСкстС пСрСсСчСния Ρ‚ΠΈΠΏΠΎΠ² ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ Π½Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΏΡ€ΠΈ динамичСской ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ΅ (linking) ΠΈ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ использования va_lists. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Fil-C ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ провСряСт Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ ΠΈ Ρ‚ΠΈΠΏΡ‹ Π² Π±ΡƒΡ„Π΅Ρ€Π°Ρ…, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… Π² систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹.

Π¦Π΅Π½ΠΎΠΉ возмоТности использования Fil-C для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ², Π±Π΅Π· нСобходимости пСрСписывания ΠΈΡ… ΠΊΠΎΠ΄Π° ΠΈΠ»ΠΈ задСйствования особых языковых конструкций, являСтся сниТСниС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. На Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ этапС развития, собираСмыС Π² Fil-C ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π² 1.5-5 Ρ€Π°Π·, ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ со сборкой ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ компиляторами. Π’ ΠΏΠ»Π°Π½Π°Ρ… заявлСна Ρ€Π°Π±ΠΎΡ‚Π° ΠΏΠΎ ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡŽ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ этой Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅ Π² 1.2 Ρ€Π°Π·Π°, Π° Π² Π½Π°ΠΈΡ…ΡƒΠ΄ΡˆΠΈΡ… сцСнариях Π·Π°ΠΌΠ΅Π΄Π»Π΅Π½ΠΈΠ΅ Π½Π΅ прСвысит ΠΏΠΎΠ»Ρ‚ΠΎΡ€Π° Ρ€Π°Π·Π°. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ ΠΏΠΎΠΊΠ° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡƒ Linux Π½Π° систСмах X86_64. ΠŸΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅ вСрсии ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π»ΠΈ macOS ΠΈ FreeBSD, Π½ΠΎ Π·Π°Ρ‚Π΅ΠΌ Π±Ρ‹Π»ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΎ Π½Π΅ Ρ€Π°ΡΠΏΡ‹Π»ΡΡ‚ΡŒ усилия ΠΈ Π²Π½Π°Ρ‡Π°Π»Π΅ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ качСствСнный ΠΏΠΎΡ€Ρ‚ libc для ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹.

Π”Ρ€ΡƒΠ³ΠΈΠΌ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ Fil-C являСтся ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚ΠΊΠ°Π· ΠΎΡ‚ сохранСния совмСстимости Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ABI для ΠΊΠΎΠ΄Π° Π½Π° C/C++, Ρ‡Ρ‚ΠΎ Π½Π΅ позволяСт ΡΠ²ΡΠ·Ρ‹Π²Π°Ρ‚ΡŒ собираСмый Π² Fil-C ΠΊΠΎΠ΄ с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΌΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ, собранными Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ компиляторами. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ способ динамичСского связывания Π² Fil-C отличаСтся ΠΎΡ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… компиляторов ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΠΎΠ². ПодобноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ связывании с Π½Π΅Π·Π°Ρ‰ΠΈΡ‰Ρ‘Π½Π½Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ тСряСтся ΡΡƒΡ‚ΡŒ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΠΎΠΉ Π² Fil-C Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ иллюзия Π·Π°Ρ‰ΠΈΡ‰Ρ‘Π½Π½ΠΎΠ³ΠΎ прилоТСния — ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ совмСстимости ABI, Ρƒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π» Π±Ρ‹ соблазн ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ Π² Fil-C лишь ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, Π½Π΅ утруТдая сСбя ΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ всСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

ЗадСйствованный Π² Fil-C ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ MonoCap основываСтся Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ 16-Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Ρ… ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠΎΠΌΠΈΠΌΠΎ адрСса Π² памяти, указываСтся ссылка Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠΉ свСдСния ΠΎ возмоТностях (capability), Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ вСрхняя ΠΈ ниТняя Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ Π±ΡƒΡ„Π΅Ρ€Π°, ассоциированного с ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ, Π° Ρ‚Π°ΠΊΠΆΠ΅ массив, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΉ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Π΅ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π±Π»ΠΎΠΊΠ΅ памяти (1 Π±Π°ΠΉΡ‚ с ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ Ρ‚ΠΈΠΏΠ΅ (unset, int, ptr, free) для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ 16-Π±Π°ΠΉΡ‚ΠΎΠ²ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° памяти). ΠŸΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ памяти ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ осущСствляСтся ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π³Ρ€Π°Π½ΠΈΡ† ΠΈ Ρ‚ΠΈΠΏΠ° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ с Ρ‚ΠΈΠΏΠΎΠΌ «ptr» Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ записаны Π΄Π°Π½Π½Ρ‹Π΅ с Ρ‚ΠΈΠΏΠΎΠΌ «int» ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚).

ВсС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ выдСлСния ΠΈ освобоТдСния памяти ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ сборщиком мусора FUGC (Fil’s Unbelievable Garbage Collector), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈ освобоТдСнии памяти ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ всС связанныС с освобоТдаСмым Π±ΡƒΡ„Π΅Ρ€ΠΎΠΌ записи ΠΎ Ρ‚ΠΈΠΏΠ°Ρ… Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ «free» ΠΈ Π·Π°Ρ‚Π΅ΠΌ пСрСнаправляСт всС ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° освободившиСся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΡƒΠΆΠ΅ освобоТдСна. Π›ΡŽΠ±ΠΎΠ΅ дальнСйшСС ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ Π±Π»ΠΎΠΊΡƒ Π΄Π°Π½Π½Ρ‹Ρ… с Ρ‚ΠΈΠΏΠΎΠΌ «free» ΠΈΠ»ΠΈ ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ, связанному с освобоТдённым ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Ρ‡Ρ‚ΠΎ позволяСт Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ уязвимостСй класса use-after-free. Π‘Π±ΠΎΡ€Ρ‰ΠΈΠΊ мусора Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ ΠΈ Π½Π΅ приостанавливаСт Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².

ИспользованиС ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ ΠΈΠ· MonoCaps ΠΈ FUGC позволяСт ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с указатСлями ΠΈ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΠΎΠΉ сСмантику Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² malloc ΠΈ free, прСдоставив ΠΏΡ€ΠΈ этом Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π·Π°Ρ‰ΠΈΡ‚Ρƒ. Код ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ логичСскиС ошибки, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ², Π½Π΅Π²Π΅Ρ€Π½Ρ‹Π΅ арифмСтичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с указатСлями, состояния Π³ΠΎΠ½ΠΊΠΈ ΠΈ нСсвоСврСмСнный Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ free(), Π½ΠΎ нСзависимо ΠΎΡ‚ всСго этого, Fil-C Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ исходныС Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ ΠΈ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈ ΠΏΡ€Π΅Ρ€Π²Ρ‘Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, Ссли Π±ΡƒΠ΄Π΅Ρ‚ прСдпринята ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° доступа ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ ΠΊ области Π²Π½Π΅ Π·Π°ΠΏΠΎΠΌΠ½Π΅Π½Π½Ρ‹Ρ… Π³Ρ€Π°Π½ΠΈΡ†, обращСния ΠΊ освобоТдённому Π±Π»ΠΎΠΊΡƒ памяти ΠΈΠ»ΠΈ чтСния Π΄Π°Π½Π½Ρ‹Ρ… с Ρ‚ΠΈΠΏΠΎΠΌ «int» ΠΊΠ°ΠΊ указатСля ΠΈΠ»ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚.

Автор Fil-C, Π€ΠΈΠ»ΠΈΠΏΠΏ Пизло, Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Π² ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Epic Games пост Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€Π°, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰Π΅Π³ΠΎ Π·Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹, связанныС с языками программирования. Π€ΠΈΠ»ΠΈΠΏΠΏ ΠΈΠΌΠ΅Π΅Ρ‚ Π±ΠΎΠ³Π°Ρ‚Ρ‹ΠΉ ΠΎΠΏΡ‹Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π°Π΄ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ машинами, языками программирования, компиляторами ΠΈ сборщиками мусора, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² IBM ΠΎΠ½ Ρ€Π°Π·Π²ΠΈΠ²Π°Π» язык программирования X10, Π² Microsoft Ρ€Π°Π±ΠΎΡ‚Π°Π» Π½Π°Π΄ сборщиками мусора Stopless, Clover ΠΈ Chicken, Π² Apple занимался JIT-компилятором ΠΈ оптимизациями Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π½ΠΎΠ³ΠΎ Π΄Π²ΠΈΠΆΠΊΠ° WebKit, Π² Epic Games возглавляСт ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ², Ρ€Π°Π·Π²ΠΈΠ²Π°ΡŽΡ‰ΡƒΡŽ язык программирования Verse ΠΈ ΡΠ²ΡΠ·Π°Π½Π½ΡƒΡŽ с Π½ΠΈΠΌ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΌΠ°ΡˆΠΈΠ½Ρƒ. Π€ΠΈΠ»ΠΈΠΏΠΏ Ρ‚Π°ΠΊΠΆΠ΅ являСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин Jikes RVM, Ovm ΠΈ Fiji VM.



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