2014-10-10 09:04:10 -0600, Eric Blake:
> On 10/10/2014 08:55 AM, Stephane Chazelas wrote:
> 
> > But I can't see why the content of a variable should be
> > interpreted as anything else than an arithmetic expression just
> > because it's in an array subscript.
> 
> For the record, there are vulnerable shell scripts in the wild that fail
> to sanitize their inputs before passing it through arithmetic expansion,
> all because MULTIPLE shells (bash, ksh, mksh, zsh) all have the same
> semantic decision of performing command substitution as part of
> arithmetic expansion.  For example:
> 
> $ /usr/sbin/fsadm -n resize /dev/sdb '0+x[`id >/dev/tty`]T'
> 
> demonstrates that fsadm is vulnerable for trying to do $(($1)) without
> sanitizing $1 first.
[...]

In this case though, it would still be vulnerable with a
strictly POSIX shell as with

/usr/sbin/fsadm -n resize /dev/sdb 'PATH=1'

The evaluation of $(($1)) when $1 is 'PATH=1' is required to
assign 1 to PATH.

What is unspecified by POSIX is:

var=PATH=1; : $((var))

so changing the shell so it no longer does assignments and other
expansions upon indirect/nested/recursive arithmetic evaluation
would not break POSIX compliance (so could be done by
ksh/bash/zsh when invoked as sh), but you'd still have a problem
if you did:

var=PATH=1; : $(($var))

But at least in that case, it's more obvious that you need to
sanitize the input.

-- 
Stephane



Reply via email to