mirror of
https://git.proxmox.com/git/grub2
synced 2025-07-22 18:01:50 +00:00
![]() The grub_printf_fmt_check() function parses the arguments of an untrusted printf() format and an expected printf() format and then compares the arguments counts and arguments types. The arguments count in the untrusted format string must be less or equal to the arguments count in the expected format string and both arguments types must match. To do this the parse_printf_arg_fmt() helper function is extended in the following way: 1. Add a return value to report errors to the grub_printf_fmt_check(). 2. Add the fmt_check argument to enable stricter format verification: - the function expects that arguments definitions are always terminated by a supported conversion specifier. - positional parameters, "$", are not allowed, as they cannot be validated correctly with the current implementation. For example "%s%1$d" would assign the first args entry twice while leaving the second one unchanged. - Return an error if preallocated space in args is too small and allocation fails for the needed size. The grub_printf_fmt_check() should verify all arguments. So, if validation is not possible for any reason it should return an error. This also adds a case entry to handle "%%", which is the escape sequence to print "%" character. 3. Add the max_args argument to check for the maximum allowed arguments count in a printf() string. This should be set to the arguments count of the expected format. Then the parse_printf_arg_fmt() function will return an error if the arguments count is exceeded. The two additional arguments allow us to use parse_printf_arg_fmt() in printf() and grub_printf_fmt_check() calls. When parse_printf_arg_fmt() is used by grub_printf_fmt_check() the function parse user provided untrusted format string too. So, in that case it is better to be too strict than too lenient. Signed-off-by: Thomas Frauendorfer | Miray Software <tf@miray.de> Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com> |
||
---|---|---|
.. | ||
arm | ||
arm64 | ||
coreboot | ||
efi | ||
emu | ||
generic | ||
i386 | ||
ia64 | ||
ieee1275 | ||
mips | ||
powerpc | ||
riscv | ||
sparc64 | ||
uboot | ||
x86_64 | ||
xen | ||
acpi.c | ||
buffer.c | ||
command.c | ||
compiler-rt.c | ||
corecmd.c | ||
device.c | ||
disk_common.c | ||
disk.c | ||
dl.c | ||
elf.c | ||
elfXX.c | ||
env.c | ||
err.c | ||
file.c | ||
fs.c | ||
list.c | ||
lockdown.c | ||
main.c | ||
misc.c | ||
mm.c | ||
parser.c | ||
partition.c | ||
rescue_parser.c | ||
rescue_reader.c | ||
term.c | ||
time.c | ||
verifiers.c | ||
vga_init.c |