Fil-C 是一个狂热追求兼容性的 C 和 C++ 内存安全实现。大量软件在 Fil-C 下只需零改动或极少改动即可编译和运行。所有内存安全错误都会以 Fil-C panic 的形式被捕获。Fil-C 通过并发垃圾回收和不可见能力(内存中的每个指针都有一个对应的能力,对 C 地址空间不可见)的结合来实现这一点。每一个基本的 C 操作(如 LLVM IR 中所见)都会针对能力进行检查。Fil-C 没有 unsafe 语句,并且仅对不安全代码提供有限的 FFI。
Fil-C 的特别之处在于:
Fil-C 实现了完全的安全性,没有任何逃生舱口。Fil-C 中没有可用于关闭保护的 unsafe 关键字。链接到不安全代码受到严格限制。
Fil-C 基于能力的方法达到了与 CHERI 等硬件能力相似的安全级别,不同之处在于它运行在现成硬件上(X86_64 或 ARM64)。
Fil-C 的设计目标是防止内存安全漏洞被用于利用,而不仅仅是频繁地标记它们以便发现漏洞。这使得 Fil-C 不同于 AddressSanitizer、HWAsan 或 MTE,这些工具都可以被攻击者绕过。实现这一点的关键区别在于 Fil-C 是基于能力的(因此每个指针都知道它可以访问的内存范围以及如何访问),而不是基于标签的(在基于标签的方案中,只要指针访问命中有效内存就被允许)。
从语言用户的角度来看,Fil-C 就是带有 GCC/clang 扩展的 C 和 C++。你最喜欢的 C 或 C++ 程序或库很有可能在 Fil-C 中零改动即可编译。Fil-C 编译器基于 clang 20.1.8,因此支持 C17 和 C++20。
编译器(clang + LLVM)受 LLVM-LICENSE.txt 覆盖。运行时受 PAS-LICENSE.txt 覆盖(参见源码发行版中的 libpas/LICENSE.txt)。在经典的基于 musl 的 Fil-C 发行版中,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 覆盖。
你可以从 github 获取编译器、运行时、libc++/libc++abi、libc(musl 和 glibc)以及所有包含程序的源代码。源码发行版还包含许多已移植到 Fil-C 的额外程序,位于 projects/ 和 pizlix/ 目录中,它们有多种许可证。/opt/fil 发行版包含各种额外程序的构建,其许可证位于该发行版的 additional-licenses/ 中。
Fil-C 仅适用于 Linux/X86_64 或 Linux/ARM64。
以前的版本可在 Darwin/ARM64 和 FreeBSD 上运行,但现在我只专注于 Linux,因为它让我能够更忠实地实现 libc。除了 Linux 之外,没有什么根本性的障碍阻止 Fil-C 在其他架构或操作系统上运行。
如果你下载了 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 也会使用 musl 构建 Fil-C。如果你使用源代码,你还可以:
./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 - 构建 Pizlix Linux 发行版。
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 内存安全变得困难的问题,例如:
堆或栈上的越界访问。
释放后使用(同样是堆或栈)。
指针与非指针之间的类型混淆。
链接引起的类型错误。
误用 va_list 引起的类型错误。
指针竞争。
系统调用。传递给系统调用的所有缓冲区都会进行边界和类型检查。
许多其他问题。
Fil-C 附带了一个相当完整的 POSIX libc,甚至支持线程、信号处理、mmap/munmap、longjmp/setjmp 和 C++ 异常等棘手特性。
你可以通过访问网站了解更多关于 Fil-C 的信息。
你也可以给我发电子邮件:[email protected]
在 Twitter 上关注我。
在 GH 上提交问题。