From: Stephen Smalley <sds@tycho.nsa.gov>
To: Richard Haines <richard_c_haines@btinternet.com>, selinux@tycho.nsa.gov
Subject: Re: [PATCH] libselinux: Fix core dumps with corrupt *.bin files
Date: Thu, 07 May 2015 13:24:05 -0400 [thread overview]
Message-ID: <554B9FB5.40408@tycho.nsa.gov> (raw)
In-Reply-To: <1431009653-7230-1-git-send-email-richard_c_haines@btinternet.com>
On 05/07/2015 10:40 AM, Richard Haines wrote:
> Check buffer address limits when processing *.bin files
> to catch any over-runs. On failure process text file instead.
>
> To test, the bin files were corrupted by adding and removing
> various bits of data. Various file sizes were also checked and
> all were caught by the patch.
>
> Signed-off-by: Richard Haines <richard_c_haines@btinternet.com>
Thanks, applied, but see below.
> ---
> libselinux/src/label_file.c | 10 ++++++++++
> 1 file changed, 10 insertions(+)
>
> diff --git a/libselinux/src/label_file.c b/libselinux/src/label_file.c
> index b3e5671..c722f29 100644
> --- a/libselinux/src/label_file.c
> +++ b/libselinux/src/label_file.c
> @@ -325,6 +325,8 @@ static int load_mmap(struct selabel_handle *rec, const char *path, struct stat *
> addr += sizeof(uint32_t);
> if (memcmp((char *)addr, pcre_version(), len))
> return -1; /* pcre version content mismatch */
> + if (addr + *plen >= (char *)mmap_area->addr + mmap_area->len)
> + return -1; /* Buffer over-run */
Technically this is too late; it already read *plen bytes starting at
addr via the memcmp above. Also, what happens if *plen is large and
(addr + *plen) overflows? Compare with the checking performed on every
fetch from the policy image via next_entry() in libsepol in the
PF_USE_MEMORY case, which is likewise loading from an in-memory policy
whether mmap'd or otherwise.
> addr += *plen;
> }
>
> @@ -390,11 +392,15 @@ static int load_mmap(struct selabel_handle *rec, const char *path, struct stat *
> if (!spec->lr.ctx_raw)
> goto err;
>
> + if (addr + *plen >= (char *)mmap_area->addr + mmap_area->len)
> + return -1;
Similarly, too late. Worse, the preceding code did a strdup() on the
addr without ever validating that it was NUL terminated. Also seem to
be missing corresponding checking for the earlier stem reading code.
> addr += *plen;
>
> plen = (uint32_t *)addr;
> addr += sizeof(uint32_t);
> spec->regex_str = (char *)addr;
> + if (addr + *plen >= (char *)mmap_area->addr + mmap_area->len)
> + return -1;
Not too late since we haven't yet dereferenced it, but no validation
that regex_str is NUL-terminated.
> addr += *plen;
>
> spec->mode = *(mode_t *)addr;
> @@ -415,12 +421,16 @@ static int load_mmap(struct selabel_handle *rec, const char *path, struct stat *
> plen = (uint32_t *)addr;
> addr += sizeof(uint32_t);
> spec->regex = (pcre *)addr;
> + if (addr + *plen >= (char *)mmap_area->addr + mmap_area->len)
> + return -1;
> addr += *plen;
>
> plen = (uint32_t *)addr;
> addr += sizeof(uint32_t);
> spec->lsd.study_data = (void *)addr;
> spec->lsd.flags |= PCRE_EXTRA_STUDY_DATA;
> + if (addr + *plen >= (char *)mmap_area->addr + mmap_area->len)
> + return -1;
> addr += *plen;
>
> data->nspec++;
>
next prev parent reply other threads:[~2015-05-07 17:24 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-07 14:40 [PATCH] libselinux: Fix core dumps with corrupt *.bin files Richard Haines
2015-05-07 17:24 ` Stephen Smalley [this message]
2015-05-08 9:59 ` Richard Haines
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=554B9FB5.40408@tycho.nsa.gov \
--to=sds@tycho.nsa.gov \
--cc=richard_c_haines@btinternet.com \
--cc=selinux@tycho.nsa.gov \
/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.