
fil-c v0.685
Fil-C: segurança de memória completamente compatível para C e C++
Fil-C 0.684
Fil-C é uma implementação de memória segura fanaticamente compatível de C e C++. Muitos softwares compilam e executam com Fil-C com zero ou mínimas alterações. Todos os erros de segurança de memória são capturados como panics do Fil-C. Fil-C alcança isso usando uma combinação de coleta de lixo concorrente e capacidades invisíveis (cada ponteiro na memória tem uma capacidade correspondente, não visível ao espaço de endereçamento C). Toda operação fundamental de C (como vista no LLVM IR) é verificada contra a capacidade. Fil-C não tem instrução unsafe e apenas FFI limitada para código inseguro.
Fil-C é especial porque:
-
Fil-C alcança segurança total sem escotilhas de escape. Não há palavra-chave
unsafeno Fil-C que possa ser usada para desativar proteções. A vinculação a código inseguro é severamente restrita. -
A abordagem baseada em capacidades do Fil-C alcança um nível similar de segurança a capacidades de hardware como CHERI, exceto que roda em hardware comum (X86_64 ou ARM64).
-
Fil-C é projetado para prevenir que bugs de segurança de memória sejam usados para exploração, em vez de apenas sinalizá-los com frequência suficiente para encontrar bugs. Isso torna o Fil-C diferente do AddressSanitizer, HWAsan, ou MTE, que podem todos ser contornados por atacantes. A diferença chave que torna isso possível é que o Fil-C é baseado em capacidades (então cada ponteiro sabe qual faixa de memória pode acessar, e como pode acessá-la) em vez de baseado em tags (onde acessos de ponteiro são permitidos se atingirem memória válida).
-
Do ponto de vista do usuário da linguagem, Fil-C é apenas C e C++ com extensões GCC/clang. É mais provável que não que seu programa ou biblioteca C ou C++ favorito compile no Fil-C com zero alterações. O compilador Fil-C é baseado no clang 20.1.8, então suporta C17 e C++20.
Licença
O compilador (clang + LLVM) é coberto por LLVM-LICENSE.txt. O runtime é coberto por PAS-LICENSE.txt (veja libpas/LICENSE.txt na distribuição de código-fonte). No caso da distribuição clássica Fil-C baseada em musl, a musl libc é coberta por MUSL-LICENSE.txt (veja projects/yolomusl/COPYRIGHT e projects/usermusl/COPYRIGHT na distribuição de código-fonte). No caso da distribuição /opt/fil, glibc é coberta por glibc-LICENSE.txt, e todos os outros programas incluídos são cobertos pelos respectivos arquivos -LICENSE.txt. As bibliotecas C++ (libc++/libc++abi) são cobertas por LLVM-LICENSE.txt.
Você pode obter o código-fonte do compilador, runtime, libc++/libc++abi, libc (musl e glibc), e todos os programas incluídos do github. A distribuição de código-fonte também inclui muitos programas adicionais que foram portados para Fil-C nos diretórios projects/ e pizlix/, e eles têm uma variedade de licenças. A distribuição /opt/fil inclui builds de uma variedade de programas adicionais e suas licenças estão em additional-licenses/ nessa distribuição.
Requisitos
Fil-C só funciona em Linux/X86_64 ou Linux/ARM64.
Versões anteriores funcionavam em Darwin/ARM64 e FreeBSD, mas agora estou focando apenas em Linux porque me permite fazer um trabalho mais fiel de implementar libc. Não há nada fundamentalmente impedindo Fil-C de funcionar em outras arquiteturas ou sistemas operacionais além do Linux.
Começando
Se você baixou binários do Fil-C, execute:
./setup.sh
Isso tem um efeito diferente dependendo de qual distribuição binária você selecionou:
-
No caso da distribuição clássica baseada em musl (
filc-0.684-linux-x86_64.tar.xzoufilc-0.684-linux-aarch64.tar.xz), isso configura Fil-C para rodar no diretório atual. -
No caso da distribuição /opt/fil baseada em glibc (
optfil-0.684-linux-x86_64.tar.xz), isso configura Fil-C em/opt/fil.
Se você baixou o código-fonte do Fil-C, execute:
./build_all_fast.sh
Então você poderá usar Fil-C de dentro deste diretório.
A distribuição binária do Fil-C vem com musl como libc. Usar
./build_all_fast.sh na distribuição de código-fonte também constrói Fil-C usando musl.
Se você está usando código-fonte, então você também pode:
-
./build_all_fast_glibc.sh- constrói uma configuração similar mas com glibc 2.40 como a libc. -
./build_all.sh- build completo baseado em musl (também constrói muito software que foi portado para Fil-C). -
./build_all_glibc.sh- build completo baseado em glibc (constrói ainda mais software que foi portado para Fil-C). -
cd pizlix && sudo ./build.sh- constrói a distribuição Linux Pizlix. -
cd optfil && sudo ./build.sh- constrói a distribuição/opt/fil.
Coisas Que Funcionam
Muitos pacotes de software funcionam no Fil-C com zero ou mínimas alterações, incluindo grandes como openssl, CPython, SQLite, e muitos outros. Fil-C é poderoso o suficiente para suportar um userland Linux totalmente seguro em memória.
Fil-C tem suporte completo para C e C++ mais quase todas as extensões que clang 20 suporta. Fil-C tem excelente suporte para atomics e intrínsecos SIMD, por exemplo.
Fil-C captura todas as coisas que tornam a segurança de memória em C difícil, como:
-
Out-of-bounds no heap ou stack.
-
Use-after free (também heap ou stack).
-
Confusão de tipo entre ponteiros e não-ponteiros.
-
Erros de tipo surgindo de vinculação.
-
Erros de tipo surgindo de uso indevido de va_lists.
-
Corridas de ponteiro.
-
Chamadas de sistema. Todos os buffers passados para chamadas de sistema são verificados para limites e tipo.
-
Muitas outras coisas.
Fil-C vem com uma libc POSIX razoavelmente completa e até suporta recursos complicados
como threads, tratamento de sinais, mmap/munmap, longjmp/setjmp,
e exceções C++.
Saiba Mais
Você pode aprender mais sobre Fil-C visitando o site.
Você também pode me enviar um e-mail: [email protected]
Siga-me no Twitter.
Abra issues no GH.