
fil-c v0.685
Fil-C : sécurité mémoire entièrement compatible pour C et C++
Fil-C 0.684
Fil-C est une implémentation de C et C++ à sûreté mémoire, fanatiquement compatible. De nombreux logiciels se compilent et s'exécutent avec Fil-C sans aucun changement ou avec des changements minimes. Toutes les erreurs de sûreté mémoire sont détectées sous forme de paniques Fil-C. Fil-C y parvient en combinant un ramasse-miettes concurrent et des capacités invisibles (chaque pointeur en mémoire possède une capacité correspondante, non visible depuis l'espace d'adressage C). Chaque opération C fondamentale (telle qu'observée dans le LLVM IR) est vérifiée par rapport à la capacité. Fil-C n'a pas d'instruction unsafe et ne dispose que d'une FFI limitée vers du code non sûr.
Fil-C est particulier car :
-
Fil-C atteint une sûreté complète sans aucune échappatoire. Il n'existe pas de mot-clé
unsafeen Fil-C qui pourrait être utilisé pour désactiver les protections. La liaison avec du code non sûr est sévèrement restreinte. -
L'approche basée sur les capacités de Fil-C atteint un niveau de sûreté similaire à celui des capacités matérielles comme CHERI, sauf qu'elle fonctionne sur du matériel standard (X86_64 ou ARM64).
-
Fil-C est conçu pour empêcher que les bugs de sûreté mémoire soient exploités, plutôt que de simplement les signaler suffisamment souvent pour trouver des bugs. Cela distingue Fil-C d'AddressSanitizer, HWAsan ou MTE, qui peuvent tous être contournés par des attaquants. La différence clé qui rend cela possible est que Fil-C est basé sur les capacités (ainsi chaque pointeur sait quelle plage de mémoire il peut accéder, et comment il peut y accéder) plutôt que sur les tags (où les accès par pointeur sont autorisés s'ils atteignent une mémoire valide).
-
Du point de vue de l'utilisateur du langage, Fil-C n'est que du C et du C++ avec les extensions GCC/clang. Il est plus probable que non que votre programme ou bibliothèque C ou C++ préféré se compile en Fil-C sans aucun changement. Le compilateur Fil-C est basé sur clang 20.1.8, il prend donc en charge C17 et C++20.
Licence
Le compilateur (clang + LLVM) est couvert par LLVM-LICENSE.txt. Le runtime est couvert par PAS-LICENSE.txt (voir libpas/LICENSE.txt dans la distribution source). Dans le cas de la distribution Fil-C classique basée sur musl, la libc musl est couverte par MUSL-LICENSE.txt (voir projects/yolomusl/COPYRIGHT et projects/usermusl/COPYRIGHT dans la distribution source). Dans le cas de la distribution /opt/fil, glibc est couverte par glibc-LICENSE.txt, et tous les autres programmes inclus sont couverts par les fichiers -LICENSE.txt respectifs. Les bibliothèques C++ (libc++/libc++abi) sont couvertes par LLVM-LICENSE.txt.
Vous pouvez récupérer les sources du compilateur, du runtime, de libc++/libc++abi, de la libc (musl et glibc) et de tous les programmes inclus depuis github. La distribution source inclut également de nombreux programmes supplémentaires qui ont été portés vers Fil-C dans les répertoires projects/ et pizlix/, et ils ont diverses licences. La distribution /opt/fil inclut des builds de divers programmes supplémentaires et leurs licences se trouvent dans additional-licenses/ dans cette distribution.
Prérequis
Fil-C ne fonctionne que sur Linux/X86_64 ou Linux/ARM64.
Les versions précédentes fonctionnaient sur Darwin/ARM64 et FreeBSD, mais je me concentre désormais uniquement sur Linux car cela me permet de réaliser un travail plus fidèle d'implémentation de la libc. Rien n'empêche fondamentalement Fil-C de fonctionner sur d'autres architectures ou OS que Linux.
Pour commencer
Si vous avez téléchargé les binaires Fil-C, exécutez :
./setup.sh
Cela a un effet différent selon la distribution binaire que vous avez choisie :
-
Dans le cas de la distribution classique basée sur musl (
filc-0.684-linux-x86_64.tar.xzoufilc-0.684-linux-aarch64.tar.xz), cela configure Fil-C pour s'exécuter dans le répertoire courant. -
Dans le cas de la distribution /opt/fil basée sur glibc (
optfil-0.684-linux-x86_64.tar.xz), cela configure Fil-C dans/opt/fil.
Si vous avez téléchargé les sources de Fil-C, exécutez :
./build_all_fast.sh
Vous pourrez alors utiliser Fil-C depuis ce répertoire.
La distribution binaire de Fil-C est fournie avec musl comme libc. L'utilisation de ./build_all_fast.sh dans la distribution source compile également Fil-C avec musl. Si vous utilisez les sources, vous pouvez aussi :
-
./build_all_fast_glibc.sh- compile une configuration similaire mais avec glibc 2.40 comme libc. -
./build_all.sh- compilation complète basée sur musl (compile aussi de nombreux logiciels portés vers Fil-C). -
./build_all_glibc.sh- compilation complète basée sur glibc (compile encore plus de logiciels portés vers Fil-C). -
cd pizlix && sudo ./build.sh- compile la distribution Linux Pizlix. -
cd optfil && sudo ./build.sh- compile la distribution/opt/fil.
Ce qui fonctionne
De nombreux paquets logiciels fonctionnent en Fil-C sans aucun changement ou avec des changements minimes, y compris de gros comme openssl, CPython, SQLite, et bien d'autres. Fil-C est suffisamment puissant pour prendre en charge un environnement utilisateur Linux entièrement sûr en mémoire.
Fil-C prend entièrement en charge C et C++ ainsi que presque toutes les extensions prises en charge par clang 20. Fil-C offre par exemple un excellent support des atomiques et des intrinsèques SIMD.
Fil-C détecte tout ce qui rend la sûreté mémoire en C difficile, comme :
-
Les dépassements de bornes sur le tas ou la pile.
-
Les use-after-free (également sur le tas ou la pile).
-
La confusion de type entre pointeurs et non-pointeurs.
-
Les erreurs de type résultant de l'édition de liens.
-
Les erreurs de type résultant d'un mauvais usage des va_lists.
-
Les races de pointeurs.
-
Les appels système. Tous les tampons passés aux appels système sont vérifiés en termes de bornes et de type.
-
Beaucoup d'autres choses.
Fil-C est fourni avec une libc POSIX raisonnablement complète et prend même en charge des fonctionnalités délicates comme les threads, la gestion des signaux, mmap/munmap, longjmp/setjmp et les exceptions C++.
En savoir plus
Vous pouvez en apprendre davantage sur Fil-C en visitant le site web.
Vous pouvez aussi m'envoyer un e-mail : [email protected]
Suivez-moi sur Twitter.
Signalez les problèmes sur GH.