Bug#924792: pidof: unsanitized user input makes pidof crash

Matteo Croce mcroce at redhat.com
Mon Mar 18 00:09:32 GMT 2019


> This is a good find and I see two fairly straight forward ways to deal
> with the bug:
> 
> 1. We can drop the new -f flag. This is a little inconvenient for some
> users, but immediately plugs the hole.
> 

That's an option, even if it would break existing scripts which use -f,
if any. Probably worth applying to plug the hole immediately, yes.

> 2. We can write our own print function that will not crash or give
> weird behaviour the way printf() does. Right now I'm leaning toward
> the latter option. It's a little more work, but probably a nicer fix
> for everyone in the long run.
> 

I fear that it's much more that little work. Probably it's easier to
just sanitize the input.
The following code forbids strings containing "%s" or two "%", yet
allowing "%%" which is a valid escape to print a percent sign.

int unsafe_str(char *str)
{
	int found = 0;
	char *ptr = str;

	while ((ptr = index(ptr, '%'))) {
		if (ptr[1] == 's')
			return 1;
		if (ptr[1] == '%') {
			ptr += 2;
			continue;
		}
		if (found)
			return 1;
		found = 1;
		ptr++;
	}

	return 0;
}

The sanitizer is incomplete tough, the error can still be exploited by
adding a modifier to "%s" (like "% s" or "%.*s"), or using the
Single UNIX Specification syntax wich allows to pick the
Nth argument with %Nd, like "%1000000$d".

Regards,
-- 
Matteo Croce
per aspera ad upstream




More information about the Debian-init-diversity mailing list