From: Dominick Grift <dominick.grift@defensec.nl>
To: James Carter <jwcart2@gmail.com>
Cc: selinux@vger.kernel.org
Subject: Re: [PATCH 1/2] libsepol/cil: Fix name resolution involving inherited blocks
Date: Thu, 06 May 2021 19:37:00 +0200 [thread overview]
Message-ID: <87wnsbsr0j.fsf@defensec.nl> (raw)
In-Reply-To: <20210506170537.146337-1-jwcart2@gmail.com> (James Carter's message of "Thu, 6 May 2021 13:05:36 -0400")
James Carter <jwcart2@gmail.com> writes:
> When resolving a name in a block that has been inherited. First,
> a search is done in the parent namespaces (if any) of the
> blockinherit rule with the exception of the global namespace. If
> the name is not found, then a search is done in the namespaces of
> the original block (starting with that block's namespace) with
> the exception of the global namespace. Finally, if it still has
> not been found, the global namespace is searched.
>
> This does not work if a declaration is in the block being
> inherited.
>
This example does not make sense to me
1. you shouldnt be allowed to inherit a block that is not abstracted:
(block b) does not have a (blockabstract b)
2. the a typeattribute is not associated with any types and so the
compiler would filter it out since its useless
I tried it out here and surprisingly the compiler does not fail, but no
policy ends up in the result, so I do not know how you get to those results
> For example:
> (block b
> (typeattribute a)
> (allow a self (CLASS (PERM)))
> )
> (blockinherit b)
>
> This will result in a policy with the following identical allow
> rules:
> (allow b.a self (CLASS (PERM)))
> (allow b.a self (CLASS (PERM)))
> rather than the expected:
> (allow b.a self (CLASS (PERM)))
> (allow a self (CLASS (PERM)))
> This is because when the typeattribute is copied while resolving
> the inheritance, the new datum is added to the global namespace
> and, since that is searched last, the typeattribute in block b is
> found first.
>
> This behavior means that no declaration that is inherited into the
> global namespace will actually be used.
>
> Instead, if the name is not found in the parent namespaces (if any)
> where the blockinherit is located with the exception of the global
> namespace, start the next search in the namespace of the parent of
> the original block (instead of the original block itself). Now if
> a declaration is inherited from the original block, the new
> declaration will be used. This behavior seems to be the originally
> intended behavior because there is a comment in the code that says,
> "Continue search in original block's parent".
>
> This issue was found by secilc-fuzzer. If the original block
> is made to be abstract, then the type attribute declaration
> in the original block is not in the policy and a segfault
> occurs when creating the binary because the copied allow rule
> refers to a non-existent type attribute.
>
> Signed-off-by: James Carter <jwcart2@gmail.com>
> ---
> libsepol/cil/src/cil_resolve_ast.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/libsepol/cil/src/cil_resolve_ast.c b/libsepol/cil/src/cil_resolve_ast.c
> index f251ed15..55080396 100644
> --- a/libsepol/cil/src/cil_resolve_ast.c
> +++ b/libsepol/cil/src/cil_resolve_ast.c
> @@ -4211,7 +4211,7 @@ static int __cil_resolve_name_with_parents(struct cil_tree_node *node, char *nam
> rc = __cil_resolve_name_with_parents(node->parent, name, sym_index, datum);
> if (rc != SEPOL_OK) {
> /* Continue search in original block's parent */
> - rc = __cil_resolve_name_with_parents(NODE(inherit->block), name, sym_index, datum);
> + rc = __cil_resolve_name_with_parents(NODE(inherit->block)->parent, name, sym_index, datum);
> goto exit;
> }
> }
--
gpg --locate-keys dominick.grift@defensec.nl
Key fingerprint = FCD2 3660 5D6B 9D27 7FC6 E0FF DA7E 521F 10F6 4098
https://sks-keyservers.net/pks/lookup?op=get&search=0xDA7E521F10F64098
Dominick Grift
next prev parent reply other threads:[~2021-05-06 17:37 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-05-06 17:05 [PATCH 1/2] libsepol/cil: Fix name resolution involving inherited blocks James Carter
2021-05-06 17:05 ` [PATCH 2/2] secilc/docs: Document the order that inherited rules are resolved in James Carter
2021-05-31 12:05 ` Petr Lautrbach
2021-05-06 17:37 ` Dominick Grift [this message]
2021-05-06 18:46 ` [PATCH 1/2] libsepol/cil: Fix name resolution involving inherited blocks James Carter
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87wnsbsr0j.fsf@defensec.nl \
--to=dominick.grift@defensec.nl \
--cc=jwcart2@gmail.com \
--cc=selinux@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.