>2020-02-03 12:40:45 +0100, Joerg Schilling:
>[...]
>> > It looks like it's caused by an "optimisation" in its
>> > libc:exec*(), so /usr/xpg4/bin/sh and POSIX are not to blame
>> > after all.
>> 
>> To which Solaris version does this apply?
>
>That was 11.4

Yes.

>> > $ ksh -c 'printf %d 1+1'
>> > printf: 1+1 not completely converted
>> 
>> This is the correct expected output for /usr/bin/printf
>
>Yes, that's the point, /usr/bin/printf was called instead of ksh
>(ksh93 here) and its builtin.
>
>> > What? ksh's printf does take arithmetic expressions as arguments
>> > for %d.
>> >
>> > $ ksh -c 'printf %d 1+1;'
>> > 2
>> > $ ksh -c 'printf %d 1+1' ksh
>> > 2
>> >
>> > Adding that ; special shell character or an extra argument
>> > disables the optimisation.
>> 
>> But this seems to be an easteregg from ksh93.
>[...]
>
>printf %d 1+1 to output 2 is expected in ksh where in most
>places where a number is expected, any arithmetic expression is
>accepted as well. That behaviour was also copied by zsh.
>
>It causes all sorts of security headaches as arithmetic expressions can assign
>variables (like for IFS=1234567890, PATH=7734) or run arbitrary code (like
>a=[$(evil)0])
>
>$ a=2 b='a[$(evil)0]' ksh -c 'printf %d b' # /usr/bin/printf run
>printf: b expected numeric value
>$ a=2 b='a[$(evil)0]' ksh -c 'printf "%d" b' # ksh printf run
>ksh: printf: evil: not found [No such file or directory]
>
>The easteregg here is more solaris libc:exec*() bypassing the
>execution of a shell in some cases.


Right.  I think it may need some sine tuning but I think it is fine to 
avoid the shell when it is not needed.

I was not aware that ksh was all that dangerous; especially as it allows 
crossing privilege boundaries using environment variable.

Not quite as bad as "Shellshock"; not even close.  Still another reason to 
avoid the shell when it not actually needed to start a new command.

I'm not sure why we ended up in Solaris with 18 commands which are 
basically built-in ksh93 commands that make little sense as individual
executables:

alias    cd       fc       getopts  jobs     print    test     ulimit   unalias
bg       command  fg       hash     kill     read     type     umask    wait

It seems that is being tested in XPG4.os/procenv/confstr/

The only ones that makes sense are "kill" & "print".

Casper


Reply via email to