Fil-C:输入代码,输出内存安全 [视频]

Fil-C:输入代码,输出内存安全 [视频]

Hacker News 摘要

原标题:Fil-C: Garbage In, Memory Safety Out [video]

视频展示了 Filip Pizlo 关于 Fil-C 的演讲,这是一种专门为 C 和 C++ 设计的内存安全实现方案。以下是视频内容的详细介绍:

什么是 Fil-C?

Fil-C 是一个完全实现内存安全的 C 和 C++ 编译器及运行时环境。如果一个程序通过 Fil-C 编译,其安全性理论上比用其他内存安全语言重写还要高。它的核心特点是与现有的 C/C++ 代码高度兼容,大约一半的现有软件包无需修改即可直接编译运行。目前,这是一个个人项目,主要运行在 Linux X86_64 平台上。

内存安全及其演变

演讲者首先定义了内存安全:内存逻辑漏洞不应让攻击者获得对所有内存的控制权。

常见漏洞: 包括越界访问、类型混淆(例如将整数作为指针使用)以及释放后使用(Use-After-Free)。

攻击历史: 1980 年代流行直接向内存写入机器码;2010 年代出现了绕过地址空间布局随机化(ASLR)的 ROP 攻击;2020 年代则通过改写关键数据来改变程序行为。

• ** Fil-C 的目标:** 彻底防止攻击者控制全部内存。

现有方案的局限性

自 90 年代以来,许多项目尝试解决 C 的内存安全问题(如 Cyclone、CCured、WASM、CHERI 等),但大多因为以下原因未能普及:

1. 并非真正的内存安全: 如 Sanitizer 工具只能捕捉部分 bug。

2. 不兼容: 不支持多线程、不完整的 C++ 支持或不支持特定的联合体(Union)。

3. 硬件依赖: 某些方案需要购买特定的硬件。

Fil-C 的核心技术:隐形权限(InvisiCaps)

Fil-C 的“绝招”在于利用了 Clang 生成的 LLVM IR 指针操作。

原理: 在 LLVM IR 层级,指针操作是非常规整的。Fil-C 为每个指针插入了隐形权限(Invisible Capabilities)

指针携带的信息: 除了指针的原始值,还额外携带了内存的下限、上限以及权限位。

不可见性: C/C++ 源代码依然认为指针是 64 位的,但底层运行时会追踪并校验这些额外的边界信息。这种设计避免了修改现有的代码逻辑。

编译器与运行时

编译器流程: 采用 Clang -> 内存安全优化 -> Pizlonator(插桩工具) -> 正常 LLVM 流水线

垃圾回收(GC): Fil-C 强制使用垃圾回收器来处理内存释放,这是为了提供最确定的行为防止释放后使用漏洞。它采用了一个并行、并发、不暂停程序的垃圾回收算法。

三层架构: Fil-C 将 glibcmusl 等基础库也进行了内存安全编译,形成了一个从内核到用户态的完整安全层。即使是系统调用(Syscalls)也会经过 Fil-C 的过滤。

现场演示与代码验证

演讲者现场展示了 Fil-C 的实际运行效果:

1. LibreOffice 演示: 令人惊讶的是,演讲者使用的幻灯片软件 LibreOffice 就是用 Fil-C 编译的,包含超过 9400 万行代码。

2. 越界访问测试: 编写一个简单的 C 程序尝试访问数组下标 67(实际大小 16)。通过 Fil-C 编译后,程序在运行时立即触发 filc panic 并给出详细的边界错误提示。

3. 内联汇编校验: 演示了 Fil-C 编译器会自动检查汇编代码。如果汇编指令可能破坏内存安全(如设置了标志位但未声明寄存器冲突),编译器会拒绝编译。

4. 变长数组(VLA): 演示了 Fil-C 如何处理不确定的数组长度。即使存在内存对齐导致的微小空间冗余(如 16 字节对齐),Fil-C 依然能精准拦截非法的越界读写。

总结

Fil-C 证明了在不放弃 C/C++ 语言特性的前提下,可以通过增强编译器和运行时来实现极高强度的内存安全。它不仅支持最新的 C23 和 C++23 标准,还能安全地处理内联汇编和各种复杂的内存操作。


原文:https://www.youtube.com/watch?v=5F-2Y1LPRek

评论:https://news.ycombinator.com/item?id=49026933

Report Page