mirror of
https://gitlab.com/apparmor/apparmor
synced 2025-09-03 07:45:50 +00:00
Add the ability to specify link subset test on a link pair, and
fix a bug where link pairs could get improperly merged.
This commit is contained in:
@@ -68,9 +68,14 @@
|
|||||||
#define AA_EXEC_MODIFIERS (AA_EXEC_MOD_0 | AA_EXEC_MOD_1 | \
|
#define AA_EXEC_MODIFIERS (AA_EXEC_MOD_0 | AA_EXEC_MOD_1 | \
|
||||||
AA_EXEC_MOD_2 | AA_EXEC_MOD_3 | \
|
AA_EXEC_MOD_2 | AA_EXEC_MOD_3 | \
|
||||||
AA_EXEC_MOD_4)
|
AA_EXEC_MOD_4)
|
||||||
|
#define AA_EXEC_COUNT 32
|
||||||
|
|
||||||
#define AA_EXEC_TYPE (AA_MAY_EXEC | AA_EXEC_UNSAFE | \
|
#define AA_USER_EXEC_MODIFIERS (AA_EXEC_MODIFIERS << AA_USER_SHIFT)
|
||||||
AA_EXEC_MODIFIERS)
|
#define AA_OTHER_EXEC_MODIFIERS (AA_EXEC_MODIFIERS << AA_OTHER_SHIFT)
|
||||||
|
#define AA_ALL_EXEC_MODIFIERS (AA_USER_EXEC_MODIFIERS | \
|
||||||
|
AA_OTHER_EXEC_MODIFIERS)
|
||||||
|
|
||||||
|
#define AA_EXEC_TYPE (AA_EXEC_UNSAFE | AA_EXEC_MODIFIERS)
|
||||||
|
|
||||||
#define AA_EXEC_UNCONFINED (AA_EXEC_MOD_0)
|
#define AA_EXEC_UNCONFINED (AA_EXEC_MOD_0)
|
||||||
#define AA_EXEC_INHERIT (AA_EXEC_MOD_1)
|
#define AA_EXEC_INHERIT (AA_EXEC_MOD_1)
|
||||||
@@ -79,8 +84,10 @@
|
|||||||
|
|
||||||
#define AA_VALID_PERMS (AA_FILE_PERMS | AA_CHANGE_PROFILE)
|
#define AA_VALID_PERMS (AA_FILE_PERMS | AA_CHANGE_PROFILE)
|
||||||
|
|
||||||
#define AA_EXEC_BITS ((AA_MAY_EXEC << AA_USER_SHIFT) | \
|
#define AA_USER_EXEC (AA_MAY_EXEC << AA_USER_SHIFT)
|
||||||
(AA_MAY_EXEC << AA_OTHER_SHIFT))
|
#define AA_OTHER_EXEC (AA_MAY_EXEC << AA_OTHER_SHIFT)
|
||||||
|
|
||||||
|
#define AA_EXEC_BITS (AA_USER_EXEC | AA_OTHER_EXEC)
|
||||||
|
|
||||||
#define ALL_AA_EXEC_UNSAFE ((AA_EXEC_UNSAFE << AA_USER_SHIFT) | \
|
#define ALL_AA_EXEC_UNSAFE ((AA_EXEC_UNSAFE << AA_USER_SHIFT) | \
|
||||||
(AA_EXEC_UNSAFE << AA_OTHER_SHIFT))
|
(AA_EXEC_UNSAFE << AA_OTHER_SHIFT))
|
||||||
@@ -88,6 +95,8 @@
|
|||||||
#define AA_USER_EXEC_TYPE (AA_EXEC_TYPE << AA_USER_SHIFT)
|
#define AA_USER_EXEC_TYPE (AA_EXEC_TYPE << AA_USER_SHIFT)
|
||||||
#define AA_OTHER_EXEC_TYPE (AA_EXEC_TYPE << AA_OTHER_SHIFT)
|
#define AA_OTHER_EXEC_TYPE (AA_EXEC_TYPE << AA_OTHER_SHIFT)
|
||||||
|
|
||||||
|
#define ALL_AA_EXEC_TYPE (AA_USER_EXEC_TYPE | AA_OTHER_EXEC_TYPE)
|
||||||
|
|
||||||
#define AA_LINK_BITS ((AA_MAY_LINK << AA_USER_SHIFT) | \
|
#define AA_LINK_BITS ((AA_MAY_LINK << AA_USER_SHIFT) | \
|
||||||
(AA_MAY_LINK << AA_OTHER_SHIFT))
|
(AA_MAY_LINK << AA_OTHER_SHIFT))
|
||||||
|
|
||||||
@@ -102,6 +111,13 @@
|
|||||||
(AA_LINK_SUBSET_TEST << AA_OTHER_SHIFT))
|
(AA_LINK_SUBSET_TEST << AA_OTHER_SHIFT))
|
||||||
#define LINK_TO_LINK_SUBSET(X) (((X) << 1) & AA_LINK_SUBSET_TEST)
|
#define LINK_TO_LINK_SUBSET(X) (((X) << 1) & AA_LINK_SUBSET_TEST)
|
||||||
|
|
||||||
|
|
||||||
|
/* Pack the audit, and quiet masks into a single 28 bit field in the
|
||||||
|
* format oq:oa:uq:ua
|
||||||
|
*/
|
||||||
|
#define PACK_AUDIT_CTL(audit, quiet) (((audit) & 0x1fc07f) | \
|
||||||
|
(((quiet) & 0x1fc07f) << 7))
|
||||||
|
|
||||||
#define AA_HAT_SIZE 975 /* Maximum size of a subdomain
|
#define AA_HAT_SIZE 975 /* Maximum size of a subdomain
|
||||||
* ident (hat) */
|
* ident (hat) */
|
||||||
#define AA_IP_TCP 0x0001
|
#define AA_IP_TCP 0x0001
|
||||||
|
@@ -44,6 +44,8 @@ struct cod_entry {
|
|||||||
int mode; /* mode is 'or' of AA_* bits */
|
int mode; /* mode is 'or' of AA_* bits */
|
||||||
int deny; /* TRUE or FALSE */
|
int deny; /* TRUE or FALSE */
|
||||||
|
|
||||||
|
int subset;
|
||||||
|
|
||||||
pattern_t pattern_type;
|
pattern_t pattern_type;
|
||||||
struct cod_pattern pat;
|
struct cod_pattern pat;
|
||||||
|
|
||||||
|
@@ -59,6 +59,11 @@ static int file_comp(const void *c1, const void *c2)
|
|||||||
if (res)
|
if (res)
|
||||||
return res;
|
return res;
|
||||||
|
|
||||||
|
if ((*e1)->link_name)
|
||||||
|
res = (*e2)->subset - (*e1)->subset;
|
||||||
|
if (res)
|
||||||
|
return res;
|
||||||
|
|
||||||
return strcmp((*e1)->name, (*e2)->name);
|
return strcmp((*e1)->name, (*e2)->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -62,6 +62,7 @@ static struct keyword_table keyword_table[] = {
|
|||||||
{"unsafe", TOK_UNSAFE},
|
{"unsafe", TOK_UNSAFE},
|
||||||
{"link", TOK_LINK},
|
{"link", TOK_LINK},
|
||||||
{"owner", TOK_OWNER},
|
{"owner", TOK_OWNER},
|
||||||
|
{"subset", TOK_SUBSET},
|
||||||
/* terminate */
|
/* terminate */
|
||||||
{NULL, 0}
|
{NULL, 0}
|
||||||
};
|
};
|
||||||
|
@@ -515,6 +515,8 @@ static int process_dfa_entry(aare_ruleset_t *dfarules, struct cod_entry *entry)
|
|||||||
ptype = convert_aaregex_to_pcre(entry->link_name, 0, lbuf, PATH_MAX + 8);
|
ptype = convert_aaregex_to_pcre(entry->link_name, 0, lbuf, PATH_MAX + 8);
|
||||||
if (ptype == ePatternInvalid)
|
if (ptype == ePatternInvalid)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
if (entry->subset)
|
||||||
|
perms |= LINK_TO_LINK_SUBSET(perms);
|
||||||
vec[1] = lbuf;
|
vec[1] = lbuf;
|
||||||
} else {
|
} else {
|
||||||
perms |= LINK_TO_LINK_SUBSET(perms);
|
perms |= LINK_TO_LINK_SUBSET(perms);
|
||||||
|
@@ -95,6 +95,7 @@ struct cod_entry *do_file_rule(char *namespace, char *id, int mode,
|
|||||||
%token TOK_COLON
|
%token TOK_COLON
|
||||||
%token TOK_LINK
|
%token TOK_LINK
|
||||||
%token TOK_OWNER
|
%token TOK_OWNER
|
||||||
|
%token TOK_SUBSET
|
||||||
|
|
||||||
/* capabilities */
|
/* capabilities */
|
||||||
%token TOK_CAPABILITY
|
%token TOK_CAPABILITY
|
||||||
@@ -150,7 +151,7 @@ struct cod_entry *do_file_rule(char *namespace, char *id, int mode,
|
|||||||
%type <val_list> valuelist
|
%type <val_list> valuelist
|
||||||
%type <boolean> expr
|
%type <boolean> expr
|
||||||
%type <id> id_or_var
|
%type <id> id_or_var
|
||||||
|
%type <boolean> opt_subset_flag
|
||||||
%%
|
%%
|
||||||
|
|
||||||
|
|
||||||
@@ -357,6 +358,9 @@ flagval: TOK_FLAG_ID
|
|||||||
$$ = fv;
|
$$ = fv;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
opt_subset_flag: { /* nothing */ $$ = 0; }
|
||||||
|
| TOK_SUBSET { $$ = 1; }
|
||||||
|
|
||||||
rules: { /* nothing */
|
rules: { /* nothing */
|
||||||
struct codomain *cod = NULL;
|
struct codomain *cod = NULL;
|
||||||
cod = (struct codomain *) calloc(1, sizeof(struct codomain));
|
cod = (struct codomain *) calloc(1, sizeof(struct codomain));
|
||||||
@@ -585,27 +589,29 @@ rule: id_or_var file_mode id_or_var
|
|||||||
yyerror(_("missing an end of line character? (entry: %s)"), $1);
|
yyerror(_("missing an end of line character? (entry: %s)"), $1);
|
||||||
};
|
};
|
||||||
|
|
||||||
rule: TOK_LINK TOK_ID TOK_ARROW TOK_ID TOK_END_OF_RULE
|
rule: TOK_LINK opt_subset_flag TOK_ID TOK_ARROW TOK_ID TOK_END_OF_RULE
|
||||||
{
|
{
|
||||||
struct cod_entry *entry;
|
struct cod_entry *entry;
|
||||||
PDEBUG("Matched: link tok_id (%s) -> (%s)\n", $2, $4);
|
PDEBUG("Matched: link tok_id (%s) -> (%s)\n", $3, $5);
|
||||||
entry = new_entry(NULL, $2, AA_LINK_BITS, $4);
|
entry = new_entry(NULL, $3, AA_LINK_BITS, $5);
|
||||||
if (!entry)
|
if (!entry)
|
||||||
yyerror(_("Memory allocation error."));
|
yyerror(_("Memory allocation error."));
|
||||||
|
entry->subset = $2;
|
||||||
PDEBUG("rule.entry: link (%s)\n", entry->name);
|
PDEBUG("rule.entry: link (%s)\n", entry->name);
|
||||||
$$ = entry;
|
$$ = entry;
|
||||||
};
|
};
|
||||||
|
|
||||||
rule: TOK_LINK file_mode TOK_ID TOK_ARROW TOK_ID TOK_END_OF_RULE
|
rule: file_mode opt_subset_flag TOK_ID TOK_ARROW TOK_ID TOK_END_OF_RULE
|
||||||
{
|
{
|
||||||
struct cod_entry *entry;
|
struct cod_entry *entry;
|
||||||
PDEBUG("Matched: link tok_id (%s) -> (%s)\n", $3, $5);
|
PDEBUG("Matched: link tok_id (%s) -> (%s)\n", $3, $5);
|
||||||
if ($2 & ~AA_LINK_BITS) {
|
if ($1 & ~AA_LINK_BITS) {
|
||||||
yyerror(_("only link perms can be specified in a link rule."));
|
yyerror(_("only link perms can be specified in a link rule."));
|
||||||
} else {
|
} else {
|
||||||
entry = new_entry(NULL, $3, $2, $5);
|
entry = new_entry(NULL, $3, AA_LINK_BITS, $5);
|
||||||
if (!entry)
|
if (!entry)
|
||||||
yyerror(_("Memory allocation error."));
|
yyerror(_("Memory allocation error."));
|
||||||
|
entry->subset = $2;
|
||||||
}
|
}
|
||||||
PDEBUG("rule.entry: link (%s)\n", entry->name);
|
PDEBUG("rule.entry: link (%s)\n", entry->name);
|
||||||
$$ = entry;
|
$$ = entry;
|
||||||
|
Reference in New Issue
Block a user