NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: bin/59836: 11.0_BETA: resolvconf fails with 'eval: make_vars: IP_OF_2ND_DNS: not found' for more than 1 dns server
The following reply was made to PR bin/59836; it has been noted by GNATS.
From: Henryk Paluch <hpaluch%seznam.cz@localhost>
To: gnats-bugs%netbsd.org@localhost
Cc:
Subject: Re: bin/59836: 11.0_BETA: resolvconf fails with 'eval: make_vars:
IP_OF_2ND_DNS: not found' for more than 1 dns server
Date: Thu, 18 Dec 2025 13:26:13 +0100
And here it comes...
===
https://www.freebsd.org/security/advisories/FreeBSD-SA-25:12.rtsold.asc
resolvconf(8) is a shell script which does not validate its input. A
lack of
quoting meant that shell commands pass as input to resolvconf(8) may be
executed.
===
So my complains on resolvconf(8) security are not as baseless as many
people wish...
On 12/17/25 01:32, Robert Elz wrote:
> Date: Tue, 16 Dec 2025 07:01:32 +0100
> From: Henryk Paluch <hpaluch%seznam.cz@localhost>
> Message-ID: <37b539e1-f624-4b10-9a90-c55181758b3f%seznam.cz@localhost>
>
> | Still, it is bad security practice to pass variable(s) in format string.
>
> Variables that contain unknown data, yes, it is.
>
> But you still seem to be missing the point. That is not what was
> happening here, the format string contained (contains) no variables
> at all.
>
> Consider this example
>
> printf '$(cat /dev/tty)\n'
>
> What that writes out is (literally)
>
> $(cat /dev/tty)
>
> (including a newline of course). There is no command substitution, no
> commands run, no reference to any device, just a string of characters
> written to standard output.
>
> That the string happens to look like a command substitution (in this
> case) or a variable reference (in the resolvconf case) makes no
> difference to anything, it is just a string of characters.
>
> Once again, in sh, NOTHING inside a single quoted string is interpreted
> by the shell in any way at all. That includes dollar signs, double quotes,
> backslashes, grave accents (backticks), braces, ... the only character the
> shell looks for in a single quoted string is the next single quote, which
> ends the thing. And that is what the format string given used, just like
> the example above.
>
> The format string for printf should usually (when it needs any quoting)
> be quoted using single quotes -- except in the very rare case when var
> references ae actually needed there - which, if you want to be portable,
> can be needed if, for example, the script wants to calculate field
> widths, you might have a loop calculating the width needed something
> like:
>
> W=0
> for X
> do
> if [ "${#X}" -gt "$W" ]
> then
> W=${#X}
> fi
> done
> W=$(( W + 1 )) # One more than the longest
>
> for X
> do
> printf "%-${W}s [other stuff]\n" "$X" [other args]
> done
>
> In our printf (and many others) you might instead do
>
> printf '%-*s [other stuff]\n' "$W" "$X" [other args]
>
> but support for '*' as the field width (or precision), isn't required
> by POSIX, precisely because the version with the embedded $W reference
> is possible (and perfectly safe - we know what kind of data must be in $W,
> it has to be a number, and nothing else.)
>
>
>
> | # TODO: properly quote $NAMESERVER content to avoid '"' escape in eval,
> | etc.:
> | printf 'NAMESERVERS="%s" %s\n' "$(some_quote $NAMESERVERS)" "$(quote "$ns")"
>
> No it wouldn't, that's using the value of $NAMESERVERS (and quoting it
> however the fictional some_quote function does it, which is irrelevant
> here) which the original does not do. It didn't, even in its earlier
> incarnations. The *only* variable expansion is of $ns. The one in
> resolvconf writes the characters dollar, N, A, M, E, S, E, ... where
> you think it is writing the value of a variable. I thought that was
> clear from my previous reply.
>
> | Or using echo which is immune to such things
>
> echo is close to useless in portable programs. There are versions
> of it which treat \ in the string (anywhere, the only way to prevent it
> is to use \\, and if we're assuming user data, we cannot assume that)
> to cause strange variations, and since this output is to be interpreted
> by a shell later, as commands (I presume), allowing a \n to get in there
> possibly followed by "rm -fr / &" and another newline after that, would
> be nasty indeed. echo is never better than printf (just sometimes it
> is quicker to type, echo is a shorter word than printf, and doesn't need
> a format string arg, so lazy script writers tend to use it (and of
> course it was around for many years before printf was, but by comparison
> with how long printf has been available now, that's almost irrelevant.)
>
> Original Bell labs echo doesn't do that, and BSD echo doesn't do that,
> but Sys V (and POSIX) versions of echo do - even though these days POSIX
> says that if the string starts with a '-' or contains a \ then the
> results are unspecified (which is no help to us, or anyone, at all.)
>
> | Additionally running whole output of make_vars using eval as root is
> | security nightmare on its own - because if any part of make_vars output
> | does not properly sanitize all content it may lead to root execution
> | exploit in future.
>
> This one I can't comment on, as I have no idea what the relevance is
> to the issue, nor what might be doing something like that, nor why.
>
> kre
>
Home |
Main Index |
Thread Index |
Old Index