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

NYX: Greybox Hypervisor Fuzzing using Fast Snapshots and Affine Types

noriwiki
NYX: Greybox Hypervisor Fuzzing using Fast Snapshots and Affine Types
AuthorSergej Schumilo, Cornelius Aschermann, Ali Abbasi, Simon Wörner and Thorsten Holz
Conference30th USENIX Security Symposium
pdfhttps://www.usenix.org/conference/usenixsecurity21/presentation/schumilo
Year2021

개요

Hypervisor fuzzing을 위해서 2020년 시점으로는 Emulating해서 Code coverage를 구하는 방식과, Code covereage는 사용하지 않지만, Black box fuzzing을 하는 방식이 있었다. 그 두방식에 비하여 NYX는 Coverage guided fast snapshot방식의 Fuzzing을 개발하여, 훨씬 좋은 Fuzzing성능을 보일 수 있었다.

Motivation & Importance

기존에는 Hypervisor를 Fuzzing하기 위해서 Black-box에 의존하거나, Emulating을 통한 방법, 혹은 Hypervisor의 Target componenet를 User-level에 Isolation시켜서 작동시키는 방법들이 사용되었지만, 모두 제각기 커버리지에 의존하지 않기 때문에 발생하는 비효율성, 에뮬레이션에 따른 심각한 성능 저하, 그리고 False-positive/negative에 대한 취약성이 단점으로 지적되어 왔다.

이를 해결하기 위해서 Hypervisor를 Emulation없이 Coverage-guided fuzzing하기 위해서는 여러가지 Challenge들이 존재한다.

  1. 우선 Host -> Hypervisor -> Gust Host (Fuzzing Host) -> Gust Hypervisor (Fuzzing Hypversior)로 이어지는 단계가 너무 복잡해서, 이 모든 State들을 어떻게 관리할 것인지에 대한 문제가 생긴다.
  2. Compiler를 통해서 Fuzzing에 대한 Hint들을 코드에 삽입하는 것이 거의 불가능한 경우가 많다.
  3. Deterministic하게 Fuzzing이 잡아낸 버그를 어떻게 Replay할지에 대한 문제가 생긴다.

이 문제들을 어떻게 해결할 것인가?

Main Idea

Stable and Determinstic Fuzzing
KVM VM에서 Hypervisor를 돌리기 떄문에, Crash가 나도 안정적으로 원래의 State를 복구 할 수 있다. 복구를 빠르게 하기 위해서 Dirty page를 우선 Dirty한 Frame을 Page Modification Logging(PML)이라는 기술을 사용해서 Logging하고 Dirty page들을 빠르게 원래 상태로 복구하는 방식을 통해서 Checkpoint-and-restore기법을 적용할 수 있었다. 또한 Hypervisor안에서 작동하는 OS를 Fuzzing에 최적화된 HYPER-CUBE OS라는 Gust를 돌림으로써, Host hypervisor와 Hypercall로 State를 넘기는 것과 같은 Optimization이 가능하게 하였다.
Generic Fuzzing of Interactive Targets
NYX는 Bytecode-like포맷으로 Fuzzer의 Input을 정의하였다. 기존의 랜덤 생성, 단순 Bytecode변의 혹은 CFG를 이용한 Grammar context generator와 비교하여, NYX는 Bytecode-like liek spec을 정의한 다음 Input을 변조하여 유효한 State flow와 Dependencies들을 포함한 Input을 생성할 수 있기 떄문에, 실행 성공률과 취약점을 트리거할 확율을 높일 수 있었다.
Bytecode-like spec은 다음과 같이 Affine type을 이용하여 정의하였다. Affine type specification은 Input을 Value혹은 Reference로 전달할 수 있으며, 값으로 전달한 항목은 Consume되어서 이후에 사용할 수 없었따. DAG의 형식으로 Input이 표현되기 때문에, 각 노드는 함수 호출을, 간선은 그 호출이 반환한 타입화된 값을 전달한다. 노드별로 트리형태의 Argument를 허용하여, 변조할 수 있도록 하였고, 사용자는 바이트코드 사양에서 각 노드의 동작으로 정의하여 Create, Use, Delete, and Do-not-reuse의 관계를 표현하도록 하였다.

Conclusion

매우 Impressive한 Implementation과 Design이었으며, Fuzzing optimization에 관련된 논문이지만 Virtualization Design이라고 보아도 될 만큼 Detail하면서도 Novel한 Design concept들이 흥미로웠다.