Rilasciato Fil-C 0.682 — compilatore C e C++ che garantisce la completa sicurezza della memoria e fornendo garanzie maggiori rispetto a molti altri linguaggi, come ad esempio Rust. Il progetto è sviluppato da Filip Pizlo, che non ha bisogno di presentazioni.
Fil-C si basa sul codice sorgente di Clang/LLVM 20.x e consente la compilazione di codice tradizionale in C/C++ garantendo la prevenzione di tutte le principali vulnerabilità (accesso fuori limite, uso dopo liberazione, doppia liberazione, confusione di tipo). A differenza di ASan o MTE, Fil-C utilizza un modello di oggetti strettamente sicuro e non contiene intrinsecamente falle come blocchi non sicuri.
Nel corso dell'anno, il progetto è passato da una prova di concetto a un vero e proprio strumento con un ecosistema vasto.
Caratteristiche principali e dettagli tecnici:
- InvisiCaps 2.0 e sviluppo del modello Capability: Il sistema di autorizzazioni (capabilities) è stato notevolmente rielaborato, tracciando i confini e i tipi di puntatori senza modificare la loro dimensione a 64 bit nello spazio degli indirizzi C. È stato ottimizzato lo storage delle capabilities, ridotti i costi, e aggiunta un'adeguata supporto per union, memcpy, operazioni atomiche con strutture e passaggio di mandati tramite assemblatore inline.
- Raccoglitore di spazzatura parallelo (FUGC): Nel garbage collector runtime Fil’s Unbelievable Garbage Collector sono state aggiunte la raccolta parallela, il supporto per oggetti complessi come chiusure e GNU Indirect Function.
- Supporto ARM64: Realizzato da zero un backend, runtime, caricatore e ABI per l'architettura ARM64 (Linux/aarch64), il progetto è entrato nella fase di beta testing su questa piattaforma.
- Assemblatore inline sicuro e SIMD: Aggiunta la possibilità unica di eseguire inserimenti di assemblatore sicuri (inclusi blocchi di assemblatore OpenSSL) mantenendo la verifica delle autorizzazioni. Implementato il supporto completo per le istruzioni vettoriali SSE, AVX, AVX2 e AVX512 (inclusi masked load/store, expand/compress, sfence e prefetch).
- Analisi delle fughe: A partire dalla versione 0.671 è stata implementata un'analisi statica delle perdite di memoria nelle aree dello stack. Questo è stato il cambiamento di ottimizzazione più significativo dell'anno: la velocità di esecuzione di QuickJS è aumentata di oltre 6 volte e quella della maggior parte degli altri programmi di oltre il 10%.
- Compatibilità con C++ e standard moderni: È stato implementato il supporto per le eccezioni C++, il ripristino forzato dello stack, ucontext, salti calcolati, std::optional e puntatori ai membri delle classi.
- Protezione da pericolose ottimizzazioni UB di LLVM: Fil-C ha di fatto disattivato le ottimizzazioni aggressive di LLVM basate sul comportamento indefinito (UB). In particolare, il strict aliasing è stato disattivato forzatamente e l'analogo -fwrapv è stato attivato, il che previene la rimozione errata dei controlli di sicurezza da parte del compilatore.
- Transizione a LLVM/Clang 20: Il compilatore è stato migrato sulla base di codice Clang 20 (dalla versione Fil-C 0.670), il che ha garantito una migliore compatibilità e portabilità nella generazione del codice.
- Espansione dell'ABI Linux e FFI di nuova generazione: È stata implementata l'emulazione e wrapper sicuri per decine di chiamate di sistema Linux (statx, openat2, pidfd, epoll, splice, futex, timer API e altro), così come il supporto per dlopen, dlvsym, libffi e il livello FFI per interagire con codice esterno.
- Nuova convenzione di chiamata e API del runtime: L'ABI di chiamata delle funzioni è stato ottimizzato per ridurre l'overhead. Sono state aggiunte nuove API, tra cui zlock_runtime_threads() (fissare i thread per creare sandbox rigorose), oltre a un profiler di campionamento integrato e strumenti per il dumping della memoria.
- Distributivo userspace completo /opt/fil: un ambiente di sistema sicuro basato su glibc 2.40, che include OpenSSH, OpenSSL, sudo, git, curl, wget, rsync, tmux, make, grep, e le librerie di sistema (PAM, Kerberos, SELinux, ICU).
Le versioni binarie pronte sono distribuite in due varianti: autonome basate su musl (filc) e un ambiente di sistema completo /opt/fil per le architetture x86_64 e ARM64.
Si segnala inoltre che esiste un distribuito Linux sicuro per la memoria - Pizlix
Fonte: linux.org.ru
