
fil-c v0.685
Fil-C: полностью совместимая безопасность памяти для C и C++
Fil-C 0.684
Fil-C — это фанатично совместимая реализация C и C++ с безопасной памятью. Множество программ компилируются и работают с Fil-C без изменений или с минимальными изменениями. Все ошибки безопасности памяти перехватываются как паники Fil-C. Fil-C достигает этого за счёт комбинации конкурентной сборки мусора и невидимых возможностей (каждый указатель в памяти имеет соответствующую возможность, невидимую для адресного пространства C). Каждая фундаментальная операция C (как она представлена в LLVM IR) проверяется на соответствие возможности. В Fil-C нет оператора unsafe и лишь ограниченный FFI к небезопасному коду.
Fil-C особенный, потому что:
-
Fil-C достигает полной безопасности без лазеек. В Fil-C нет ключевого слова
unsafe, которое можно было бы использовать для отключения защит. Связывание с небезопасным кодом severely restricted. -
Подход Fil-C на основе возможностей обеспечивает уровень безопасности, аналогичный аппаратным возможностям, таким как CHERI, за исключением того, что он работает на обычном оборудовании (X86_64 или ARM64).
-
Fil-C спроектирован так, чтобы предотвращать использование ошибок безопасности памяти для эксплуатации, а не просто достаточно часто их помечать для обнаружения багов. Это отличает Fil-C от AddressSanitizer, HWAsan или MTE, которые все могут быть обойдены атакующими. Ключевое отличие, делающее это возможным, заключается в том, что Fil-C основан на возможностях (так что каждый указатель знает, к какому диапазону памяти он может обращаться и как он может это делать), а не на тегах (где доступы по указателям разрешены, если они попадают в валидную память).
-
С точки зрения пользователя языка, Fil-C — это просто C и C++ с расширениями GCC/clang. Скорее всего, ваша любимая программа или библиотека на C или C++ скомпилируется в Fil-C без изменений. Компилятор Fil-C основан на clang 20.1.8, поэтому он поддерживает C17 и C++20.
Лицензия
Компилятор (clang + LLVM) покрывается LLVM-LICENSE.txt. Runtime покрывается PAS-LICENSE.txt (см. libpas/LICENSE.txt в исходном дистрибутиве). В случае классического дистрибутива Fil-C на основе musl, musl libc покрывается MUSL-LICENSE.txt (см. projects/yolomusl/COPYRIGHT и projects/usermusl/COPYRIGHT в исходном дистрибутиве). В случае дистрибутива /opt/fil, glibc покрывается glibc-LICENSE.txt, а все остальные включённые программы покрываются соответствующими файлами -LICENSE.txt. Библиотеки C++ (libc++/libc++abi) покрываются LLVM-LICENSE.txt.
Вы можете получить исходный код компилятора, runtime, libc++/libc++abi, libc (musl и glibc) и всех включённых программ с github. Исходный дистрибутив также включает множество дополнительных программ, портированных на Fil-C в директориях projects/ и pizlix/, и они имеют различные лицензии. Дистрибутив /opt/fil включает сборки множества дополнительных программ, и их лицензии находятся в additional-licenses/ в этом дистрибутиве.
Требования
Fil-C работает только на Linux/X86_64 или Linux/ARM64.
Предыдущие версии работали на Darwin/ARM64 и FreeBSD, но теперь я сосредоточен только на Linux, потому что это позволяет мне более точно реализовать libc. Ничто принципиально не мешает Fil-C работать на других архитектурах или ОС, кроме Linux.
Начало работы
Если вы скачали бинарники Fil-C, запустите:
./setup.sh
Это имеет разный эффект в зависимости от выбранного бинарного дистрибутива:
-
В случае классического дистрибутива на основе musl (
filc-0.684-linux-x86_64.tar.xzилиfilc-0.684-linux-aarch64.tar.xz), это настраивает Fil-C для работы в текущей директории. -
В случае дистрибутива /opt/fil на основе glibc (
optfil-0.684-linux-x86_64.tar.xz), это настраивает Fil-C в/opt/fil.
Если вы скачали исходный код Fil-C, запустите:
./build_all_fast.sh
После этого вы сможете использовать Fil-C из этой директории.
Бинарный дистрибутив Fil-C поставляется с musl в качестве libc. Использование
./build_all_fast.sh в исходном дистрибутиве также собирает Fil-C с musl.
Если вы используете исходный код, вы также можете:
-
./build_all_fast_glibc.sh— собирает аналогичную конфигурацию, но с glibc 2.40 в качестве libc. -
./build_all.sh— полная сборка на основе musl (также собирает множество программ, портированных на Fil-C). -
./build_all_glibc.sh— полная сборка на основе glibc (собирает ещё больше программ, портированных на Fil-C). -
cd pizlix && sudo ./build.sh— собирает дистрибутив Linux Pizlix. -
cd optfil && sudo ./build.sh— собирает дистрибутив/opt/fil.
Что работает
Множество программных пакетов работают в Fil-C без изменений или с минимальными изменениями, включая крупные, такие как openssl, CPython, SQLite и многие другие. Fil-C достаточно мощный, чтобы поддерживать полностью безопасный по памяти пользовательский ландшафт Linux.
Fil-C имеет полную поддержку C и C++ плюс почти все расширения, поддерживаемые clang 20. Например, Fil-C имеет отличную поддержку атомиков и SIMD-интринсиков.
Fil-C перехватывает всё то, что делает безопасность памяти в C сложной, например:
-
Выход за границы в куче или стеке.
-
Use-after-free (также в куче или стеке).
-
Путаница типов между указателями и не-указателями.
-
Ошибки типов, возникающие при связывании.
-
Ошибки типов, возникающие из-за неправильного использования va_list.
-
Гонки указателей.
-
Системные вызовы. Все буферы, передаваемые системным вызовам, проверяются на границы и тип.
-
Множество другого.
Fil-C поставляется с достаточно полным POSIX libc и даже поддерживает такие сложные возможности, как потоки, обработка сигналов, mmap/munmap, longjmp/setjmp и исключения C++.
Узнать больше
Вы можете узнать больше о Fil-C, посетив веб-сайт.
Вы также можете написать мне: [email protected]
Подписывайтесь на меня в Twitter.
Сообщайте о проблемах на GH.