All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] libsepol: drop confusing BUG_ON macro
@ 2020-10-03 19:39 Nicolas Iooss
  2020-10-03 19:39 ` [PATCH 2/2] libsepol: silence potential NULL pointer dereference warning Nicolas Iooss
  2020-10-15 17:00 ` [PATCH 1/2] libsepol: drop confusing BUG_ON macro James Carter
  0 siblings, 2 replies; 6+ messages in thread
From: Nicolas Iooss @ 2020-10-03 19:39 UTC (permalink / raw)
  To: selinux

Contrary to Linux kernel, BUG_ON() does not halt the execution, in
libsepol/src/services.c. Instead it displays an error message and
continues the execution.

This means that this code does not prevent an out-of-bound write from
happening:

    case CEXPR_AND:
        BUG_ON(sp < 1);
        sp--;
        s[sp] &= s[sp + 1];

Use if(...){BUG();rc=-EINVAL;goto out;} constructions instead, to make
sure that the array access is always in-bound.

This issue has been found using clang's static analyzer:
https://558-118970575-gh.circle-artifacts.com/0/output-scan-build/2020-10-02-065849-6375-1/report-50a861.html#EndPath

Signed-off-by: Nicolas Iooss <nicolas.iooss@m4x.org>
---
 libsepol/src/services.c | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/libsepol/src/services.c b/libsepol/src/services.c
index 90da1f4efef3..beb0711f6680 100644
--- a/libsepol/src/services.c
+++ b/libsepol/src/services.c
@@ -67,7 +67,6 @@
 #include "flask.h"
 
 #define BUG() do { ERR(NULL, "Badness at %s:%d", __FILE__, __LINE__); } while (0)
-#define BUG_ON(x) do { if (x) ERR(NULL, "Badness at %s:%d", __FILE__, __LINE__); } while (0)
 
 static int selinux_enforcing = 1;
 
@@ -469,18 +468,30 @@ static int constraint_expr_eval_reason(context_struct_t *scontext,
 		/* Now process each expression of the constraint */
 		switch (e->expr_type) {
 		case CEXPR_NOT:
-			BUG_ON(sp < 0);
+			if (sp < 0) {
+				BUG();
+				rc = -EINVAL;
+				goto out;
+			}
 			s[sp] = !s[sp];
 			cat_expr_buf(expr_list[expr_counter], "not");
 			break;
 		case CEXPR_AND:
-			BUG_ON(sp < 1);
+			if (sp < 1) {
+				BUG();
+				rc = -EINVAL;
+				goto out;
+			}
 			sp--;
 			s[sp] &= s[sp + 1];
 			cat_expr_buf(expr_list[expr_counter], "and");
 			break;
 		case CEXPR_OR:
-			BUG_ON(sp < 1);
+			if (sp < 1) {
+				BUG();
+				rc = -EINVAL;
+				goto out;
+			}
 			sp--;
 			s[sp] |= s[sp + 1];
 			cat_expr_buf(expr_list[expr_counter], "or");
-- 
2.28.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 2/2] libsepol: silence potential NULL pointer dereference warning
  2020-10-03 19:39 [PATCH 1/2] libsepol: drop confusing BUG_ON macro Nicolas Iooss
@ 2020-10-03 19:39 ` Nicolas Iooss
  2020-10-15 17:00   ` James Carter
  2020-10-15 17:00 ` [PATCH 1/2] libsepol: drop confusing BUG_ON macro James Carter
  1 sibling, 1 reply; 6+ messages in thread
From: Nicolas Iooss @ 2020-10-03 19:39 UTC (permalink / raw)
  To: selinux

When find_avtab_node() is called with key->specified & AVTAB_XPERMS and
xperms=NULL, xperms is being dereferenced. This is detected as a
"NULL pointer dereference issue" by static analyzers.

Even though it does not make much sense to call find_avtab_node() in a
way which triggers the NULL pointer dereference issue, static analyzers
have a hard time with calls such as:

    node = find_avtab_node(handle, avtab, &avkey, cond, NULL);

... where xperms=NULL.

So, make the function report an error instead of crashing.

Here is an example of report from clang's static analyzer:
https://558-118970575-gh.circle-artifacts.com/0/output-scan-build/2020-10-02-065849-6375-1/report-d86a57.html#EndPath

Signed-off-by: Nicolas Iooss <nicolas.iooss@m4x.org>
---
 libsepol/src/expand.c | 23 ++++++++++++++---------
 1 file changed, 14 insertions(+), 9 deletions(-)

diff --git a/libsepol/src/expand.c b/libsepol/src/expand.c
index 19e48c507236..eac7e4507d02 100644
--- a/libsepol/src/expand.c
+++ b/libsepol/src/expand.c
@@ -1570,17 +1570,22 @@ static avtab_ptr_t find_avtab_node(sepol_handle_t * handle,
 
 	/* AVTAB_XPERMS entries are not necessarily unique */
 	if (key->specified & AVTAB_XPERMS) {
-		node = avtab_search_node(avtab, key);
-		while (node) {
-			if ((node->datum.xperms->specified == xperms->specified) &&
-				(node->datum.xperms->driver == xperms->driver)) {
-				match = 1;
-				break;
+		if (xperms == NULL) {
+			ERR(handle, "searching xperms NULL");
+			node = NULL;
+		} else {
+			node = avtab_search_node(avtab, key);
+			while (node) {
+				if ((node->datum.xperms->specified == xperms->specified) &&
+					(node->datum.xperms->driver == xperms->driver)) {
+					match = 1;
+					break;
+				}
+				node = avtab_search_node_next(node, key->specified);
 			}
-			node = avtab_search_node_next(node, key->specified);
+			if (!match)
+				node = NULL;
 		}
-		if (!match)
-			node = NULL;
 	} else {
 		node = avtab_search_node(avtab, key);
 	}
-- 
2.28.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/2] libsepol: drop confusing BUG_ON macro
  2020-10-03 19:39 [PATCH 1/2] libsepol: drop confusing BUG_ON macro Nicolas Iooss
  2020-10-03 19:39 ` [PATCH 2/2] libsepol: silence potential NULL pointer dereference warning Nicolas Iooss
@ 2020-10-15 17:00 ` James Carter
  2020-10-19 21:28   ` Nicolas Iooss
  1 sibling, 1 reply; 6+ messages in thread
From: James Carter @ 2020-10-15 17:00 UTC (permalink / raw)
  To: Nicolas Iooss; +Cc: SElinux list

On Sat, Oct 3, 2020 at 3:40 PM Nicolas Iooss <nicolas.iooss@m4x.org> wrote:
>
> Contrary to Linux kernel, BUG_ON() does not halt the execution, in
> libsepol/src/services.c. Instead it displays an error message and
> continues the execution.
>
> This means that this code does not prevent an out-of-bound write from
> happening:
>
>     case CEXPR_AND:
>         BUG_ON(sp < 1);
>         sp--;
>         s[sp] &= s[sp + 1];
>
> Use if(...){BUG();rc=-EINVAL;goto out;} constructions instead, to make
> sure that the array access is always in-bound.
>
> This issue has been found using clang's static analyzer:
> https://558-118970575-gh.circle-artifacts.com/0/output-scan-build/2020-10-02-065849-6375-1/report-50a861.html#EndPath
>
> Signed-off-by: Nicolas Iooss <nicolas.iooss@m4x.org>

Acked-by: James Carter <jwcart2@gmail.com>

> ---
>  libsepol/src/services.c | 19 +++++++++++++++----
>  1 file changed, 15 insertions(+), 4 deletions(-)
>
> diff --git a/libsepol/src/services.c b/libsepol/src/services.c
> index 90da1f4efef3..beb0711f6680 100644
> --- a/libsepol/src/services.c
> +++ b/libsepol/src/services.c
> @@ -67,7 +67,6 @@
>  #include "flask.h"
>
>  #define BUG() do { ERR(NULL, "Badness at %s:%d", __FILE__, __LINE__); } while (0)
> -#define BUG_ON(x) do { if (x) ERR(NULL, "Badness at %s:%d", __FILE__, __LINE__); } while (0)
>
>  static int selinux_enforcing = 1;
>
> @@ -469,18 +468,30 @@ static int constraint_expr_eval_reason(context_struct_t *scontext,
>                 /* Now process each expression of the constraint */
>                 switch (e->expr_type) {
>                 case CEXPR_NOT:
> -                       BUG_ON(sp < 0);
> +                       if (sp < 0) {
> +                               BUG();
> +                               rc = -EINVAL;
> +                               goto out;
> +                       }
>                         s[sp] = !s[sp];
>                         cat_expr_buf(expr_list[expr_counter], "not");
>                         break;
>                 case CEXPR_AND:
> -                       BUG_ON(sp < 1);
> +                       if (sp < 1) {
> +                               BUG();
> +                               rc = -EINVAL;
> +                               goto out;
> +                       }
>                         sp--;
>                         s[sp] &= s[sp + 1];
>                         cat_expr_buf(expr_list[expr_counter], "and");
>                         break;
>                 case CEXPR_OR:
> -                       BUG_ON(sp < 1);
> +                       if (sp < 1) {
> +                               BUG();
> +                               rc = -EINVAL;
> +                               goto out;
> +                       }
>                         sp--;
>                         s[sp] |= s[sp + 1];
>                         cat_expr_buf(expr_list[expr_counter], "or");
> --
> 2.28.0
>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 2/2] libsepol: silence potential NULL pointer dereference warning
  2020-10-03 19:39 ` [PATCH 2/2] libsepol: silence potential NULL pointer dereference warning Nicolas Iooss
@ 2020-10-15 17:00   ` James Carter
  2020-10-19 21:29     ` Nicolas Iooss
  0 siblings, 1 reply; 6+ messages in thread
From: James Carter @ 2020-10-15 17:00 UTC (permalink / raw)
  To: Nicolas Iooss; +Cc: SElinux list

On Sat, Oct 3, 2020 at 3:41 PM Nicolas Iooss <nicolas.iooss@m4x.org> wrote:
>
> When find_avtab_node() is called with key->specified & AVTAB_XPERMS and
> xperms=NULL, xperms is being dereferenced. This is detected as a
> "NULL pointer dereference issue" by static analyzers.
>
> Even though it does not make much sense to call find_avtab_node() in a
> way which triggers the NULL pointer dereference issue, static analyzers
> have a hard time with calls such as:
>
>     node = find_avtab_node(handle, avtab, &avkey, cond, NULL);
>
> ... where xperms=NULL.
>
> So, make the function report an error instead of crashing.
>
> Here is an example of report from clang's static analyzer:
> https://558-118970575-gh.circle-artifacts.com/0/output-scan-build/2020-10-02-065849-6375-1/report-d86a57.html#EndPath
>
> Signed-off-by: Nicolas Iooss <nicolas.iooss@m4x.org>

Acked-by: James Carter <jwcart2@gmail.com>

> ---
>  libsepol/src/expand.c | 23 ++++++++++++++---------
>  1 file changed, 14 insertions(+), 9 deletions(-)
>
> diff --git a/libsepol/src/expand.c b/libsepol/src/expand.c
> index 19e48c507236..eac7e4507d02 100644
> --- a/libsepol/src/expand.c
> +++ b/libsepol/src/expand.c
> @@ -1570,17 +1570,22 @@ static avtab_ptr_t find_avtab_node(sepol_handle_t * handle,
>
>         /* AVTAB_XPERMS entries are not necessarily unique */
>         if (key->specified & AVTAB_XPERMS) {
> -               node = avtab_search_node(avtab, key);
> -               while (node) {
> -                       if ((node->datum.xperms->specified == xperms->specified) &&
> -                               (node->datum.xperms->driver == xperms->driver)) {
> -                               match = 1;
> -                               break;
> +               if (xperms == NULL) {
> +                       ERR(handle, "searching xperms NULL");
> +                       node = NULL;
> +               } else {
> +                       node = avtab_search_node(avtab, key);
> +                       while (node) {
> +                               if ((node->datum.xperms->specified == xperms->specified) &&
> +                                       (node->datum.xperms->driver == xperms->driver)) {
> +                                       match = 1;
> +                                       break;
> +                               }
> +                               node = avtab_search_node_next(node, key->specified);
>                         }
> -                       node = avtab_search_node_next(node, key->specified);
> +                       if (!match)
> +                               node = NULL;
>                 }
> -               if (!match)
> -                       node = NULL;
>         } else {
>                 node = avtab_search_node(avtab, key);
>         }
> --
> 2.28.0
>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/2] libsepol: drop confusing BUG_ON macro
  2020-10-15 17:00 ` [PATCH 1/2] libsepol: drop confusing BUG_ON macro James Carter
@ 2020-10-19 21:28   ` Nicolas Iooss
  0 siblings, 0 replies; 6+ messages in thread
From: Nicolas Iooss @ 2020-10-19 21:28 UTC (permalink / raw)
  To: James Carter; +Cc: SElinux list

On Thu, Oct 15, 2020 at 7:00 PM James Carter <jwcart2@gmail.com> wrote:
>
> On Sat, Oct 3, 2020 at 3:40 PM Nicolas Iooss <nicolas.iooss@m4x.org> wrote:
> >
> > Contrary to Linux kernel, BUG_ON() does not halt the execution, in
> > libsepol/src/services.c. Instead it displays an error message and
> > continues the execution.
> >
> > This means that this code does not prevent an out-of-bound write from
> > happening:
> >
> >     case CEXPR_AND:
> >         BUG_ON(sp < 1);
> >         sp--;
> >         s[sp] &= s[sp + 1];
> >
> > Use if(...){BUG();rc=-EINVAL;goto out;} constructions instead, to make
> > sure that the array access is always in-bound.
> >
> > This issue has been found using clang's static analyzer:
> > https://558-118970575-gh.circle-artifacts.com/0/output-scan-build/2020-10-02-065849-6375-1/report-50a861.html#EndPath
> >
> > Signed-off-by: Nicolas Iooss <nicolas.iooss@m4x.org>
>
> Acked-by: James Carter <jwcart2@gmail.com>

Thanks. Merged.

Nicolas
>
> > ---
> >  libsepol/src/services.c | 19 +++++++++++++++----
> >  1 file changed, 15 insertions(+), 4 deletions(-)
> >
> > diff --git a/libsepol/src/services.c b/libsepol/src/services.c
> > index 90da1f4efef3..beb0711f6680 100644
> > --- a/libsepol/src/services.c
> > +++ b/libsepol/src/services.c
> > @@ -67,7 +67,6 @@
> >  #include "flask.h"
> >
> >  #define BUG() do { ERR(NULL, "Badness at %s:%d", __FILE__, __LINE__); } while (0)
> > -#define BUG_ON(x) do { if (x) ERR(NULL, "Badness at %s:%d", __FILE__, __LINE__); } while (0)
> >
> >  static int selinux_enforcing = 1;
> >
> > @@ -469,18 +468,30 @@ static int constraint_expr_eval_reason(context_struct_t *scontext,
> >                 /* Now process each expression of the constraint */
> >                 switch (e->expr_type) {
> >                 case CEXPR_NOT:
> > -                       BUG_ON(sp < 0);
> > +                       if (sp < 0) {
> > +                               BUG();
> > +                               rc = -EINVAL;
> > +                               goto out;
> > +                       }
> >                         s[sp] = !s[sp];
> >                         cat_expr_buf(expr_list[expr_counter], "not");
> >                         break;
> >                 case CEXPR_AND:
> > -                       BUG_ON(sp < 1);
> > +                       if (sp < 1) {
> > +                               BUG();
> > +                               rc = -EINVAL;
> > +                               goto out;
> > +                       }
> >                         sp--;
> >                         s[sp] &= s[sp + 1];
> >                         cat_expr_buf(expr_list[expr_counter], "and");
> >                         break;
> >                 case CEXPR_OR:
> > -                       BUG_ON(sp < 1);
> > +                       if (sp < 1) {
> > +                               BUG();
> > +                               rc = -EINVAL;
> > +                               goto out;
> > +                       }
> >                         sp--;
> >                         s[sp] |= s[sp + 1];
> >                         cat_expr_buf(expr_list[expr_counter], "or");
> > --
> > 2.28.0
> >


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 2/2] libsepol: silence potential NULL pointer dereference warning
  2020-10-15 17:00   ` James Carter
@ 2020-10-19 21:29     ` Nicolas Iooss
  0 siblings, 0 replies; 6+ messages in thread
From: Nicolas Iooss @ 2020-10-19 21:29 UTC (permalink / raw)
  To: James Carter; +Cc: SElinux list

On Thu, Oct 15, 2020 at 7:00 PM James Carter <jwcart2@gmail.com> wrote:
>
> On Sat, Oct 3, 2020 at 3:41 PM Nicolas Iooss <nicolas.iooss@m4x.org> wrote:
> >
> > When find_avtab_node() is called with key->specified & AVTAB_XPERMS and
> > xperms=NULL, xperms is being dereferenced. This is detected as a
> > "NULL pointer dereference issue" by static analyzers.
> >
> > Even though it does not make much sense to call find_avtab_node() in a
> > way which triggers the NULL pointer dereference issue, static analyzers
> > have a hard time with calls such as:
> >
> >     node = find_avtab_node(handle, avtab, &avkey, cond, NULL);
> >
> > ... where xperms=NULL.
> >
> > So, make the function report an error instead of crashing.
> >
> > Here is an example of report from clang's static analyzer:
> > https://558-118970575-gh.circle-artifacts.com/0/output-scan-build/2020-10-02-065849-6375-1/report-d86a57.html#EndPath
> >
> > Signed-off-by: Nicolas Iooss <nicolas.iooss@m4x.org>
>
> Acked-by: James Carter <jwcart2@gmail.com>

Thanks. Merged.

Nicolas

> > ---
> >  libsepol/src/expand.c | 23 ++++++++++++++---------
> >  1 file changed, 14 insertions(+), 9 deletions(-)
> >
> > diff --git a/libsepol/src/expand.c b/libsepol/src/expand.c
> > index 19e48c507236..eac7e4507d02 100644
> > --- a/libsepol/src/expand.c
> > +++ b/libsepol/src/expand.c
> > @@ -1570,17 +1570,22 @@ static avtab_ptr_t find_avtab_node(sepol_handle_t * handle,
> >
> >         /* AVTAB_XPERMS entries are not necessarily unique */
> >         if (key->specified & AVTAB_XPERMS) {
> > -               node = avtab_search_node(avtab, key);
> > -               while (node) {
> > -                       if ((node->datum.xperms->specified == xperms->specified) &&
> > -                               (node->datum.xperms->driver == xperms->driver)) {
> > -                               match = 1;
> > -                               break;
> > +               if (xperms == NULL) {
> > +                       ERR(handle, "searching xperms NULL");
> > +                       node = NULL;
> > +               } else {
> > +                       node = avtab_search_node(avtab, key);
> > +                       while (node) {
> > +                               if ((node->datum.xperms->specified == xperms->specified) &&
> > +                                       (node->datum.xperms->driver == xperms->driver)) {
> > +                                       match = 1;
> > +                                       break;
> > +                               }
> > +                               node = avtab_search_node_next(node, key->specified);
> >                         }
> > -                       node = avtab_search_node_next(node, key->specified);
> > +                       if (!match)
> > +                               node = NULL;
> >                 }
> > -               if (!match)
> > -                       node = NULL;
> >         } else {
> >                 node = avtab_search_node(avtab, key);
> >         }
> > --
> > 2.28.0
> >


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2020-10-19 21:38 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-10-03 19:39 [PATCH 1/2] libsepol: drop confusing BUG_ON macro Nicolas Iooss
2020-10-03 19:39 ` [PATCH 2/2] libsepol: silence potential NULL pointer dereference warning Nicolas Iooss
2020-10-15 17:00   ` James Carter
2020-10-19 21:29     ` Nicolas Iooss
2020-10-15 17:00 ` [PATCH 1/2] libsepol: drop confusing BUG_ON macro James Carter
2020-10-19 21:28   ` Nicolas Iooss

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.