On Tue, Sep 2, 2025 at 7:00 AM Stanislav Fort <stanislav.f...@aisle.com> wrote: > > When a watch on dir=/ is combined with an fsnotify event for a > single-character name directly under / (e.g., creating /a), an > out-of-bounds read can occur in audit_compare_dname_path(). > > The helper parent_len() returns 1 for "/". In audit_compare_dname_path(), > when parentlen equals the full path length (1), the code sets p = path + 1 > and pathlen = 1 - 1 = 0. The subsequent loop then dereferences > p[pathlen - 1] (i.e., p[-1]), causing an out-of-bounds read. > > Fix this by adding a pathlen > 0 check to the while loop condition > to prevent the out-of-bounds access. > > Reported-by: Stanislav Fort <disclos...@aisle.com> > Suggested-by: Linus Torvalds <torva...@linuxfoundation.org> > Signed-off-by: Stanislav Fort <disclos...@aisle.com> > --- > kernel/auditfilter.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-)
Thanks Stanislav. It looks like this problem was likely introduced in e92eebb0d611 ("audit: fix suffixed '/' filename matching"), I'll add a 'Fixes:' and a stable tag. I'm building a test kernel right now to test things, but did you verify that the path matching fixed in e92eebb0d611 still works correctly? > diff --git a/kernel/auditfilter.c b/kernel/auditfilter.c > index e3f42018ed46..f7708fe2c457 100644 > --- a/kernel/auditfilter.c > +++ b/kernel/auditfilter.c > @@ -1326,7 +1326,7 @@ int audit_compare_dname_path(const struct qstr *dname, > const char *path, int par > > /* handle trailing slashes */ > pathlen -= parentlen; > - while (p[pathlen - 1] == '/') > + while (pathlen > 0 && p[pathlen - 1] == '/') > pathlen--; > > if (pathlen != dlen) > -- > 2.39.3 (Apple Git-146) -- paul-moore.com