

We now discuss these properties of boot code, and a path to greater confidence in boot code security. Enhancing confidence in boot code security is a challenge because of unique properties of boot code not found in higher-level software. A key component to ensuring high confidence in data center security is establishing confidence in boot code security. It runs before the operating system’s boot loader that most people are familiar with. We define boot code to be the code in a cloud data center that runs from the moment the power is turned on until the BIOS starts. Redini et al. built a tool called BootStomp on top of angr , a framework for symbolic execution of binaries based on a symbolic execution engine for the VEX intermediate representation for the Valgrind project, resulting in a powerful testing tool for boot code, but it is not sound. Rakamarić and Hu developed a conservative, scalable approach to memory safety in low-level code, but the models there are not tailored to our code that routinely accesses memory by an explicit integer-valued memory address. Dillig et al. synthesize guards ensuring memory safety in low-level code, but our code is written by hand. Klein et al. prove the correctness of the seL4 kernel, but that code was written with the goal of proof.
#POCKET GIRL PRO NUDE MOD SOFTWARE#
Our goal is to make it as easy as possible to use our work, primarily by way of automation.įerreira et al. verify a task scheduler for an operating system, but that is high in the software stack. They support partial linking by concatenating object files and resolving symbols, but fail to make available to their analysis the addresses and constants assigned to symbols in linker scripts, resulting in an imprecise analysis of the code. KLEE and other tools like SMACK based on the LLVM intermediate representation do not currently support the linker scripts that are a crucial part of building boot code (see Sect. Corin and Manzano used KLEE to do taint analysis and prove confidentiality and integrity properties. Davidson et al. built the tool FIE on top of KLEE for detecting bugs in firmware programs for the MSP430 family of microcontrollers for low-power platforms, and applied the tool to nearly a hundred open source firmware programs for nearly a dozen versions of the microcontroller to find bugs like buffer overflow and writing to read-only memory. KLEE is a symbolic execution engine for C that has been used to find bugs in firmware. Thus, memory safety proof techniques based on three-valued logic or separation logic as in or other techniques that focus on the heap are less appropriate since boot code mostly uses simple arrays.

Note that boot code makes heavy use of pointers, bit vectors, and arrays, but not the heap. Our work applies to any sound, bit-precise, automated tool. SATABS , Ufo , Cascade , Blast , CPAchecker , Corral , and others might even enable unbounded verification. BLITZ or F-Soft could be used in place of CBMC. Loops in boot code typically iterate over arrays of known sizes, making it possible to choose loop unwinding limits such that all loop-unwinding assertions hold (see Sect.

CBMC is sound when all loop-unwinding assertions hold. CBMC can check that it is impossible for the loop to iterate more than the specified number of times by checking a loop-unwinding assertion. A user can bound the model checking done by CBMC by specifying for a loop a maximum number of iterations of the loop. It features bit-precise reasoning, and it verifies array bounds (buffer overflows), pointer safety, arithmetic exceptions, and assertions in the code. This makes some form of model checking most appealing.ĬBMC is a bounded model checker for C, C++, and Java programs, available on GitHub .
#POCKET GIRL PRO NUDE MOD FULL#
Furthermore, full automation is essential in our setting to operate in a continuous validation environment. There are many approaches to finding memory safety errors in low-level code, from fuzzing to static analysis to deductive verification .Ī key aspect of our work is soundness and precision in the presence of very low-level details.
