
fil-c v0.685
Fil-C: seguridad de memoria completamente compatible para C y C++
Fil-C 0.684
Fil-C es una implementación de C y C++ con seguridad de memoria fanáticamente compatible. Gran cantidad de software se compila y ejecuta con Fil-C con cambios nulos o mínimos. Todos los errores de seguridad de memoria se detectan como pánicos de Fil-C. Fil-C logra esto utilizando una combinación de recolección de basura concurrente y capacidades invisibles (cada puntero en memoria tiene una capacidad correspondiente, no visible para el espacio de direcciones de C). Cada operación fundamental de C (como se ve en LLVM IR) se verifica contra la capacidad. Fil-C no tiene una declaración unsafe y solo tiene FFI limitado hacia código inseguro.
Fil-C es especial porque:
-
Fil-C logra seguridad completa sin vías de escape. No hay una palabra clave
unsafeen Fil-C que pueda usarse para desactivar las protecciones. El enlazado con código inseguro está severamente restringido. -
El enfoque basado en capacidades de Fil-C logra un nivel de seguridad similar al de capacidades de hardware como CHERI, excepto que se ejecuta en hardware estándar (X86_64 o ARM64).
-
Fil-C está diseñado para prevenir que los errores de seguridad de memoria sean utilizados para explotación, en lugar de simplemente señalarlos con la suficiente frecuencia para encontrar errores. Esto hace que Fil-C sea diferente de AddressSanitizer, HWAsan o MTE, que pueden ser eludidos por atacantes. La diferencia clave que hace esto posible es que Fil-C está basado en capacidades (por lo que cada puntero sabe qué rango de memoria puede acceder y cómo puede acceder a él) en lugar de basado en etiquetas (donde los accesos de puntero se permiten si alcanzan memoria válida).
-
Desde el punto de vista del usuario del lenguaje, Fil-C es simplemente C y C++ con extensiones de GCC/clang. Es más probable que no que tu programa o biblioteca favorita de C o C++ se compile en Fil-C sin cambios. El compilador de Fil-C está basado en clang 20.1.8, por lo que soporta C17 y C++20.
Licencia
El compilador (clang + LLVM) está cubierto por LLVM-LICENSE.txt. El runtime está cubierto por PAS-LICENSE.txt (ver libpas/LICENSE.txt en la distribución del código fuente). En el caso de la distribución clásica de Fil-C basada en musl, la libc musl está cubierta por MUSL-LICENSE.txt (ver projects/yolomusl/COPYRIGHT y projects/usermusl/COPYRIGHT en la distribución del código fuente). En el caso de la distribución /opt/fil, glibc está cubierta por glibc-LICENSE.txt, y todos los demás programas incluidos están cubiertos por los respectivos archivos -LICENSE.txt. Las bibliotecas de C++ (libc++/libc++abi) están cubiertas por LLVM-LICENSE.txt.
Puedes obtener el código fuente del compilador, el runtime, libc++/libc++abi, libc (musl y glibc) y todos los programas incluidos desde github. La distribución del código fuente también incluye muchos programas adicionales que han sido portados a Fil-C en los directorios projects/ y pizlix/, y tienen una variedad de licencias. La distribución /opt/fil incluye compilaciones de una variedad de programas adicionales y sus licencias están en additional-licenses/ en esa distribución.
Requisitos
Fil-C solo funciona en Linux/X86_64 o Linux/ARM64.
Versiones anteriores funcionaban en Darwin/ARM64 y FreeBSD, pero ahora me estoy enfocando solo en Linux porque me permite hacer un trabajo más fiel al implementar libc. No hay nada fundamental que impida que Fil-C funcione en otras arquitecturas u sistemas operativos distintos de Linux.
Primeros pasos
Si descargaste los binarios de Fil-C, ejecuta:
./setup.sh
Esto tiene un efecto diferente dependiendo de qué distribución binaria seleccionaste:
-
En el caso de la distribución clásica basada en musl (
filc-0.684-linux-x86_64.tar.xzofilc-0.684-linux-aarch64.tar.xz), esto configura Fil-C para ejecutarse en el directorio actual. -
En el caso de la distribución basada en glibc /opt/fil (
optfil-0.684-linux-x86_64.tar.xz), esto configura Fil-C en/opt/fil.
Si descargaste el código fuente de Fil-C, ejecuta:
./build_all_fast.sh
Luego podrás usar Fil-C desde dentro de este directorio.
La distribución binaria de Fil-C viene con musl como libc. Usar
./build_all_fast.sh en la distribución del código fuente también compila Fil-C usando musl.
Si estás usando el código fuente, también puedes:
-
./build_all_fast_glibc.sh- compila una configuración similar pero con glibc 2.40 como la libc. -
./build_all.sh- compilación completa basada en musl (también compila mucho software que fue portado a Fil-C). -
./build_all_glibc.sh- compilación completa basada en glibc (compila aún más software que fue portado a Fil-C). -
cd pizlix && sudo ./build.sh- compila la distribución Linux Pizlix. -
cd optfil && sudo ./build.sh- compila la distribución/opt/fil.
Cosas que funcionan
Muchos paquetes de software funcionan en Fil-C con cambios nulos o mínimos, incluyendo grandes como openssl, CPython, SQLite y muchos otros. Fil-C es lo suficientemente potente como para soportar un userland Linux completamente seguro en memoria.
Fil-C tiene soporte completo para C y C++ además de casi todas las extensiones que soporta clang 20. Fil-C tiene un excelente soporte para atómicos e intrínsecos SIMD, por ejemplo.
Fil-C detecta todas las cosas que hacen difícil la seguridad de memoria en C, como:
-
Fuera de límites en el heap o la pila.
-
Use-after free (también en heap o pila).
-
Confusión de tipos entre punteros y no punteros.
-
Errores de tipo que surgen del enlazado.
-
Errores de tipo que surgen del mal uso de va_lists.
-
Condiciones de carrera de punteros.
-
Llamadas al sistema. Todos los búferes pasados a llamadas al sistema se verifican en cuanto a límites y tipo.
-
Muchas otras cosas.
Fil-C viene con una libc POSIX razonablemente completa e incluso soporta características complicadas
como hilos, manejo de señales, mmap/munmap, longjmp/setjmp,
y excepciones de C++.
Aprende más
Puedes aprender más sobre Fil-C visitando el sitio web.
También puedes enviarme un correo electrónico: [email protected]
Sígueme en Twitter.
Reporta problemas en GH.