Perform load_image on initrd to hopefully verify signatures
This commit is contained in:
parent
568fe1d499
commit
fe3d4015ba
|
@ -11,6 +11,7 @@ use uefi::{
|
|||
media::file::RegularFile,
|
||||
Protocol,
|
||||
},
|
||||
table::boot::LoadImageSource,
|
||||
unsafe_guid, Handle, Identify, Result, ResultExt, Status,
|
||||
};
|
||||
|
||||
|
@ -123,6 +124,8 @@ pub struct InitrdLoader {
|
|||
|
||||
/// Returns the data range of the initrd in the PE binary.
|
||||
fn initrd_location(initrd_efi: &mut RegularFile) -> Result<Range<usize>> {
|
||||
initrd_efi.set_position(0)?;
|
||||
|
||||
let file_data = read_all(initrd_efi)?;
|
||||
let pe_binary = goblin::pe::PE::parse(&file_data).map_err(|_| Status::INVALID_PARAMETER)?;
|
||||
|
||||
|
@ -142,13 +145,36 @@ fn initrd_location(initrd_efi: &mut RegularFile) -> Result<Range<usize>> {
|
|||
.ok_or(Status::END_OF_FILE.into())
|
||||
}
|
||||
|
||||
fn initrd_verify(boot_services: &BootServices, initrd_efi: &mut RegularFile) -> Result<()> {
|
||||
initrd_efi.set_position(0)?;
|
||||
let file_data = read_all(initrd_efi)?;
|
||||
|
||||
let initrd_handle = boot_services.load_image(
|
||||
boot_services.image_handle(),
|
||||
LoadImageSource::FromBuffer {
|
||||
buffer: &file_data,
|
||||
file_path: None,
|
||||
},
|
||||
)?;
|
||||
|
||||
// If we get here, the security policy allowed loading the
|
||||
// image. This means that it was signed with an acceptable key in
|
||||
// the Secure Boot scenario.
|
||||
|
||||
boot_services.unload_image(initrd_handle)?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
impl InitrdLoader {
|
||||
pub fn new(
|
||||
boot_services: &BootServices,
|
||||
handle: Handle,
|
||||
mut file: RegularFile,
|
||||
) -> Result<Self> {
|
||||
let range = initrd_location(&mut file)?;
|
||||
initrd_verify(boot_services, &mut file).unwrap();
|
||||
|
||||
let range = initrd_location(&mut file).unwrap();
|
||||
let mut proto = Box::pin(LoadFile2Protocol {
|
||||
load_file: raw_load_file,
|
||||
file,
|
||||
|
|
Loading…
Reference in New Issue