
fil-c v0.685
Fil-C: vollständig kompatible Speichersicherheit für C und C++
Fil-C 0.684
Fil-C ist eine fanatisch kompatible speichersichere Implementierung von C und C++. Viele Softwarepakete lassen sich mit Fil-C ohne oder mit nur minimalen Änderungen kompilieren und ausführen. Alle Speichersicherheitsfehler werden als Fil-C-Panics abgefangen. Fil-C erreicht dies durch eine Kombination aus nebenläufiger Garbage Collection und unsichtbaren Capabilities (jeder Zeiger im Speicher hat eine entsprechende Capability, die für den C-Adressraum nicht sichtbar ist). Jede grundlegende C-Operation (wie in LLVM IR zu sehen) wird gegen die Capability geprüft. Fil-C hat keine unsafe-Anweisung und nur eingeschränkte FFI zu unsicherem Code.
Fil-C ist besonders, weil:
-
Fil-C erreicht vollständige Sicherheit ohne Notausgänge. Es gibt kein
unsafe-Schlüsselwort in Fil-C, mit dem Schutzmechanismen deaktiviert werden könnten. Das Verlinken mit unsicherem Code ist stark eingeschränkt. -
Der capability-basierte Ansatz von Fil-C erreicht ein ähnliches Sicherheitsniveau wie Hardware-Capabilities wie CHERI, mit dem Unterschied, dass er auf Standardhardware (X86_64 oder ARM64) läuft.
-
Fil-C ist darauf ausgelegt, zu verhindern, dass Speichersicherheitsfehler zur Ausnutzung verwendet werden, anstatt sie nur häufig genug zu melden, um Fehler zu finden. Dadurch unterscheidet sich Fil-C von AddressSanitizer, HWAsan oder MTE, die alle von Angreifern umgangen werden können. Der entscheidende Unterschied, der dies möglich macht, ist, dass Fil-C capability-basiert ist (jeder Zeiger weiß also, auf welchen Speicherbereich er zugreifen darf und wie er darauf zugreifen darf) und nicht tag-basiert (wobei Zeigerzugriffe erlaubt sind, wenn sie auf gültigen Speicher treffen).
-
Aus Sicht der Sprachbenutzer ist Fil-C einfach C und C++ mit GCC/clang-Erweiterungen. Es ist wahrscheinlicher als nicht, dass Ihr bevorzugtes C- oder C++-Programm oder Ihre Bibliothek in Fil-C ohne Änderungen kompiliert. Der Fil-C-Compiler basiert auf clang 20.1.8 und unterstützt daher C17 und C++20.
Lizenz
Der Compiler (clang + LLVM) ist durch LLVM-LICENSE.txt abgedeckt. Die Laufzeitumgebung ist durch PAS-LICENSE.txt abgedeckt (siehe libpas/LICENSE.txt in der Quellcode-Distribution). Im Fall der klassischen musl-basierten Fil-C-Distribution ist die musl libc durch MUSL-LICENSE.txt abgedeckt (siehe projects/yolomusl/COPYRIGHT und projects/usermusl/COPYRIGHT in der Quellcode-Distribution). Im Fall der /opt/fil-Distribution ist glibc durch glibc-LICENSE.txt abgedeckt, und alle anderen enthaltenen Programme sind durch die jeweiligen -LICENSE.txt-Dateien abgedeckt. Die C++-Bibliotheken (libc++/libc++abi) sind durch LLVM-LICENSE.txt abgedeckt.
Sie können den Quellcode für den Compiler, die Laufzeitumgebung, libc++/libc++abi, libc (musl und glibc) und alle enthaltenen Programme von github beziehen. Die Quellcode-Distribution enthält außerdem viele zusätzliche Programme, die auf Fil-C portiert wurden, in den Verzeichnissen projects/ und pizlix/, und diese haben verschiedene Lizenzen. Die /opt/fil-Distribution enthält Builds einer Vielzahl zusätzlicher Programme, und deren Lizenzen befinden sich in additional-licenses/ in dieser Distribution.
Anforderungen
Fil-C funktioniert nur auf Linux/X86_64 oder Linux/ARM64.
Frühere Versionen funktionierten auf Darwin/ARM64 und FreeBSD, aber jetzt konzentriere ich mich nur auf Linux, weil es mir ermöglicht, libc getreuer zu implementieren. Es gibt nichts grundsätzlich daran, was Fil-C daran hindert, auf anderen Architekturen oder Betriebssystemen als Linux zu funktionieren.
Erste Schritte
Wenn Sie Fil-C-Binärdateien heruntergeladen haben, führen Sie aus:
./setup.sh
Dies hat je nach gewählter Binär-Distribution unterschiedliche Auswirkungen:
-
Im Fall der klassischen musl-basierten Distribution (
filc-0.684-linux-x86_64.tar.xzoderfilc-0.684-linux-aarch64.tar.xz) richtet dies Fil-C so ein, dass es im aktuellen Verzeichnis ausgeführt wird. -
Im Fall der /opt/fil glibc-basierten Distribution (
optfil-0.684-linux-x86_64.tar.xz) richtet dies Fil-C in/opt/filein.
Wenn Sie den Fil-C-Quellcode heruntergeladen haben, führen Sie aus:
./build_all_fast.sh
Danach können Sie Fil-C aus diesem Verzeichnis heraus verwenden.
Die Binär-Distribution von Fil-C enthält musl als libc. Die Verwendung von ./build_all_fast.sh in der Quellcode-Distribution baut Fil-C ebenfalls mit musl. Wenn Sie den Quellcode verwenden, können Sie außerdem:
-
./build_all_fast_glibc.sh- baut ein ähnliches Setup, aber mit glibc 2.40 als libc. -
./build_all.sh- vollständiger musl-basierter Build (baut auch viele Softwarepakete, die auf Fil-C portiert wurden). -
./build_all_glibc.sh- vollständiger glibc-basierter Build (baut noch mehr Software, die auf Fil-C portiert wurde). -
cd pizlix && sudo ./build.sh- baut die Pizlix Linux-Distribution. -
cd optfil && sudo ./build.sh- baut die/opt/fil-Distribution.
Dinge, die funktionieren
Viele Softwarepakete funktionieren in Fil-C ohne oder mit nur minimalen Änderungen, darunter große wie openssl, CPython, SQLite und viele andere. Fil-C ist leistungsfähig genug, um ein vollständig speichersicheres Linux-Userland zu unterstützen.
Fil-C bietet vollständige Unterstützung für C und C++ sowie fast alle Erweiterungen, die clang 20 unterstützt. Fil-C hat beispielsweise hervorragende Unterstützung für Atomics und SIMD-Intrinsics.
Fil-C fängt all die Dinge ab, die Speichersicherheit in C schwierig machen, wie:
-
Out-of-Bounds auf dem Heap oder Stack.
-
Use-after-free (ebenfalls Heap oder Stack).
-
Typverwechslung zwischen Zeigern und Nicht-Zeigern.
-
Typfehler, die beim Linken entstehen.
-
Typfehler, die durch Missbrauch von va_lists entstehen.
-
Pointer-Races.
-
Systemaufrufe. Alle an Systemaufrufe übergebenen Puffer werden auf Grenzen und Typ geprüft.
-
Viele andere Dinge.
Fil-C wird mit einer einigermaßen vollständigen POSIX-libc geliefert und unterstützt sogar knifflige Funktionen wie Threads, Signalbehandlung, mmap/munmap, longjmp/setjmp und C++-Exceptions.
Mehr erfahren
Sie können mehr über Fil-C erfahren, indem Sie die Website besuchen.
Sie können mir auch eine E-Mail schreiben: [email protected]
Folgen Sie mir auf Twitter.
Melden Sie Probleme bei GH.