메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

Toss a Fault to BpfChecker: Revealing Implementation Flaws for eBPF runtimes with Differential Fuzzing

noriwiki
Ahn9807 (토론 | 기여)님의 2025년 9월 22일 (월) 18:15 판 (새 문서: {{Paper|title=Toss a Fault to BpfChecker: Revealing Implementation Flaws for eBPF runtimes with Differential Fuzzing|author=Chaoyuan Peng, Muhui Jiang, Lei Wu, Yajin Zhou|conference=CCS|year=2024}} == 개요 == BPFChecker는 Differential fuzzing을 사용하여서, eBPF runtime의 오류를 찾아내는 Fuzzing기법을 개발하였다. == Motivatioin & Implementation == eBPF버그는 시스템에 Critical한 영향을 미치기에 Verifier에 대한 Fuzzing은 많이...)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)
Toss a Fault to BpfChecker: Revealing Implementation Flaws for eBPF runtimes with Differential Fuzzing
AuthorChaoyuan Peng, Muhui Jiang, Lei Wu, Yajin Zhou
ConferenceCCS
Year2024



개요

BPFChecker는 Differential fuzzing을 사용하여서, eBPF runtime의 오류를 찾아내는 Fuzzing기법을 개발하였다.

Motivatioin & Implementation

eBPF버그는 시스템에 Critical한 영향을 미치기에 Verifier에 대한 Fuzzing은 많이 이루어져 왔었다. 그러나 eBPF Runtime, i.e., JIT-Compiler, 와 같은 Componenet에 대한 실험들은 충분히 이루어지지 못하였다. 이 논문은 이러한 eBPF Runtime에 대한 Fuzzing을 하기 위한 논문이다.

그러나 Runtime이 잘못 작동하고 있는지 테스트하는 것은 매우 어려운 일이다. 왜냐하면 기존의 ASAN을 사용해서 Memory fault를 찾고자 하는 방법이 보통 Runtime의 암묵적인 버그를 검사하지 못하기 떄문이다. 예를 들어서 JIT-Compiler라 Signed operation을 Unsigned operation으로 생성해 낼 경우, 만약 이 버그가 Memory bug를 일으키지 않으면 Detection이 되지 않는 것이다.

기존 방식은 다음과 같은 문제가 있었다.

  1. 보통 Memory safety 버그만 Detection 한다
  2. Domain-specific한 correctness oracle을 담고 있는 Bug를 잡지 못한다. (Register state와 관련된 버그를 잡지 못한다)
  3. Coverage기반의 방식이기 때문에, 생성된 eBPF프로그램이 그럴듯한지 보장하지 못한다.

Main Design Idea

eBPF의 Runtime을 Modeling하여서 Differential testing을 이용하여, 결과 값을 비교, 제대로 된 결과를 내보내고 있는지 확인한다.

Design

Constraint-based Test Case Generator
기존의 LLVM IR은 무거워서 서로다른 eBPF Runtime을 위한 Customization에 큰 Engineering efforts가 소요된다. 이를 위해서 basic block중심의 경량 eBPF 전용 IR을 개발하였다. 또한 Opcodes, Registers, Helper function arguments와 같이 eBPF에서 사용되는 변수들의 Constraints를 분석하고 이에 맞는 eBPF Program을 생성하도록 하였다.
Semantic IR Corrector
Constraint-based Test Case Generator에 의해서 생성된 eBPF Program은 Syntax는 올바르지만 Semantic이 틀릴 수 있다. 이 경우 Verifier는 유용한 에러 메시지를 출력하는데, 이 정보를 이용해서 어디서 에러를 일으켰는지 프로그램의 라인정보를 알 수 있다. 이 에러의 타입에 따라서 미리 정의된 Mutator를 호출해서 에러를 수정하도록 하였다. 수정되는 에러는 Memory safety violation, Division by zero violation이 있다. 또한 이 두경우가 아닌 경우에는 랜덤한 Operation으로 바꾸도록 하였다.
Differential Testing Engine
서로 다른 eBPF Runtime을 사용해서 Generating된 코드를 실행시켰다. 만약 코드 실행의 결과가 Runtime에 상관없이 같다면, 올바른 결과이지만, 만약 다르다면 누군가는 잘못된 Code를 Generating한 것이다.

Conclusion

이 논문은 eBPF에 차등 퍼징(differential fuzzing)을 적용하여 좋은 결과를 얻었다. 비록 이 설계 접근법이 흔히 사용되는 것이지만, 이를 eBPF에 적용할 때 반드시 고려해야 하는 측면들을 분명하게 제시하였다.