Print this page
7029 want per-process exploit mitigation features (secflags)
7030 want basic address space layout randomization (aslr)
7031 noexec_user_stack should be a secflag
7032 want a means to forbid mappings around NULL.

@@ -32,10 +32,11 @@
 #include <stdio.h>
 #include <string.h>
 #include <sys/types.h>
 #include <unistd.h>
 #include <sys/corectl.h>
+#include <procfs.h>
 #include <msg.h>
 #include <_elfdump.h>
 #include <struct_layout.h>
 #include <conv.h>
 

@@ -164,11 +165,11 @@
 static Word
 extract_as_word(note_state_t *state, const sl_field_t *fdesc)
 {
         return (sl_extract_as_word(state->ns_data, state->ns_swap, fdesc));
 }
-static Word
+static Lword
 extract_as_lword(note_state_t *state, const sl_field_t *fdesc)
 {
         return (sl_extract_as_lword(state->ns_data, state->ns_swap, fdesc));
 }
 static int

@@ -434,10 +435,11 @@
         union {
                 Conv_cap_val_hw1_buf_t          hw1;
                 Conv_cap_val_hw2_buf_t          hw2;
                 Conv_cnote_auxv_af_buf_t        auxv_af;
                 Conv_ehdr_flags_buf_t           ehdr_flags;
+                Conv_secflags_buf_t             secflags;
                 Conv_inv_buf_t                  inv;
         } conv_buf;
         sl_fmtbuf_t     buf;
         int             ndx, ndx_start;
         Word            sizeof_auxv;

@@ -825,10 +827,49 @@
             MSG_ORIG(MSG_CNOTE_T_TV_NSEC), tv_nsec);
 
         indent_exit(state);
 }
 
+/*
+ * Output information from prsecflags_t structure.
+ */
+static void
+dump_secflags(note_state_t *state, const char *title)
+{
+        const sl_prsecflags_layout_t *layout = state->ns_arch->prsecflags;
+        Conv_secflags_buf_t inv;
+        Word w;
+
+        indent_enter(state, title, &layout->pr_version);
+
+        w = extract_as_word(state, &layout->pr_version);
+
+        if (w != PRSECFLAGS_VERSION_1) {
+                PRINT_DEC(MSG_INTL(MSG_NOTE_BAD_SECFLAGS_VER), pr_version);
+                dump_hex_bytes(state->ns_data, state->ns_len, state->ns_indent,
+                    4, 3);
+        } else {
+                PRINT_DEC(MSG_ORIG(MSG_CNOTE_T_PR_VERSION), pr_version);
+                w = extract_as_word(state, &layout->pr_effective);
+                print_str(state, MSG_ORIG(MSG_CNOTE_T_PR_EFFECTIVE),
+                    conv_prsecflags(w, 0, &inv));
+
+                w = extract_as_word(state, &layout->pr_inherit);
+                print_str(state, MSG_ORIG(MSG_CNOTE_T_PR_INHERIT),
+                    conv_prsecflags(w, 0, &inv));
+
+                w = extract_as_word(state, &layout->pr_lower);
+                print_str(state, MSG_ORIG(MSG_CNOTE_T_PR_LOWER),
+                    conv_prsecflags(w, 0, &inv));
+
+                w = extract_as_word(state, &layout->pr_upper);
+                print_str(state, MSG_ORIG(MSG_CNOTE_T_PR_UPPER),
+                    conv_prsecflags(w, 0, &inv));
+        }
+
+        indent_exit(state);
+}
 
 /*
  * Output information from utsname structure.
  */
 static void

@@ -1095,10 +1136,11 @@
          * higher one for the pr_lwp sub-struct.
          */
         state->ns_vcol += 5;
         state->ns_t2col += 5;
         state->ns_v2col += 5;
+
         PRINT_SUBTYPE(MSG_ORIG(MSG_CNOTE_T_PR_LWP), pr_lwp, dump_lwpstatus);
         state->ns_vcol -= 5;
         state->ns_t2col -= 5;
         state->ns_v2col -= 5;
 

@@ -1855,9 +1897,16 @@
                 state.ns_vcol = 25;
                 state.ns_t2col = 45;
                 state.ns_v2col = 58;
                 dump_psinfo(&state, MSG_ORIG(MSG_CNOTE_DESC_PSINFO_T));
                 return (CORENOTE_R_OK);
+
+        case NT_SECFLAGS:
+                state.ns_vcol = 23;
+                state.ns_t2col = 41;
+                state.ns_v2col = 54;
+                dump_secflags(&state, MSG_ORIG(MSG_CNOTE_DESC_PRSECFLAGS_T));
+                return (CORENOTE_R_OK);
         }
 
         return (CORENOTE_R_BADTYPE);
 }