On Tue, May 21, 2019 at 07:34:05AM +0200, Martijn van Duren wrote:
> Hello Jesper,
> On 5/20/19 10:58 PM, Jesper Wallin wrote:
> > Hi all,
> >
> > When ex/vi is started with -S (secure), a stricter pledge is used to
> > prevent exec from being used. It's tedious to specify -S all the time
> > and easier to add "set secure" to ~/.nexrc. However, the check for
> > which pledge to use doesn't care what your ~/.nexrc contains and the
> > exec promise remains.
>
> The behaviour should be identical, the only difference would be that
> pledge catches programming errors. So I see no particular reason to use
> -S over "set secure" for normal users; even without pledge.
> >
> > This patch simply wait until the ~/.nexrc is parsed and all options are
> > set before checking whether or not to apply the stricter pledge.
> >
> > Another approach would be to also have a check inside the opts_set()
> > unction, in case the user manually runs "set secure", but that feels
> > ugly and "too deep".
> >
> If we want to make sure that that secure is always honoured with a
> pledge I reckon we should push it down to opts_set.
> I choose not to fail hard on pledge, since that could loose peoples
> work, which is most definitely not what we want. While here fix a
> lie that secure has an off parameter and inform the user that it can't
> be turned off again.
>
> OK?
Makes sense to me. ok brynet@
> martijn@
> >
> > Jesper Wallin
> >
> Index: common/options.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/vi/common/options.c,v
> retrieving revision 1.26
> diff -u -p -r1.26 options.c
> --- common/options.c 31 Jul 2017 19:45:49 -0000 1.26
> +++ common/options.c 21 May 2019 05:32:29 -0000
> @@ -136,7 +136,7 @@ OPTLIST const optlist[] = {
> /* O_SECTIONS 4BSD */
> {"sections", f_section, OPT_STR, 0},
> /* O_SECURE 4.4BSD */
> - {"secure", NULL, OPT_0BOOL, OPT_NOUNSET},
> + {"secure", f_secure, OPT_0BOOL, OPT_NOUNSET},
> /* O_SHELL 4BSD */
> {"shell", NULL, OPT_STR, 0},
> /* O_SHELLMETA 4.4BSD */
> Index: common/options_f.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/vi/common/options_f.c,v
> retrieving revision 1.12
> diff -u -p -r1.12 options_f.c
> --- common/options_f.c 3 Jul 2017 07:01:14 -0000 1.12
> +++ common/options_f.c 21 May 2019 05:32:30 -0000
> @@ -207,6 +207,19 @@ f_section(SCR *sp, OPTION *op, char *str
> }
>
> /*
> + * PUBLIC: int f_secure(SCR *, OPTION *, char *, u_long *)
> + */
> +int
> +f_secure(SCR *sp, OPTION *op, char *str, u_long *valp)
> +{
> + if (pledge("stdio rpath wpath cpath fattr flock getpw tty", NULL) ==
> -1) {
> + msgq(sp, M_ERR, "pledge failed");
> + return (1);
> + }
> + return (0);
> +}
> +
> +/*
> * PUBLIC: int f_ttywerase(SCR *, OPTION *, char *, u_long *);
> */
> int
> Index: docs/USD.doc/vi.man/vi.1
> ===================================================================
> RCS file: /cvs/src/usr.bin/vi/docs/USD.doc/vi.man/vi.1,v
> retrieving revision 1.75
> diff -u -p -r1.75 vi.1
> --- docs/USD.doc/vi.man/vi.1 12 Feb 2018 01:10:46 -0000 1.75
> +++ docs/USD.doc/vi.man/vi.1 21 May 2019 05:32:30 -0000
> @@ -2456,8 +2456,9 @@ Define additional section boundaries for
> and
> .Cm ]]
> commands.
> -.It Cm secure Bq off
> +.It Cm secure
> Turns off all access to external programs.
> +Once set this option can't be disabled.
> .It Cm shell , sh Bq "environment variable SHELL, or /bin/sh"
> Select the shell used by the editor.
> .It Cm shellmeta Bq ~{[*?$`'\&"\e
> Index: include/com_extern.h
> ===================================================================
> RCS file: /cvs/src/usr.bin/vi/include/com_extern.h,v
> retrieving revision 1.15
> diff -u -p -r1.15 com_extern.h
> --- include/com_extern.h 3 Jul 2017 07:01:14 -0000 1.15
> +++ include/com_extern.h 21 May 2019 05:32:30 -0000
> @@ -75,6 +75,7 @@ int f_readonly(SCR *, OPTION *, char *,
> int f_recompile(SCR *, OPTION *, char *, u_long *);
> int f_reformat(SCR *, OPTION *, char *, u_long *);
> int f_section(SCR *, OPTION *, char *, u_long *);
> +int f_secure(SCR *, OPTION *, char *, u_long *);
> int f_ttywerase(SCR *, OPTION *, char *, u_long *);
> int f_w300(SCR *, OPTION *, char *, u_long *);
> int f_w1200(SCR *, OPTION *, char *, u_long *);
>
>