Verifying and Building¶
Verifying¶
One of the main design goals of uberXMHF (pc-legacy-x86_32) is to achieve automated verification while coping with implementation changes as a result of development. The uberXMHF (pc-legacy-x86_32) core provides functionality common to many hypervisor-based security architectures and supports hypapps that augment the core with additional security or functional properties while preserving the fundamental hypervisor security property of memory integrity (i.e., ensuring that the hypervisor’s memory is not modified by software running at a lower privilege level).
We have verified the memory integrity of the uberXMHF (pc-legacy-x86_32) core using a combination of automated and manual techniques. The model checker CBMC is employed for automatic verification. Manual audits apply to a small portion of the code which we anticipate to remain mostly unchanged as development proceeds. The manual audits include constructs that CBMC cannot verify, including loops that iterate over entire page tables, platform hardware initialization and interaction, and concurrent threads coordinating multiple CPUs during initialization that are challenging for current model-checkers. For more details please refer to our 2013 IEEE Security and Privacy paper.
Verification Environment and Tools¶
OS: Ubuntu 10.10, 32-bit; Available here
Verification Tools: CBMC: v4.1 32-bit; Available here
Install using:
sudo dpkg -i cbmc_4.1_i386.deb
How do I verify uberXMHF (pc-legacy-x86_32) and/or a uberapp?¶
Configure and build uberXMHF (pc-legacy-x86_32)/uberapp as described in the Building section below. The following describe the specific steps to verify the uberXMHF (pc-legacy-x86_32) core memory integrity using the example verify uberapp.
Change working directory to the uberXMHF (pc-legacy-x86_32) source tree root.
cd ./xmhf
Generate the ./configure
script.
./autogen.sh
Configure the XMHF verify hypapp.
./configure --with-approot=hypapps/verify
Verify
make verifyall
or
make verify
make verifyall
will perform full verification of the
uberXMHF (pc-legacy-x86_32) core
as well as the uberapp. Subsequently, you can use make verify
to
verify the uberapp assuming there are no further changes to the
uberXMHF (pc-legacy-x86_32) core.
Note that we assume CBMC is sound. i.e., if CBMC reports a successful verification, then uberXMHF (pc-legacy-x86_32)/uberapp preserve memory integrity.
For verification purposes, we also assume that a uberapp built on top
of uberXMHF (pc-legacy-x86_32) uses the prescribed core APIs and that
it does not write to arbitrary
code and data. In fact, these are the only assumptions
required of any new uberapp to ensure the memory integrity
property of uberXMHF (pc-legacy-x86_32).
In the current uberXMHF (pc-legacy-x86_32) implementation, a single
core API function xmhf_memprot_setprot
allows manipulating guest memory protections
via 2nd level hardware page tables.
Building¶
uberXMHF (pc-legacy-x86_32) and uberapps (e.g., TrustVisor, Lockdown) get built in a Linux environment with a recent version of gcc. uberXMHF (pc-legacy-x86_32) has been verified to build on Ubuntu 10, 11, and 12 series, both 32 and 64 bit.
Build tools¶
A (partial) list of packages to install:
aptitude install pbuilder texinfo ruby build-essential autoconf libtool
On 64-bit platforms, you will also need to install 32-bit libraries. On Ubuntu 12:
aptitude install gcc-multilib
High-level Build Summary¶
One “drives” the build from the root directory of uberXMHF (pc-legacy-x86_32):
The interesting high-level build commands include:
./autogen.sh # creates ./configure
./configure # creates Makefile from Makefile.in
make # builds the selected hypapp and the XMHF core
make install # installs binaries
make install-dev # (hypapp specific) installs dev headers and libs
make test # (hypapp specific) runs various automated tests
make clean # cleanup
make htmldoc # generates the HTML documentation you are reading in the `./doc` sub-folder
The functioning of make install-dev
and make test
are
uberapp-specific. For example, in the TrustVisor uberapp, the primary prerequisite
for tee-sdk and PAL development is having successfully run
make install-dev
.
How do I build a uberXMHF (pc-legacy-x86_32) uberapp?¶
The method for building different uberapps (e.g., TrustVisor,
Lockdown) is by specifying which uberapp to build using ./configure
.
The following describes the sequence of steps for building a
uberXMHF (pc-legacy-x86_32) uberapp using the helloworld
uberapp as a running example.
Change working directory to the uberXMHF (pc-legacy-x86_32) root directory.
cd ./xmhf
Generate the ./configure
script.
./autogen.sh
Configure the uberXMHF (pc-legacy-x86_32) uberapp.
./configure --with-approot=hypapps/helloworld
Generate and install the binaries:
make
make install
make install-dev # optional (hypapp-specific)
make test # optional (hypapp-specific)
Note that make install
is only useful if the development system and
the target system (on which uberXMHF (pc-legacy-x86_32) is installed) are
the same. If not,
you will need to manually copy the files ./xmhf/init-x86.bin
and ./xmhf/hypervisor-x86.bin.gz
to the /boot
folder of the
target system (see Installing uberXMHF (pc-legacy-x86_32) ).
Build configuration options¶
- –with-approot=[UBERAPP_PATH], specifies the uberapp source root; must be provided
- –with-target-platform=[PLATFORM], specifies the target platform for the build; optional, current options are: x86pc (x86 hardware virtualized platforms, default)
- –with-target-arch=[ARCH], specifies the target CPU architecture; optional, current options are: x86vmx (Intel, default), x86svm (AMD)
- –disable-drt, disables Dynamic Root-of-Trust (DRT); optional, useful for builds targeting platforms without support for DRT and/or TPM
- –disable-dmap, disables DMA protection; optional, useful for builds targeting platforms without DMA protection capabilities