
Windows 및 UEFI용 최소한의 Intel VT-x 하이퍼바이저로, 라이브 호스트를 가상화하여 인트로스펙션을 수행하며, 동적 하이퍼재킹, 언하이퍼재킹, EPT, VPID를 지원합니다.
SimpleVisor는 간단하고 이식성이 뛰어난 Intel x64/EM64T VT-x 전용 하이퍼바이저로, 두 가지 구체적인 목표를 가지고 있습니다. 바로 최소한의 어셈블리 코드(10줄)를 사용하고, 동적 하이퍼재킹 및 언하이퍼재킹(즉, 호스트 내부에서 호스트 상태를 가상화하는 것)을 지원하기 위한 VMX 관련 코드를 최소한으로 유지하면서 EPT와 VPID 같은 고급 기능도 지원하는 것입니다. 현재 Windows와 UEFI 환경 모두에서 실행됩니다.
하이퍼바이저를 어떻게 만드는지 항상 궁금했던 적이 있으신가요? Intel의 문서(수백 페이지에 달하는)에 지치셨나요? 온라인에서 찾은 샘플들이 오히려 더 혼란스럽게 만들거나, 수만 줄의 코드를 몇 주 동안 읽어야 했나요? 그렇다면 SimpleVisor가 바로 여러분을 위한 프로젝트일 수 있습니다.
모든 코드 한 줄 한 줄을 설명하는 방대한 주석과 Windows 관련 또는 Intel 관련 특이 사항을 제외하면, SimpleVisor는 약 500줄의 C 코드와 10줄의 x64 어셈블리 코드로 구성되어 있으며, 최신 64비트 Windows 버전 모두에서 실행될 수 있고 런타임에 동적 로드/언로드도 지원합니다.
또한 SimpleVisor는 Windows 전용 기능을 위한 경량 OS 라이브러리를 활용하여 하이퍼바이저 부분과 Windows 전용 부분을 분리합니다. 이러한 이식성 있는 설계를 활용하여 UEFI 버전의 SimpleVisor도 이제 사용할 수 있습니다. 다만 UEFI의 문제로 인해 MP 환경을 견고하게 지원하지는 못하며, 운영 체제를 로드하면 프로세서 리소스를 재구성하면서 구현되지 않은 코드 경로에 도달하여 결국 충돌이 발생한다는 점에 유의하세요. UEFI에서 운영 체제의 전체 부팅을 가상화하는 것은 이 프로젝트의 범위를 벗어납니다.
SimpleVisor는 Visual Studio 2015 Update 3으로 빌드할 수 있으며, 구버전/신버전 컴파일러는 테스트되지 않았고 지원되지 않지만, 아마 빌드가 가능할 것입니다. 다만 다양한 컴파일러 및 링커 설정은 보이는 그대로 유지하는 것이 중요합니다.
SimpleVisor는 현재 다음 플랫폼에서 성공적으로 테스트되었습니다:
현재 Bochs에서는 테스트되지 않았지만, SimpleVisor가 그러한 환경에서도 실행되지 못할 이유는 없습니다. 다만 여러분의 머신이 이미 Hyper-V나 Xen 같은 하이퍼바이저 아래에서 실행 중이라면 SimpleVisor는 로드되지 않습니다.
x86 버전의 Windows는 명시적으로 지원되지 않으며, Nehalem 마이크로아키텍처 이전의 프로세서와 Windows 7도 지원되지 않는다는 점을 명심하세요. 후자의 두 가지에 대한 지원은 추가하기 쉬우며 일부 포크에 존재합니다.
세상에는 지나치게 복잡하거나(Xen, KVM, VirtualBox) 폐쇄 소스인(VMware, Hyper-V) 하이퍼바이저 프로젝트가 너무 많으며, Linux 기반 개발이나 시스템에 과도하게 집중되어 있습니다. 또한 (Hyper-V를 제외한) 대부분은 가상 머신의 실행을 가능하게 하는 목적으로 명시적으로 만들어졌으며, 실행 중인 라이브 시스템을 가상화하여 그에 대한 인트로스펙션이나 기타 보안 관련 작업을 수행하기 위한 것이 아닙니다.
하지만 Joanna의 원조 Blue Pill이나 VirtDbg, HyperDbg 같은 몇몇 프로젝트는 눈에 띕니다. 안타깝게도 이들 대부분은 이제 상당히 오래되었고, 일부는 x86 프로세서에서만 작동하며 Windows 10 같은 최신 운영 체제를 지원하지 않습니다. Blue Pill과 몇 가지 측면에서 유사하지만 "Split-TLB"를 위한 EPT 사용의 좋은 예를 실제로 제공하는 또 다른 다소 간단한 예는 Jacob Torrey/AIS의 MoRE입니다.
Windows 중심의 현대적이고 지원되는 하이퍼바이저를 실제로 제공하는 가장 가까운 프로젝트는 HyperPlatform이며, 우리는 더 폭넓게 사용 가능한 연구형 하이퍼바이저 개발의 출발점으로 그 사용을 강력히 권장합니다. 그러나 더 폭넓게 견고한 범용 "플랫폼"을 만들려는 시도에서 HyperPlatform은 약간의 비대함도 겪고 있어, 하이퍼바이저의 진정한 기본 요구 사항이 무엇이고 어떻게 초기화하는지 이해하기 어렵게 만듭니다. 비슷한 맥락에서 STL/C++에 대한 동등한 애정을 보여주면서도 ELF 로더와 UEFI/Linux 지원, 유닛 테스트, 그리고 훨씬 더 많은 견고함까지 포함하는 것은 역시 AIS의 Bareflank입니다. 그 이상은 아마 Xen 수준의 복잡성으로 들어가게 될 것입니다.
위에서 언급했듯이 이 프로젝트의 명시적 목표는 부정적인 부작용을 일으키지 않으면서 가능한 모든 방법으로 코드를 최소화하고 '베어메탈' 요구 사항에 집중하는 것이었습니다. 여기에는 다음이 포함됩니다:
또 다른 암묵적 목표는 Bochs조차 항상 최신 Intel VMX 명령어 및/또는 정의를 가지고 있지 않기 때문에 최신 하드웨어 기능을 지원하는 것이었습니다. 이들은 종종 다양한 프로젝트가 다양한 수준의 정의를 가진 "vmcs.h"와 "vmx.h" 같은 헤더 파일에서 발견됩니다. 예를 들어 Xen master에는 일부 미출시 VM Exit 이유가 있지만 특정 출시된 이유는 없으며, Bochs에는 그것이 있지만 미출시된 것은 없습니다! 한 가지 예로 1GB EPT 엔트리의 사용이 있는데, 예를 들어 VMWare는 이를 올바르게 가상화하지 못합니다.
마지막으로 SimpleVisor는 교육용 도구로 만들어졌습니다. 각 코드 줄 뒤의 모든 로직과 원하는 결과를 달성할 수 있게 해주는 특정 Windows 또는 Intel VMX 팁과 트릭을 설명하는 방대한 주석이 있습니다. 다양한 버그나 제대로 문서화되지 않은 동작이 명시적으로 지적됩니다.
x64 Windows는 모든 드라이버가 서명되어야 하므로 SimpleVisor 바이너리를 테스트 서명해야 합니다. Visual Studio 프로젝트 파일은 "Driver Signing" 옵션을 사용하고 자신의 인증서로 "Test Sign"을 활성화하여 이를 수행하도록 설정할 수 있습니다. UI에서 직접 자신의 인증서를 생성할 수도 있습니다.
둘째, 머신에서 Test Signing Mode를 활성화해야 합니다. 그러려면 먼저 UEFI로 부팅하여 "Secure Boot"를 꺼야 합니다. 그렇지 않으면 Test Signing 모드를 활성화할 수 없습니다. 또는 유효한 KMCS 인증서가 있다면 이 요구 사항을 피하기 위해 드라이버를 "Production Sign"할 수 있습니다.
Test Signing Mode를 설정하려면 다음 명령을 사용할 수 있습니다:
bcdedit /set testsigning on
재부팅 후 다음 명령으로 레지스트리에 SimpleVisor에 필요한 Service Control Manager 항목을 설정할 수 있습니다:
sc create simplevisor type= kernel binPath= "<PATH_TO_SIMPLEVISOR.SYS>"
그런 다음 다음 명령으로 SimpleVisor를 실행할 수 있습니다
sc start simplevisor
그리고 다음 명령으로 중지할 수 있습니다
sc stop simplevisor
이 명령들 중 어느 것을 사용하든 관리자 권한이 필요합니다.
제 연구나 작업에 대해 더 알고 싶으시다면, 제 블로그 http://www.alex-ionescu.com 와 제 교육 및 컨설팅 회사인 Winsider Seminars & Solutions Inc.(http://www.windows-internals.com)를 방문해 보시기 바랍니다.
https://github.com/upring/virtdbg
http://xenbits.xen.org/gitweb/?p=xen.git;a=summary
https://github.com/svn2github/bochs
https://github.com/rmusser01/hyperdbg
http://invisiblethingslab.com/resources/bh07/nbp-0.32-public.zip
https://github.com/tandasat/HyperPlatform
https://github.com/ainfosec/MoRE
https://github.com/Bareflank/hypervisor
SimpleVisor는 코드 크기와 복잡성을 최소화하도록 설계되었습니다. 이는 견고함을 희생하는 대가를 치릅니다. 예를 들어, SimpleVisor가 수행하는 많은 VMX 작업이 "절대" 실패하지 않아야 하지만, 메모리 손상, CPU 에라타, 잘못된 호스트 OS 상태, 잠재적 버그 등 알 수 없는 이유로 인해 특정 작업이 실패할 수 있습니다. 진정으로 견고한 상용 등급 소프트웨어의 경우 이러한 가능성을 고려해야 하며, 이를 지원하기 위해 오류 처리, 예외 처리, 검사를 추가해야 합니다. 또한 세상에 존재하는 방대한 BIOS와 다양한 CPU 및 칩셋 반복 버전은 각각 확인해야 하는 특정 비호환성이나 우회 방법을 가질 수 있습니다. SimpleVisor는 그러한 오류 검사, 검증, 예외 처리를 전혀 수행하지 않습니다. 이는 프로덕션 용도로 설계된 견고한 소프트웨어가 아니라 참조 코드 베이스입니다.
Copyright 2016 Alex Ionescu. All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided
that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this list of conditions and
the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions
and the following disclaimer in the documentation and/or other materials provided with the
distribution.
THIS SOFTWARE IS PROVIDED BY ALEX IONESCU ``AS IS'' AND ANY EXPRESS OR IMPLIED
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ALEX IONESCU
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
The views and conclusions contained in the software and documentation are those of the authors and
should not be interpreted as representing official policies, either expressed or implied, of Alex Ionescu.