At 2023-08-01T13:38:55+0200, Leah Neukirchen wrote: > > I got to wondering, based on the sendmail discussions, how many > > shell escapes have appeared over the years? > > > > uucp > > sendmail > > xdvi : "The "allowShell" option enables the shell escape in PostScript specials" > > From the top of my head, where it can be disabled: > > ghostscript (see above) > tex (write18) > ed/ex/vi > nethack And the *roffs of course. nroff/troff/groff, with the `sy` (system(3)) and `pi` (popen(3)) requests. pic(1) as well ("sh"). groff has, since version 1.12 in 1999, disabled these features by default; the '-U' ("unsafe") command-line option reënables them. It added some additional unsafe requests for arbitrary stream I/O, `open`, `opena` (open with append), and `pso` (`so` for pipeline output). I recently learned of a limitation in the way AT&T and GNU *roffs, at least, construct the string `sy` passes passes to system(3), which makes certain things impossible. Unfortunately it forecloses useful applications, not any particularly malicious ones. There is a problem with trying to embed true newlines into the arguments of a `sy` request. The C++ function that GNU troff uses to assemble the command string (character by character) _does not recognize C/C++ string literal escape sequences_. This means that you _cannot_ embed "\n" in `sy`'s arguments and have it survive, as a newline character, into the command string passed to the standard C library's system(3) function. ("A\nB" gets encoded as 'A', '\\', 'n', 'B', not 'A', '\n', 'B'.) Unfortunately, this appears to be AT&T troff-compatible behavior. But it means that you _cannot_ portably construct multi-line replacement text for sed's 's' command. (Other sed commands like 'a', 'c', and 'i' will be similarly affected.) See Savannah #64071. AT&T troff obviously wasn't written in C++, so this would appear to be an instance of independent oversight. (Where James Clark had gripes about AT&T troff behavior, he left them in source code comments.) I aim to fix this. If I can write an arbitrary shell command, then I darn well ought to be able to embed an arbitrary sed script in that shell command (without needing a GNU sed extension to embed newlines). Regards, Branden