- Fil-C, un nouveau compilateur C/C++ doté de sécurité mémoire, montre une forte compatibilité avec le code existant, et la plupart des bibliothèques et applications fonctionnent sans modification
- Fournit la procédure pour compiler depuis les sources et installer Fil-C sur Debian 13, ainsi qu’un script d’installation automatisé pour recompiler glibc et binutils avec Fil-C
- Sur environ 9 000 microbenchmarks de logiciels cryptographiques, Fil-C utilise 1 à 4 fois plus de cycles que clang
- Tente une intégration au système de build des paquets Debian avec Fil-C, en ajoutant un nouvel ABI (
amd64fil0) pour permettre une installation en parallèle de paquets basés sur Fil-C
- Fil-C vise à concilier sécurité mémoire et compatibilité avec l’écosystème existant, tout en montrant son potentiel d’extension aux systèmes basés sur Debian
Vue d’ensemble de Fil-C et premières impressions
- Fil-C est un compilateur C/C++ garantissant la sécurité mémoire, avec une forte compatibilité avec le code existant
- La plupart des bibliothèques et applications fonctionnent sans modification
- Même dans les cas exceptionnels où des changements sont nécessaires, ils ne semblent pas particulièrement difficiles à résoudre
- L’auteur vise à protéger plusieurs systèmes qu’il administre en les faisant passer à du code compilé avec Fil-C
- Environnement de test : Debian 13, AMD Ryzen 5 7640HS (6 cœurs, 12 threads), 12 Go de RAM, 36 Go de swap
Ressources et scripts associés
- Publication d’un script de diff d’audit comparant Fil-C à ses sources amont (par ex. clang, glibc)
- Fournit le script filian-install-compiler pour télécharger, compiler et installer Fil-C, glibc et binutils sur Debian 13
- Temps d’exécution total : 86 minutes réelles, 477 minutes CPU utilisateur, 52 minutes CPU système
- Fournit le script filian-install-packages pour compiler des paquets source Debian avec Fil-C
- Certains paquets (comme bzip2) sont confirmés comme compilant correctement
- Publication d’un graphique de performance Fil-C vs. clang
- Résultats d’environ 9 000 microbenchmarks liés à la cryptographie
- Le code compilé avec Fil-C consomme 1 à 4 fois plus de cycles que clang
Installation et compilation de Fil-C
- Après installation des paquets nécessaires avec les privilèges root, la compilation est effectuée avec l’utilisateur non privilégié
filc
- Les sources de Fil-C incluent glibc ainsi que plusieurs bibliothèques et applications de haut niveau
- Commande de build :
time ./build_all_fast_glibc.sh
- musl peut aussi être choisi, mais présente des incompatibilités avec certains paquets (attr, elfutils, sed, vim, etc.)
- En cas de manque de mémoire pendant le build, le problème a été résolu en étendant le swap à 36 Go
- Utilisation maximale d’environ 19 Go de swap et 12 Go de RAM
- Sur un gros serveur (128 cœurs, 512 Go de RAM), le build de Fil-C prend 8 minutes et celui avec musl 6 minutes
Build de bibliothèques et applications supplémentaires
- Fil-C inclut build_all_slow.sh pour compiler plusieurs bibliothèques et applications
- Un script build-parallel-20251023.py a été écrit pour le paralléliser
- Le build complet continue sans s’arrêter en cas d’erreur
- La compilation parallèle permet de réduire le temps total
- Sur le système phoenix, 60 cibles réussissent sur 61 (101 minutes réelles)
- Seule libcap échoue à la compilation (erreur de chargement de
liblto_plugin.so)
- util-linux nécessite des modifications liées aux syscalls
- Les autres paquets majeurs (attr, bash, curl, openssl, vim, etc.) se compilent sans problème
Bibliothèques et applications supplémentaires testées
- boost 1.89.0 : fonctionne globalement bien, avec quelques correctifs nécessaires autour de
vfork
- cdb-20251021 : fonctionne correctement, avec une différence de message d’erreur dans un test OOM artificiel
- libcpucycles, libgc (en remplacement de gshim), libntruprime, lpeg, luv se compilent et passent les tests correctement
- Des applications CLI importantes comme mutt, tig, w3m fonctionnent également correctement
Intégration à Debian (Filian)
- Exploite la structure multi-architecture de Debian pour ajouter un ABI dédié à Fil-C (
amd64fil0)
- Exemple :
apt install bash:amd64fil0 permet d’installer une version compilée avec Fil-C
- Fil-C utilise son propre répertoire au lieu de
/usr/include, ce qui crée un problème de décalage des chemins de fichiers d’en-tête
- Le script filian-install-compiler l’ajuste vers les chemins standard Debian
- Ajout de la reconnaissance de l’architecture Fil-C dans les outils de build Debian (
dpdk-buildpackage, sbuild, etc.)
- Modifications de
/usr/share/dpkg/cputable, config.sub, etc.
- Fil-C et les bibliothèques standard sont placés dans
/usr/libexec/fil/amd64
- Les commandes
filcc et fil++ peuvent être utilisées à l’échelle du système
Exemple de build de paquet Debian
- Le script auxiliaire
fillet ajuste les symboles et les chemins d’installation des paquets source Debian
- Le résultat du build du paquet
tinycdb avec Fil-C est la génération de 3 paquets .deb dédiés à amd64fil0
- Après installation, les commandes
nm et ldd permettent de vérifier les symboles Fil-C (pizlonated_) et les chemins des bibliothèques
- À l’exécution, le fonctionnement des protections runtime de Fil-C est confirmé (affichage d’un message bloquant une violation de « memory safety »)
Builds Debian supplémentaires
- libc-dev : création d’un faux paquet pour résoudre les dépendances
- ncurses : peut être compilé puis installé avec Fil-C
- libmd : recompilation nécessaire à cause d’un décalage de version entre architectures
- readline : nécessite un lien symbolique pour le chemin des en-têtes
- lua5.4 : fonctionne correctement après résolution de la dépendance à readline
Conclusion
- Fil-C est une tentative de concilier renforcement de la sécurité mémoire et compatibilité avec l’écosystème C/C++ existant
- La possibilité de build et d’intégration de paquets dans un environnement Debian est démontrée
- Quelques ajustements restent nécessaires dans certains scripts de build et chemins d’en-tête, mais la compatibilité avec la plupart des grands paquets open source est acquise
1 commentaires
Commentaire Hacker News
C’est probablement dû à la variabilité des microbenchmarks, mais certains résultats semblent tellement rapides qu’on se demande s’il n’y a pas un problème de justesse
Pour cela, il crée et partage une bibliothèque shim GC ainsi que des scripts de build
Une fois le swap porté à 36 Go, le build s’est déroulé normalement, avec un pic à 19 Go de swap + 12 Go de RAM
Sur un serveur de 128 cœurs et 512 Go de RAM, le build de Fil-C a pris 8 minutes, contre 6 minutes pour musl
Fil-C semble effectuer beaucoup d’analyse statique
On peut le vérifier sur cdb.cr.yp.to, et il est mentionné que le nouveau sous-domaine cdb utilise pqconnect
pqconnect est utilisé à l’étape de connexion HTTP(S), et même si les deux encodent une clé publique dans le DNS, leur rôle diffère
pqconnect inclut la clé publique dans le CNAME, à la manière de CurveCP
En revanche, la partie pq1 n’est pas une clé publique mais le hash de la clé publique long terme du serveur
Les notes liées à Fil-C ont été soumises il y a 3 jours
Fil connexe
Lien vers la discussion précédente
L’objectif semble être de permettre à la plupart des programmes C/C++ de s’exécuter en sécurité sans devoir être réécrits en Rust
Je me demande aussi quel est le lien avec Epic Games
Plutôt que d’écrire du nouveau code, il convient davantage à l’encapsulation sécurisée de code existant, un peu comme le sandboxing WASM
En revanche, Fil-C détecte les crashs avec plus de précision
Il y a peut-être aussi des enseignements à en tirer pour le mode unsafe de Rust
En particulier, l’idée de lier statiquement des dépendances compilées avec Fil-C est intéressante
Comme Fil-C doit contrôler l’ensemble du programme pour assurer le suivi des pointeurs, le FFI ne s’intègre pas bien à son architecture
Par exemple : Fil-C: A memory-safe C implementation,
Safepoints and Fil-C,
Fil’s Unbelievable Garbage Collector
La discussion sur la sécurité mémoire se poursuit entre 2024 et 2025
Fil-C est une implémentation à sécurité mémoire compatible avec C/C++, et la plupart des codes se compilent presque sans modification
Toutes les erreurs mémoire sont détectées sous forme de panic, et la sécurité est assurée par un GC concurrent et InvisiCaps
Des explications plus détaillées sont disponibles sur le site officiel
J’aimerais savoir pourquoi, et essayer Fil-C moi-même
Article connexe