
fil-c v0.685
Fil-C: segurança de memória completamente compatível para C e C++
Fil-C 0.686
Fil-C é uma implementação de C e C++ com segurança de memória fanaticamente compatível. Muitos softwares compilam e executam com Fil-C sem nenhuma ou com mínimas alterações. Todos os erros de segurança de memória são capturados como panics do Fil-C. O 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 em relação à capacidade. O Fil-C não possui instrução unsafe e apenas FFI limitada para código inseguro.
O Fil-C é especial porque:
-
O Fil-C alcança segurança total sem escapatórias. 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 de segurança semelhante ao de capacidades de hardware como CHERI, exceto que roda em hardware comum (X86_64 ou ARM64).
-
O Fil-C foi projetado para impedir 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 fundamental 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 por ponteiro são permitidos se atingirem memória válida).
-
Do ponto de vista do usuário da linguagem, o 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 sem nenhuma alteração. O compilador Fil-C é baseado no clang 20.1.8, então suporta C17 e C++20.
Licença
O compilador (clang + LLVM) é coberto pelo LLVM-LICENSE.txt. O runtime é coberto pelo PAS-LICENSE.txt (veja libpas/LICENSE.txt na distribuição do código-fonte). No caso da distribuição clássica do Fil-C baseada em musl, a musl libc é coberta pelo MUSL-LICENSE.txt (veja projects/yolomusl/COPYRIGHT e projects/usermusl/COPYRIGHT na distribuição do código-fonte). No caso da distribuição /opt/fil, a glibc é coberta pelo 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 pelo 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 no github. A distribuição do código-fonte também inclui muitos programas adicionais que foram portados para o 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
O 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 isso me permite fazer um trabalho mais fiel de implementação da libc. Não há nada fundamentalmente impedindo o Fil-C de funcionar em outras arquiteturas ou sistemas operacionais além do Linux.
Primeiros Passos
Se você baixou os 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.686-linux-x86_64.tar.xzoufilc-0.686-linux-aarch64.tar.xz), isso configura o Fil-C para rodar no diretório atual. -
No caso da distribuição /opt/fil baseada em glibc (
optfil-0.686-linux-x86_64.tar.xz), isso configura o 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 o Fil-C a partir deste diretório.
A distribuição binária do Fil-C vem com musl como libc. Usar ./build_all_fast.sh na distribuição do código-fonte também compila o Fil-C usando musl. Se você estiver usando o código-fonte, então você também pode:
-
./build_all_fast_glibc.sh- compila uma configuração semelhante, mas com glibc 2.40 como libc. -
./build_all.sh- build completo baseado em musl (também compila muitos softwares que foram portados para o Fil-C). -
./build_all_glibc.sh- build completo baseado em glibc (compila ainda mais softwares que foram portados para o Fil-C). -
cd pizlix && sudo ./build.sh- compila a distribuição Linux Pizlix. -
cd optfil && sudo ./build.sh- compila a distribuição/opt/fil.
Coisas Que Funcionam
Muitos pacotes de software funcionam no Fil-C sem nenhuma ou com mínimas alterações, incluindo grandes como openssl, CPython, SQLite e muitos outros. O Fil-C é poderoso o suficiente para suportar um userland Linux totalmente seguro em memória.
O Fil-C tem suporte completo para C e C++ além de quase todas as extensões que o clang 20 suporta. O Fil-C tem excelente suporte para atomics e intrínsecos SIMD, por exemplo.
O 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 na stack.
-
Use-after free (também heap ou stack).
-
Confusão de tipos entre ponteiros e não-ponteiros.
-
Erros de tipo decorrentes de vinculação.
-
Erros de tipo decorrentes de uso indevido de va_lists.
-
Corridas de ponteiros.
-
Chamadas de sistema. Todos os buffers passados para chamadas de sistema são verificados quanto a limites e tipo.
-
Muitas outras coisas.
O 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 o Fil-C visitando o site.
Você também pode me enviar um e-mail: [email protected]
Siga-me no Twitter.
Abra issues no GH.