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?
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 *);