Just like dt(4) or mem(4), ksyms(4) allows userland to read kernel
addresses.

Diff below makes `allowkmem' a requirement for opening the
pseudo-device.

ok?

Index: sys/dev/ksyms.c
===================================================================
RCS file: /cvs/src/sys/dev/ksyms.c,v
retrieving revision 1.32
diff -u -p -r1.32 ksyms.c
--- sys/dev/ksyms.c     25 Jan 2019 00:19:26 -0000      1.32
+++ sys/dev/ksyms.c     22 Jan 2020 14:14:20 -0000
@@ -114,13 +114,14 @@ ksymsattach(int num)
 int
 ksymsopen(dev_t dev, int flag, int mode, struct proc *p)
 {
+       extern int allowkmem;
 
        /* There are no non-zero minor devices */
        if (minor(dev) != 0)
                return (ENXIO);
 
        /* This device is read-only */
-       if ((flag & FWRITE))
+       if ((flag & FWRITE) || !allowkmem)
                return (EPERM);
 
        /* ksym_syms must be initialized */
Index: share/man/man4/ksyms.4
===================================================================
RCS file: /cvs/src/share/man/man4/ksyms.4,v
retrieving revision 1.14
diff -u -p -r1.14 ksyms.4
--- share/man/man4/ksyms.4      25 Jan 2019 00:19:26 -0000      1.14
+++ share/man/man4/ksyms.4      22 Jan 2020 14:14:57 -0000
@@ -63,7 +63,10 @@ An open of
 will fail if:
 .Bl -tag -width Er
 .It Bq Er EPERM
-An open was attempted with write permissions.
+An open was attempted with write permissions or the
+.Va kern.allowkmem
+.Xr sysctl 2
+is not set.
 .It Bq Er ENXIO
 No kernel symbols were saved by the boot loader (usually because
 they were removed with

Reply via email to