On Sun, Apr 09, 2023 at 09:15:12AM +0200, Otto Moerbeek wrote:
> On Sun, Apr 09, 2023 at 08:20:43AM +0200, Otto Moerbeek wrote:
> 
> > 
> > Thanks! Your suggestions make a lot of sense. I'll rework the kdump
> > part to make it more flexable for different purposes.
> 
> Anothew aspect of safety is the information availble in the heap
> itself. I'm pretty sure the addresses of call sites into malloc are
> interesting to attackers. To prevent a program having access to those
> (even if they are stored inside the malloc meta data that is not
> directly accesible to a program), I'm making sure the recording only
> takes place if malloc option D is used.
> 
> This is included in a diff with the kdump changes and a few other
> things below. I'm also compiling with MALLOC_STATS if !SMALL.
> 
> usage is now:
> 
> $ MALLOC_OPTIONS=D ktrace -tu a.out 
> $ kdump -u malloc
> 
>         -Otto

few comments regarding kdump below. I will try to look at malloc part too.

 
> Index: usr.bin/kdump/kdump.1
> ===================================================================
> RCS file: /home/cvs/src/usr.bin/kdump/kdump.1,v
> retrieving revision 1.35
> diff -u -p -r1.35 kdump.1
> --- usr.bin/kdump/kdump.1     30 Jul 2022 07:19:30 -0000      1.35
> +++ usr.bin/kdump/kdump.1     9 Apr 2023 07:08:20 -0000
> @@ -42,6 +42,7 @@
>  .Op Fl m Ar maxdata
>  .Op Fl p Ar pid
>  .Op Fl t Ar trstr
> +.Op Fl u Ar word

I would use the term 'label' (instead of 'word'), as it is the way it is called 
inside utrace(2) man page.

>  .Sh DESCRIPTION
>  .Nm
>  displays the kernel trace files produced with
> @@ -106,6 +107,18 @@ See the
>  option of
>  .Xr ktrace 1
>  for the meaning of the letters.
> +.It Fl u Ar word
> +Display
> +.Xr utrace 2
> +records having
> +.XR utrace 2
> +header
> +.Ar word
> +as strings with
> +.Xr vis 3
> +escaping, without
> +.Xr ktrace 2
> +header information.
>  .It Fl X
>  Display I/O data with hexadecimal data and printable ASCII characters
>  side by side.
> Index: usr.bin/kdump/kdump.c
> ===================================================================
> RCS file: /home/cvs/src/usr.bin/kdump/kdump.c,v
> retrieving revision 1.156
> diff -u -p -r1.156 kdump.c
> --- usr.bin/kdump/kdump.c     17 Feb 2023 18:01:26 -0000      1.156
> +++ usr.bin/kdump/kdump.c     9 Apr 2023 07:08:20 -0000
> @@ -88,6 +88,7 @@ int needtid, tail, basecol;
>  char *tracefile = DEF_TRACEFILE;
>  struct ktr_header ktr_header;
>  pid_t pid_opt = -1;
> +char* utracefilter;
>  
>  #define eqs(s1, s2)  (strcmp((s1), (s2)) == 0)
>  
> @@ -168,7 +169,7 @@ main(int argc, char *argv[])
>                       screenwidth = 80;
>       }
>  
> -     while ((ch = getopt(argc, argv, "f:dHlm:np:RTt:xX")) != -1)
> +     while ((ch = getopt(argc, argv, "f:dHlm:np:RTt:u:xX")) != -1)
>               switch (ch) {
>               case 'f':
>                       tracefile = optarg;
> @@ -212,6 +213,9 @@ main(int argc, char *argv[])
>                       if (trpoints < 0)
>                               errx(1, "unknown trace point in %s", optarg);
>                       break;
> +             case 'u':
> +                     utracefilter = optarg;

I think it would make sense to also force trpoints to only user data:

                        trpoints = KTRFAC_USER;

this way, if you trace others informations in the dump file, you only get the 
related utrace(2) entries.

-t and -u should be also mutually exclusive.

> +                     break;
>               case 'x':
>                       iohex = 1;
>                       break;
> @@ -246,7 +250,7 @@ main(int argc, char *argv[])
>               silent = 0;
>               if (pid_opt != -1 && pid_opt != ktr_header.ktr_pid)
>                       silent = 1;
> -             if (silent == 0 && trpoints & (1<<ktr_header.ktr_type))
> +             if (utracefilter == NULL && silent == 0 && trpoints & 
> (1<<ktr_header.ktr_type))
>                       dumpheader(&ktr_header);
>               ktrlen = ktr_header.ktr_len;
>               if (ktrlen > size) {
> @@ -1254,10 +1258,18 @@ showbufc(int col, unsigned char *dp, siz
>  static void
>  showbuf(unsigned char *dp, size_t datalen)
>  {
> -     int i, j;
> +     size_t i, j;
>       int col = 0, bpl;
>       unsigned char c;
> +     char visbuf[5];
>  
> +     if (utracefilter != NULL) {
> +             for (i = 0; i < datalen; i++) {
> +                     vis(visbuf, dp[i], VIS_SAFE | VIS_OCTAL, 0);
> +                     printf("%s", visbuf);

I don't know if it would make a difference or not, but it is possible to use 
strvis(3) as dp is fixed size (KTR_USER_MAXLEN). so visbuf would be 
KTR_USER_MAXLEN*4+1 in size.

but the way you did is fine too.

> +             }
> +             return;
> +     }
>       if (iohex == 1) {
>               putchar('\t');
>               col = 8;
> @@ -1280,7 +1292,7 @@ showbuf(unsigned char *dp, size_t datale
>               if (bpl <= 0)
>                       bpl = 1;
>               for (i = 0; i < datalen; i += bpl) {
> -                     printf("   %04x:  ", i);
> +                     printf("   %04zx:  ", i);
>                       for (j = 0; j < bpl; j++) {
>                               if (i+j >= datalen)
>                                       printf("   ");
> @@ -1413,9 +1425,13 @@ ktruser(struct ktr_user *usr, size_t len
>       if (len < sizeof(struct ktr_user))
>               errx(1, "invalid ktr user length %zu", len);
>       len -= sizeof(struct ktr_user);
> -     printf("%.*s:", KTR_USER_MAXIDLEN, usr->ktr_id);
> -     printf(" %zu bytes\n", len);
> -     showbuf((unsigned char *)(usr + 1), len);
> +     if (utracefilter == NULL) {
> +             printf("%.*s:", KTR_USER_MAXIDLEN, usr->ktr_id);
> +             printf(" %zu bytes\n", len);
> +             showbuf((unsigned char *)(usr + 1), len);
> +     }
> +     else if (strncmp(usr->ktr_id, utracefilter, KTR_USER_MAXIDLEN) == 0)
> +             showbuf((unsigned char *)(usr + 1), len);
>  }
>  
>  static void
> @@ -1473,8 +1489,8 @@ usage(void)
>  
>       extern char *__progname;
>       fprintf(stderr, "usage: %s "
> -         "[-dHlnRTXx] [-f file] [-m maxdata] [-p pid] [-t trstr]\n",
> -         __progname);
> +         "[-dHlnRTXx] [-f file] [-m maxdata] [-p pid] [-t trstr] "
> +         "[-u word]\n", __progname);
>       exit(1);
>  }
>  
> 
> 
> 

-- 
Sebastien Marie

Reply via email to