KShell & KMacroExpander - are we screwed?

Andreas Pakulat apaku at gmx.de
Fri Oct 5 17:47:27 CEST 2007


On 05.10.07 15:52:01, Oswald Buddenhagen wrote:
> moin,
> 
> as previously discussed with puthuhn, we (well, *you*, in fact :-P) have
> a serious problem. A short wrap-up first:
> 
> /*
>  * A short introduction into cmd semantics:
>  * - Variable expansion is done first, without regard to *any* escaping -
>  *   if something looks like an existing variable, it is replaced.
>  * - Then follows regular tokenization by the shell. &, &&, | and || are
>  *   command delimiters. ( and ) are command grouping operators; they are
>  *   recognized only a the start resp. end of a command; mismatched )s are
>  *   an error if any (s are present. <, > are just like under UNIX - they can
>  *   appear *anywhere* in a command, perform their function and are cut out.
>  *   @ at the start of a command is eaten (local echo off - no function as
>  *   far as cmd /c is concerned). : at the start of a command declares a label,
>  *   which effectively means the remainder of the line is a comment - note that
>  *   command separators are not recognized past that point.
>  *   ^ is the escape char for everything including itself.
>  *   cmd ignores *all* special chars between double quotes, so there is no
>  *   way to escape the closing quote. Note that the quotes are *not* removed
>  *   from the resulting command line.
>  * - Then follows argument splitting as described in
>  *   http://msdn2.microsoft.com/en-us/library/ms880421.aspx .
>  *   Note that this is done by the called application and therefore might
>  *   be subject to completely different semantics, in fact.
>  */
> 
> the last point is suboptimal, but well, who cares. heh.
> point two poses no significant problems, i think. the code to create
> escaping that works on both levels is just ugly, nothing else.
> the first point is a killer, though - unless somebody knows a solution
> (in which case the rest of the mail is irrelevant).
> 
> kshell::quotearg quotes a single argument so it can be just appended to
> a shell command line in a safe way. but we cannot guarantee the safety
> (and by extension security) under windows. we could stuff each token
> separately with dummy escapes (^) until no known variables are
> referenced. of course, this does not help with variables that get into
> the shell by ways not known to kshell.
> additionally, weird variable names can be constructed from multiple
> tokens - a low-level function like quotearg cannot do anything against
> this.
> kshell::joinargs and kmacroexpander::expandmacrosshellquote are
> similarly affected - their output is often used more or less directly as
> a shell command. suppose the last part is true, they could
> "dummy-escape" the string, assuming it is complete command. but they
> still don't know if variables don't get to the shell from other sources
> than the current environment.
> 
> possible solutions:
> - ignore the problem. assume that a) regular urls, filenames, etc.
>   don't produce existing variable names by chance and b) the regular
>   environment does not contain anything dangerous and an attacker
>   won't be able to manipulate the environment, so passing weird
>   parameters intentioally won't help him.
>   i guess anybody who considers this solution seriously should be shot.
>   :}
> - ban % from arguments. unrealistic - too common in urls. also,
>   implementing error paths would mean quite some api magic now.
> - screw cmd, v1: kprocess::setshellcommand is nuked again (at least on
>   windows). user-provided commands are only subjected to
>   kshell::splitargs and direct execution via kprocess (is special
>   support for batch files needed?). the fear is that removing the
>   kprocess function will only lead to devs home-growing equivalent code
>   which is even worse, usually.
>   v1a (applicable only to KRun, as the other variants have no proper
>   error reporting facilities): refuse commands that contain % and at the
>   same time reqire a shell. eeek.
> - screw cmd, v2: use a posix shell under windows. things would be so
>   much simpler for kde developers. windows power users would be
>   surprised at first. otoh, they should be used to a complete lack of
>   consistency when it comes to command lines. :=)
> 
> unless somebody has a better idea, i vote for screw cmd v2, and as a
> last resort v1 for windows only.

Dunno what the problem really is (don't have time atm to read fully),
but imposing a posix shell to win32 people is a no-go, IMHO. Especially
not for end-users. Apart from that we'd have to install that as part of
KDE because a posix shell is not something joe average has installed.

If I'm missing something obvious due to my lack of reading the mail
fully, please just ignore me :)

Andreas

-- 
You are dishonest, but never to the point of hurting a friend.



More information about the Kde-windows mailing list