On Sat, Jan 29, 2022 at 06:25:32PM -0600, Matthew Martin wrote:
> On Sat, Jan 29, 2022 at 07:10:00PM -0500, Ted Unangst wrote:
> > I believe it would be better to add setrtable to id pledge.

ping

Also are there any opinions on adding LOGIN_SETRTABLE to doas?


diff --git include/login_cap.h include/login_cap.h
index d9a4c2c349c..1e831b6471a 100644
--- include/login_cap.h
+++ include/login_cap.h
@@ -53,7 +53,8 @@
 #define        LOGIN_SETUMASK          0x0020  /* Set umask */
 #define        LOGIN_SETUSER           0x0040  /* Set user */
 #define        LOGIN_SETENV            0x0080  /* Set environment */
-#define        LOGIN_SETALL            0x00ff  /* Set all. */
+#define        LOGIN_SETRTABLE         0x0100  /* Set rtable */
+#define        LOGIN_SETALL            0x01ff  /* Set all. */
 
 #define        BI_AUTH         "authorize"             /* Accepted 
authentication */
 #define        BI_REJECT       "reject"                /* Rejected 
authentication */
diff --git lib/libc/gen/login_cap.c lib/libc/gen/login_cap.c
index 862f33b2065..65848f09ef6 100644
--- lib/libc/gen/login_cap.c
+++ lib/libc/gen/login_cap.c
@@ -52,6 +52,7 @@
 #include <sys/stat.h>
 #include <sys/time.h>
 #include <sys/resource.h>
+#include <sys/socket.h>
 
 #include <err.h>
 #include <errno.h>
@@ -574,7 +575,7 @@ int
 setusercontext(login_cap_t *lc, struct passwd *pwd, uid_t uid, u_int flags)
 {
        login_cap_t *flc;
-       quad_t p;
+       quad_t p, rtable;
        int i;
 
        flc = NULL;
@@ -625,6 +626,14 @@ setusercontext(login_cap_t *lc, struct passwd *pwd, uid_t 
uid, u_int flags)
                umask((mode_t)p);
        }
 
+       if (flags & LOGIN_SETRTABLE) {
+               rtable = login_getcapnum(lc, "rtable", 0, 0);
+
+               if (setrtable((int)rtable) == -1) {
+                       syslog(LOG_ERR, "%s: setrtable: %m", lc->lc_class);
+               }
+       }
+
        if (flags & LOGIN_SETGROUP) {
                if (setresgid(pwd->pw_gid, pwd->pw_gid, pwd->pw_gid) == -1) {
                        syslog(LOG_ERR, "setresgid(%u,%u,%u): %m",
diff --git lib/libc/sys/pledge.2 lib/libc/sys/pledge.2
index 581d274822c..ff3aa59f9e3 100644
--- lib/libc/sys/pledge.2
+++ lib/libc/sys/pledge.2
@@ -514,7 +514,8 @@ process:
 .Xr setlogin 2 ,
 .Xr setrlimit 2 ,
 .Xr getpriority 2 ,
-.Xr setpriority 2
+.Xr setpriority 2 ,
+.Xr setrtable 2
 .It Cm pf
 Allows a subset of
 .Xr ioctl 2
diff --git share/man/man5/login.conf.5 share/man/man5/login.conf.5
index da935fa223e..ffeafc3531c 100644
--- share/man/man5/login.conf.5
+++ share/man/man5/login.conf.5
@@ -276,6 +276,10 @@ Initial priority (nice) level.
 Require home directory to login.
 .\"
 .Pp
+.It rtable Ta number Ta Dv 0 Ta
+Rtable to be set for the class.
+.\"
+.Pp
 .It setenv Ta envlist Ta "" Ta
 A list of environment variables and associated values to be set for the class.
 .\"
diff --git sys/kern/kern_pledge.c sys/kern/kern_pledge.c
index b876b91a18a..26b5e1fab96 100644
--- sys/kern/kern_pledge.c
+++ sys/kern/kern_pledge.c
@@ -300,6 +300,7 @@ const uint64_t pledge_syscalls[SYS_MAXSYSCALL] = {
        [SYS_setresgid] = PLEDGE_ID,
        [SYS_setgroups] = PLEDGE_ID,
        [SYS_setlogin] = PLEDGE_ID,
+       [SYS_setrtable] = PLEDGE_ID,
 
        [SYS_unveil] = PLEDGE_UNVEIL,
 

Reply via email to