freebsd-dev/bin/sh
Jilles Tjoelker d358fa780b wordexp: Rewrite to make WRDE_NOCMD reliable.
Shell syntax is too complicated to detect command substitution and unquoted
operators reliably without implementing much of sh's parser. Therefore, have
sh do this detection.

While changing sh's support anyway, also read input from a pipe instead of
arguments to avoid {ARG_MAX} limits and improve privacy, and output count
and length using 16 instead of 8 digits.

The basic concept is:
execl("/bin/sh", "sh", "-c", "freebsd_wordexp ${1:+\"$1\"} -f "$2",
    "", flags & WRDE_NOCMD ? "-p" : "", <pipe with words>);

The WRDE_BADCHAR error is still implemented in libc. POSIX requires us to
fail strings containing unquoted braces with code WRDE_BADCHAR. Since this
is normally not a syntax error in sh, there is still a need for checking
code in libc, we_check().

The new we_check() is an optimistic check that all the characters
  <newline> | & ; < > ( ) { }
are quoted. To avoid duplicating too much sh logic, such characters are
permitted when quoting characters are seen, even if the quoting characters
may themselves be quoted. This code reports all WRDE_BADCHAR errors; bad
characters that get past it and are a syntax error in sh return WRDE_SYNTAX.

Although many implementations of WRDE_NOCMD erroneously allow some command
substitutions (and ours even documented this), there appears to be code that
relies on its security (codesearch.debian.net shows quite a few uses).
Passing untrusted data to wordexp() still exposes a denial of service
possibility and a fairly large attack surface.

Reviewed by:	wblock (man page only)
MFC after:	2 weeks
Relnotes:	yes
Security:	fixes command execution with wordexp(untrusted, WRDE_NOCMD)
2015-09-30 21:32:29 +00:00
..
bltin sh: Fix compiler warnings related to duplicate or missing declarations. 2015-03-01 21:46:55 +00:00
funcs sh: Remove "kill" example function, which is superseded by the kill builtin 2012-01-21 20:39:17 +00:00
tests sh: Allow empty << EOF markers. 2015-09-02 19:49:55 +00:00
alias.c sh: Fix some arithmetic undefined behaviour. 2015-06-24 20:51:48 +00:00
alias.h sh: Fix duplicate prototypes for builtins. 2011-06-13 21:03:27 +00:00
arith_yacc.c sh: Remove two redundant (uintmax_t) casts. 2014-08-20 20:15:43 +00:00
arith_yacc.h sh: Fix compiler warnings related to duplicate or missing declarations. 2015-03-01 21:46:55 +00:00
arith_yylex.c sh: Fix compiler warnings related to duplicate or missing declarations. 2015-03-01 21:46:55 +00:00
arith.h sh: Fix duplicate prototypes for builtins. 2011-06-13 21:03:27 +00:00
builtins.def wordexp: Rewrite to make WRDE_NOCMD reliable. 2015-09-30 21:32:29 +00:00
cd.c sh: Prefer "" to nullstr where possible. 2015-02-15 21:47:43 +00:00
cd.h sh: Fix duplicate prototypes for builtins. 2011-06-13 21:03:27 +00:00
error.c sh: Fix more compiler warnings related to variable declarations. 2015-03-03 21:21:43 +00:00
error.h sh: Move some code from onint() to onsig(), making onint() noreturn. 2014-12-21 23:09:59 +00:00
eval.c sh: Fix more compiler warnings. 2015-03-01 22:32:23 +00:00
eval.h sh: Fix more compiler warnings. 2015-03-01 22:32:23 +00:00
exec.c sh: Fix some arithmetic undefined behaviour. 2015-06-24 20:51:48 +00:00
exec.h sh: Expand assignment-like words specially for export/readonly/local. 2012-07-15 10:19:43 +00:00
expand.c wordexp: Rewrite to make WRDE_NOCMD reliable. 2015-09-30 21:32:29 +00:00
expand.h sh: Remove EXP_REDIR. 2014-12-21 22:18:30 +00:00
histedit.c sh: Fix more compiler warnings. 2015-03-01 22:32:23 +00:00
input.c sh: Remove arbitrary length limit on << EOF markers. 2014-09-14 16:46:30 +00:00
input.h sh: Remove arbitrary length limit on << EOF markers. 2014-09-14 16:46:30 +00:00
jobs.c sh: Pass along SIGINT from a child if job control is enabled, even when not 2015-04-25 13:34:25 +00:00
jobs.h sh: Fix race condition with signals and wait or set -T. 2013-09-02 21:57:46 +00:00
mail.c sh: Prefer "" to nullstr where possible. 2015-02-15 21:47:43 +00:00
mail.h
main.c sh: Add more necessary INTOFF/INTON. 2014-05-09 13:27:30 +00:00
main.h sh: Make various functions static. 2012-01-01 22:17:12 +00:00
Makefile Convert bin/ to LIBADD, reduce overlinking allow to build all components as 2014-11-25 11:15:40 +00:00
Makefile.depend Add META_MODE support. 2015-06-13 19:20:56 +00:00
memalloc.c sh: Add stsavestr(), like savestr() but allocates using stalloc(). 2015-02-15 21:41:29 +00:00
memalloc.h sh: Add stsavestr(), like savestr() but allocates using stalloc(). 2015-02-15 21:41:29 +00:00
miscbltin.c sh: Fix read with escaped IFS characters at the end. 2015-08-30 17:24:22 +00:00
mkbuiltins Work better with how make/bmake works: 2012-05-24 19:48:15 +00:00
mknodes.c sh: Fix more compiler warnings related to variable declarations. 2015-03-03 21:21:43 +00:00
mksyntax.c sh: Fix more compiler warnings related to variable declarations. 2015-03-03 21:21:43 +00:00
mktokens sh: Fix compiler warnings related to duplicate or missing declarations. 2015-03-01 21:46:55 +00:00
myhistedit.h sh: Make various functions static. 2012-01-01 22:17:12 +00:00
mystring.c sh: Reject integer overflow in number and is_number. 2014-08-17 16:40:29 +00:00
mystring.h sh: Remove prefix() function. Use strncmp() instead. 2014-07-20 12:06:52 +00:00
nodes.c.pat sh: Add const to nodesavestr(). 2013-04-07 16:28:36 +00:00
nodetypes sh: Prefer "" to nullstr where possible. 2015-02-15 21:47:43 +00:00
options.c sh: Add set -o nolog. 2015-08-29 19:41:47 +00:00
options.h sh: Add set -o nolog. 2015-08-29 19:41:47 +00:00
output.c sh: Make sure output suitable as shell input is also printable. 2014-12-14 16:26:19 +00:00
output.h sh: Detect and flag write errors on stdout in builtins. 2012-12-12 22:01:10 +00:00
parser.c wordexp: Rewrite to make WRDE_NOCMD reliable. 2015-09-30 21:32:29 +00:00
parser.h wordexp: Rewrite to make WRDE_NOCMD reliable. 2015-09-30 21:32:29 +00:00
redir.c sh: Eliminate some gotos. 2014-10-05 21:51:36 +00:00
redir.h sh: Remove unnecessary reset functions. 2013-08-16 20:24:41 +00:00
sh.1 sh: Add set -o nolog. 2015-08-29 19:41:47 +00:00
shell.h sh: Remove #define MKINIT. 2013-07-25 19:48:15 +00:00
show.c sh: Prefer memcpy() to strcpy() in most cases. Remove the scopy macro. 2013-11-30 21:27:11 +00:00
show.h
TOUR sh: Remove mkinit. 2013-07-25 15:08:41 +00:00
trap.c sh: Fix the trap builtin to be POSIX-compliant for 'trap exit SIG' and 'trap n n...'. 2015-04-18 23:49:57 +00:00
trap.h sh: Move some code from onint() to onsig(), making onint() noreturn. 2014-12-21 23:09:59 +00:00
var.c sh: Fix more compiler warnings related to variable declarations. 2015-03-03 21:21:43 +00:00
var.h sh: Fix more compiler warnings related to variable declarations. 2015-03-03 21:21:43 +00:00