From 0ae3a8a2d50799d0b91d992434cdd4d3151b0348 Mon Sep 17 00:00:00 2001 From: William Roberts <w.roberts@sta.samsung.com> Date: Tue, 4 Sep 2012 11:51:04 -0700 Subject: [PATCH] Fix mls checking code Change-Id: I614caa520e218f8f148eef641fed2301571da8e1 --- Android.mk | 2 +- check_seapp/check_seapp.c | 78 +++++++++++++++++++++++---------------- 2 files changed, 48 insertions(+), 32 deletions(-) diff --git a/Android.mk b/Android.mk index 5481541b2..3b2876c88 100644 --- a/Android.mk +++ b/Android.mk @@ -81,7 +81,7 @@ $(seapp_contexts.conf): $(LOCAL_PATH)/seapp_contexts $(LOCAL_POLICY_SC) $(LOCAL_BUILT_MODULE) : $(seapp_contexts.conf) $(TARGET_ROOT_OUT)/sepolicy.$(POLICYVERS) $(HOST_OUT_EXECUTABLES)/checkseapp @mkdir -p $(dir $@) - $(hide) $(HOST_OUT_EXECUTABLES)/checkseapp -p $(TARGET_ROOT_OUT)/sepolicy.24 -o $@ $< + $(HOST_OUT_EXECUTABLES)/checkseapp -p $(TARGET_ROOT_OUT)/sepolicy.24 -o $@ $< seapp_contexts.conf := ################################## diff --git a/check_seapp/check_seapp.c b/check_seapp/check_seapp.c index d398d9172..166e6d39b 100644 --- a/check_seapp/check_seapp.c +++ b/check_seapp/check_seapp.c @@ -23,11 +23,18 @@ typedef struct hash_entry hash_entry; typedef enum key_dir key_dir; typedef enum data_type data_type; typedef enum rule_map_switch rule_map_switch; +typedef enum map_match map_match; typedef struct key_map key_map; typedef struct kvp kvp; typedef struct rule_map rule_map; typedef struct policy_info policy_info; +enum map_match { + map_no_matches, + map_input_matched, + map_matched +}; + /** * Whether or not the "key" from a key vaue pair is considered an * input or an output. @@ -228,13 +235,14 @@ static int key_map_validate(key_map *m, int lineno) { int rc = 1; int ret = 1; - int i; int resp; char *key = m->name; char *value = m->data; data_type type = m->type; sepol_bool_key_t *se_key; + log_info("Validating %s=%s\n", key, value); + /* Booleans can always be checked for sanity */ if (type == dt_bool && (!strcmp("true", value) || !strcmp("false", value))) { goto out; @@ -289,32 +297,23 @@ static int key_map_validate(key_map *m, int lineno) { goto out; } - /* - * Ideally this should check if the category level - * is defined in the policy. Since their doesn't appear - * to be a shared object option to extract this information - * for now, well just ensure it is a integer value. - */ else if (!strcasecmp(key, "level")) { - i=0; - while(value[i] != '\0') { - if(!isdigit(value[i])) { - log_error("level: %s on line: %d is not a valid integer\n", value, lineno); - rc = 0; - goto out; - } - i++; + ret = sepol_mls_check(pol.handle, pol.db, value); + if (ret < 0) { + log_error("Could not check selinux mls \"%s\", error: %s\n", + value, strerror(errno)); + rc = 0; + goto out; } } -out: - return rc; - bool_err: sepol_bool_key_free(se_key); - goto out; +out: + log_info("Key map validate returning: %d\n", rc); + return rc; } /** @@ -349,7 +348,7 @@ static void rule_map_print(FILE *fp, rule_map *r) { * 1 - If the input selectors match, ie needs an override * -1 - If the input and output selectors match, ie duplicate line */ -static int rule_map_cmp(rule_map *rmA, rule_map *rmB) { +static map_match rule_map_cmp(rule_map *rmA, rule_map *rmB) { int i; int j; @@ -361,7 +360,7 @@ static int rule_map_cmp(rule_map *rmA, rule_map *rmB) { key_map *mB; if (rmA->length != rmB->length) - return 0; + return map_no_matches; for (i = 0; i < rmA->length; i++) { mA = &(rmA->m[i]); @@ -386,27 +385,36 @@ static int rule_map_cmp(rule_map *rmA, rule_map *rmB) { inputs_found++; } - if (input_mode) + if (input_mode) { + log_info("Matched input lines: type=%s name=%s data=%s dir=%d\n", mA->type, mA->name, mA->data, mA->dir); num_of_matched_inputs++; + } /* Match found, move on */ + log_info("Matched lines: type=%s name=%s data=%s dir=%d\n", mA->type, mA->name, mA->data, mA->dir); matches++; break; } } /* If they all matched*/ - if (matches == rmA->length) - return -1; + if (matches == rmA->length) { + log_info("Rule map cmp MATCH\n"); + return map_matched; + } /* They didn't all match but the input's did */ - else if (num_of_matched_inputs == inputs_found) - return 1; + else if (num_of_matched_inputs == inputs_found) { + log_info("Rule map cmp INPUT MATCH\n"); + return map_input_matched; + } /* They didn't all match, and the inputs didn't match, ie it didn't * match */ - else - return 0; + else { + log_info("Rule map cmp NO MATCH\n"); + return map_no_matches; + } } /** @@ -485,6 +493,7 @@ static rule_map *rule_map_new(kvp keys[], unsigned int num_of_keys, int lineno) goto oom; /* Enforce type check*/ + log_info("Validating keys!\n"); if (!key_map_validate(r, lineno)) { log_error("Could not validate\n"); goto err; @@ -611,6 +620,10 @@ static void init() { log_info("Input file set to: %s\n", (in_file_name == NULL) ? "stdin" : in_file_name); log_info("Output file set to: %s\n", (out_file_name == NULL) ? "stdout" : out_file_name); +#if !defined(LINK_SEPOL_STATIC) + log_warning("LINK_SEPOL_STATIC is not defined\n""Not checking types!"); +#endif + } /** @@ -731,7 +744,7 @@ static void list_free() { */ static void rule_add(rule_map *rm) { - int cmp; + map_match cmp; ENTRY e; ENTRY *f; hash_entry *entry; @@ -740,6 +753,7 @@ static void rule_add(rule_map *rm) { e.key = rm->key; + log_info("Searching for key: %s\n", e.key); /* Check to see if it has already been added*/ f = hsearch(e, FIND); @@ -749,12 +763,13 @@ static void rule_add(rule_map *rm) { * checking for duplicate entries. */ if(f) { + log_info("Existing entry found!\n"); tmp = (hash_entry *)f->data; cmp = rule_map_cmp(rm, tmp->r); - + log_info("Comparing on rule map ret: %d\n", cmp); /* Override be freeing the old rule map and updating the pointer */ - if(cmp == 1) { + if(cmp != map_matched) { /* * DO NOT free key pointers given to the hash map, instead @@ -843,6 +858,7 @@ static void parse() { token_cnt = 0; memset(keys, 0, sizeof(kvp) * KVP_NUM_OF_RULES); while (1) { + name = token; value = strchr(name, '='); if (!value) -- GitLab