On Fri, Jan 07, 2022 at 12:25:25PM -0700, Theo de Raadt wrote:
> > I agree, but the intent is replacing a debugging method with another
> > debugging method (hoping it is more useful). The messages showed here
> > are the same that the ones which would be shown on the console before
> > the diff.
> 
> the thing about the kernel messages, is you see the pointers and you
> know to go fix the code.
> 
> The problem with hiding it in some optional-visibility interface, is
> that these things may show up without the more paranoid developers
> noticing the problem.
> 
> How do we prevent non-#define DEBUG_FOO situations from growing?

As the kernel currently contains (at least) 1946 pointers leak by using
printf(9) and %p, it might be more efficient to scramble %p with a
static value (randomly assigned at boot time).

Using xor with such static-random-value will conserve uniqueness and
reproductibility of the printf(9) for the kernel live-time.

The following diff does it.

If the real value is still wanted (but it should be for unmentionable
reasons, as even in debug code is seems to be unwanted</sarcasm>), a
%P format options could be introduced for such case.

Alternatively, %P might be used for print the scrambled value, but it
will imply reviewing 1946 usage of %p.
-- 
Sebastien Marie

diff 9fbb8b8358a4a6c4112136a2bc60d2cee1a7a243 /home/semarie/repos/openbsd/src
blob - a7de554db1973d60c53eae927b51febc6f547b8e
file + share/man/man9/printf.9
--- share/man/man9/printf.9
+++ share/man/man9/printf.9
@@ -214,6 +214,9 @@ encountered
 distinguishable by its value being \*(Le 32 or \*(Ge 128
 .Pc ,
 or the end of the decoding directive string itself.
+.It Li %p
+The value showed is anonymized to prevent pointer information leaking.
+Uniqueness and reproducibility are preserved for the kernel live-time.
 .El
 .Sh RETURN VALUES
 The
blob - 3ca2a9226b57519b65852db170309d169ee9e751
file + sys/kern/init_main.c
--- sys/kern/init_main.c
+++ sys/kern/init_main.c
@@ -173,6 +173,7 @@ main(void *framep)
        struct pdevinit *pdev;
        extern struct pdevinit pdevinit[];
        extern void disk_init(void);
+       extern u_long prf_rand;
 
        /*
         * Initialize the current process pointer (curproc) before
@@ -213,6 +214,9 @@ main(void *framep)
 
        random_start(boothowto & RB_GOODRANDOM);        /* Start the flow */
 
+       /* Initialize prf_rand with a random value */
+       arc4random_buf(&prf_rand, sizeof(prf_rand));
+       
        /*
         * Initialize mbuf's.  Do this now because we might attempt to
         * allocate mbufs or mbuf clusters during autoconfiguration.
blob - e2ad6cd97b37ad844cddca0af596e862d0ef8060
file + sys/kern/subr_prf.c
--- sys/kern/subr_prf.c
+++ sys/kern/subr_prf.c
@@ -99,6 +99,8 @@ struct mutex kprintf_mutex =
 extern int log_open;   /* subr_log: is /dev/klog open? */
 const  char *panicstr; /* arg to first call to panic (used as a flag
                           to indicate that panic has already been called). */
+u_long prf_rand;       /* printf(9) %p pointer anonymizer */
+
 #ifdef DDB
 /*
  * Enter ddb on panic.
@@ -903,7 +905,7 @@ reswitch:   switch (ch) {
                         * defined manner.''
                         *      -- ANSI X3J11
                         */
-                       _uquad = (u_long)va_arg(ap, void *);
+                       _uquad = (u_long)va_arg(ap, void *) ^ prf_rand;
                        base = HEX;
                        xdigs = "0123456789abcdef";
                        flags |= HEXPREFIX;

Reply via email to