
fil-c v0.685
Fil-C: C 및 C++를 위한 완전히 호환되는 메모리 안전성
Fil-C 0.684
Fil-C는 C와 C++의 광적으로 호환되는 메모리 안전 구현체입니다. 많은
소프트웨어가 Fil-C에서 변경 없이 또는 최소한의 변경으로 컴파일되고 실행됩니다. 모든
메모리 안전 오류는 Fil-C 패닉으로 잡힙니다. Fil-C는 동시 가비지 컬렉션과
보이지 않는 capability(메모리의 각 포인터에는 대응하는 capability가 있으며, 이는 C 주소
공간에서 보이지 않음)의 조합을 사용하여 이를 달성합니다. 모든 근본적인 C 연산(LLVM IR에서
보이는 것처럼)은 capability에 대해 검사됩니다. Fil-C에는 unsafe 문이 없으며 안전하지 않은
코드에 대한 FFI는 제한적입니다.
Fil-C가 특별한 이유는:
-
Fil-C는 탈출구 없이 완전한 안전성을 달성합니다. Fil-C에는 보호를 끄는 데 사용될 수 있는
unsafe키워드가 없습니다. 안전하지 않은 코드에 대한 링킹은 엄격하게 제한됩니다. -
Fil-C의 capability 기반 접근 방식은 CHERI와 같은 하드웨어 capability와 유사한 수준의 안전성을 달성합니다. 단, 일반 하드웨어(X86_64 또는 ARM64)에서 실행된다는 점이 다릅니다.
-
Fil-C는 메모리 안전 버그를 단순히 버그를 찾을 수 있을 만큼 자주 표시하는 것이 아니라 익스플로잇에 사용되는 것을 방지하도록 설계되었습니다. 이는 Fil-C를 AddressSanitizer, HWAsan, 또는 MTE와 다르게 만듭니다. 이들은 모두 공격자에 의해 우회될 수 있습니다. 이를 가능하게 하는 핵심 차이는 Fil-C가 태그 기반(포인터 접근이 유효한 메모리에 닿으면 허용됨)이 아니라 capability 기반(각 포인터가 접근할 수 있는 메모리 범위와 접근 방법을 알고 있음)이라는 점입니다.
-
언어 사용자 관점에서 Fil-C는 GCC/clang 확장이 있는 그냥 C와 C++입니다. 여러분이 좋아하는 C 또는 C++ 프로그램이나 라이브러리가 Fil-C에서 변경 없이 컴파일될 가능성이 높습니다. Fil-C 컴파일러는 clang 20.1.8을 기반으로 하므로 C17과 C++20을 지원합니다.
라이선스
컴파일러(clang + LLVM)는 LLVM-LICENSE.txt에 의해 보호됩니다. 런타임은 PAS-LICENSE.txt에 의해 보호됩니다(소스 배포판의 libpas/LICENSE.txt 참조). 클래식 musl 기반 Fil-C 배포판의 경우, musl libc는 MUSL-LICENSE.txt에 의해 보호됩니다(소스 배포판의 projects/yolomusl/COPYRIGHT 및 projects/usermusl/COPYRIGHT 참조). /opt/fil 배포판의 경우, glibc는 glibc-LICENSE.txt에 의해 보호되며, 다른 모든 포함된 프로그램은 각각의 -LICENSE.txt 파일에 의해 보호됩니다. C++ 라이브러리(libc++/libc++abi)는 LLVM-LICENSE.txt에 의해 보호됩니다.
컴파일러, 런타임, libc++/libc++abi, libc(musl 및 glibc), 그리고 모든 포함된
프로그램의 소스를 github에서 가져올 수 있습니다.
소스 배포판에는 projects/ 및 pizlix/ 디렉터리에 Fil-C로 포팅된 많은 추가
프로그램도 포함되어 있으며, 이들은 다양한 라이선스를 가지고 있습니다.
/opt/fil 배포판에는 다양한 추가 프로그램의 빌드가 포함되어 있으며, 해당 라이선스는
해당 배포판의 additional-licenses/에 있습니다.
요구 사항
Fil-C는 Linux/X86_64 또는 Linux/ARM64에서만 작동합니다.
이전 버전은 Darwin/ARM64 및 FreeBSD에서 작동했지만, 이제는 libc 구현을 더 충실하게 수행할 수 있기 때문에 Linux에만 집중하고 있습니다. Linux 이외의 다른 아키텍처나 OS에서 Fil-C가 작동하는 것을 근본적으로 막는 것은 없습니다.
시작하기
Fil-C 바이너리를 다운로드했다면 다음을 실행하세요:
./setup.sh
이는 선택한 바이너리 배포판에 따라 다른 효과를 가집니다:
-
클래식 musl 기반 배포판 (
filc-0.684-linux-x86_64.tar.xz또는filc-0.684-linux-aarch64.tar.xz)의 경우, 이는 Fil-C가 현재 디렉터리에서 실행되도록 설정합니다. -
/opt/fil glibc 기반 배포판 (
optfil-0.684-linux-x86_64.tar.xz)의 경우, 이는 Fil-C를/opt/fil에 설정합니다.
Fil-C 소스를 다운로드했다면 다음을 실행하세요:
./build_all_fast.sh
그러면 이 디렉터리 내에서 Fil-C를 사용할 수 있습니다.
Fil-C의 바이너리 배포판은 libc로 musl과 함께 제공됩니다. 소스 배포판에서
./build_all_fast.sh를 사용하면 musl을 사용하여 Fil-C를 빌드합니다.
소스를 사용하는 경우 다음도 가능합니다:
-
./build_all_fast_glibc.sh- libc로 glibc 2.40을 사용하여 유사한 설정을 빌드합니다. -
./build_all.sh- 전체 musl 기반 빌드(Fil-C로 포팅된 많은 소프트웨어도 빌드합니다). -
./build_all_glibc.sh- 전체 glibc 기반 빌드(Fil-C로 포팅된 더 많은 소프트웨어를 빌드합니다). -
cd pizlix && sudo ./build.sh- Pizlix Linux 배포판을 빌드합니다. -
cd optfil && sudo ./build.sh-/opt/fil배포판을 빌드합니다.
작동하는 것들
많은 소프트웨어 패키지가 Fil-C에서 변경 없이 또는 최소한의 변경으로 작동합니다. openssl, CPython, SQLite, 그리고 많은 다른 것들과 같은 큰 것들도 포함됩니다. Fil-C는 완전히 메모리 안전한 Linux 사용자 영역을 지원할 만큼 강력합니다.
Fil-C는 C와 C++에 대한 완전한 지원과 clang 20이 지원하는 거의 모든 확장을 제공합니다. 예를 들어, Fil-C는 atomics와 SIMD intrinsics에 대한 뛰어난 지원을 제공합니다.
Fil-C는 C에서 메모리 안전성을 어렵게 만드는 모든 것들을 잡아냅니다. 예를 들어:
-
힙 또는 스택에서의 범위 초과.
-
Use-after free(힙 또는 스택 모두).
-
포인터와 비포인터 간의 타입 혼동.
-
링킹에서 발생하는 타입 오류.
-
va_lists의 오용에서 발생하는 타입 오류.
-
포인터 경쟁.
-
시스템 호출. 시스템 호출에 전달되는 모든 버퍼는 범위와 타입에 대해 검사됩니다.
-
기타 많은 것들.
Fil-C는 상당히 완전한 POSIX libc와 함께 제공되며, 스레드, 시그널 처리,
mmap/munmap, longjmp/setjmp, C++ 예외와 같은 까다로운 기능도
지원합니다.
더 알아보기
웹사이트를 방문하여 Fil-C에 대해 더 알아볼 수 있습니다.
또한 이메일을 보낼 수 있습니다: [email protected]
Twitter에서 저를 팔로우하세요.
GH에 이슈를 제출하세요.