Skip to main content
QUICK REVIEW

[논문 리뷰] Verified Low-Level Programming Embedded in F*

Jonathan Protzenko, Jean-Karim Zinzindohoué|arXiv (Cornell University)|2017. 02. 28.
Security and Verification in Computing참고 문헌 43인용 수 10
한 줄 요약

이 논문은 F∗에 내장된 검증된 저수준 프로그래밍 언어인 Low∗을 제안한다. Low∗는 형식적 검증을 통해 효율적이고 메모리 안전한 시스템 프로그래밍을 가능하게 하며, F∗의 종속형태(type)와 검증 기능을 컴파일러 스타일의 메모리 모델과 융합하여 효율적이고 측면 채널에 저항하는 C 코드로 컴파일된다. 이로 인해 검증되지 않은 C 라이브러리와 경쟁 가능한 성능을 달성하면서도 기계로 검증된 증명을 통해 정확성과 보안을 보장한다.

ABSTRACT

We present Low*, a language for low-level programming and verification, and its application to high-assurance optimized cryptographic libraries. Low* is a shallow embedding of a small, sequential, well-behaved subset of C in F*, a dependently-typed variant of ML aimed at program verification. Departing from ML, Low* does not involve any garbage collection or implicit heap allocation; instead, it has a structured memory model à la CompCert, and it provides the control required for writing efficient low-level security-critical code. By virtue of typing, any Low* program is memory safe. In addition, the programmer can make full use of the verification power of F* to write high-level specifications and verify the functional correctness of Low* code using a combination of SMT automation and sophisticated manual proofs. At extraction time, specifications and proofs are erased, and the remaining code enjoys a predictable translation to C. We prove that this translation preserves semantics and side-channel resistance. We provide a new compiler back-end from Low* to C and, to evaluate our approach, we implement and verify various cryptographic algorithms, constructions, and tools for a total of about 28,000 lines of code, specification and proof. We show that our Low* code delivers performance competitive with existing (unverified) C cryptographic libraries, suggesting our approach may be applicable to larger-scale low-level software.

연구 동기 및 목표

  • 고수준의 형식적 검증 코드와 저수준의 고성능 시스템 코드 사이의 격차를 메우기 위해.
  • 버퍼 오버플로우와 같은 메모리 안전성 위반으로 인한 암호 소프트웨어의 보안 취약점을 해결하기 위해.
  • 검증된 C 코드와 유사한 성능을 갖는 암호 알고리즘의 효율적이고 검증된 구현을 가능하게 하기 위해.
  • 고수준 사양에서 효율적이고 안전한 C 코드로의 검증된 컴파일링 파이프라인을 제공하기 위해.

제안 방법

  • CompCert에 영감을 받은 구조적 메모리 모델을 사용한 얕은 통합(shallow embedding)을 통해 F∗에 C 유사 저수준 하위집합을 통합하기 위해.
  • F∗의 종속형태와 정밀 타입(refinement types)을 사용하여 정확한 사양을 표현하고 기능적 정확성과 메모리 안전성을 증명하기 위해.
  • Low∗ 코드를 효율적이고 예측 가능한 C 코드로 변환하기 위한 맞춤형 컴파일러 백엔드인 KreMLin을 구현하기 위해.
  • 추출 시 증명과 사양을 제거하여 최적화된, 생산용으로 사용 가능한 C 코드를 생성하기 위해.
  • 컴파일 과정과 메모리 모델의 형식적 검증을 통해 측면 채널 저항성을 확보하기 위해.
  • FFI를 통한 F∗ 프로그램과의 통합을 통해 고성능이고 검증된 시스템을 구축할 수 있도록 하기 위해.

실험 결과

연구 질문

  • RQ1F∗와 같은 고수준의 형식적 검증 언어에 메모리 안전성과 정확성을 유지하면서도 효율적인 시스템 프로그래밍을 가능하게 하는 저수준 하위집합을 확장할 수 있는가?
  • RQ2원시 메모리와 포인터를 다루는 저수준 코드에서 메모리 안전성과 측면 채널 저항성을 어떻게 형식적으로 검증할 수 있는가?
  • RQ3검증된 저수준 코드가 기존 검증되지 않은 C 라이브러리의 성능과 경쟁 가능한가?
  • RQ4F∗에서 얕은 통합을 사용하여 검증되고 효율적이며 이식 가능한 저수준 프로그래밍 언어를 구축할 수 있는가?
  • RQ5형식적 검증과 컴파일링을 어떻게 융합하여 고수준 사양에서 안전하고 고성능의 시스템 코드를 생성할 수 있는가?

주요 결과

  • F∗의 타입 시스템과 구조적 메모리 모델 덕분에 Low∗ 프로그램은 구축 과정에서 메모리 안전성이 보장된다.
  • Low∗에서 C로의 컴파일 파이프라인은 기능적 정확성과 측면 채널 저항성을 모두 유지하며, 이는 형식적으로 증명되었다.
  • Low∗가 생성한 C 코드의 성능은 기존 검증되지 않은 C 암호 라이브러리와 유사한 실행 시간을 기록하여 경쟁 가능하다.
  • FFI를 통한 F∗ 프로그램과의 통합을 통해 검증된 구성 요소들로 고속이고 검증된 시스템을 구축할 수 있다.
  • 사양과 증명을 포함한 28,000줄의 코드를 구현한 결과, 이 접근법이 실제 암호 시스템에까지 확장 가능한 것을 입증했다.
  • KreMLin을 백엔드 컴파일러로 사용함으로써 예측 가능하고 효율적인 C 코드 생성과 함께 형식적 보장을 달성할 수 있었다.

더 나은 연구,지금 바로 시작하세요

논문 읽기부터 검토까지, 연구 시간을 획기적으로 줄여보세요.

카드 등록 없음 · 무료 플랜 제공

이 리뷰는 AI가 만들고, 인간 에디터가 검토했습니다.