lkml.org 
[lkml]   [2021]   [Sep]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 047/175] udf_get_extendedattr() had no boundary checks.
    Date
    From: Stian Skjelstad <stian.skjelstad@gmail.com>

    [ Upstream commit 58bc6d1be2f3b0ceecb6027dfa17513ec6aa2abb ]

    When parsing the ExtendedAttr data, malicous or corrupt attribute length
    could cause kernel hangs and buffer overruns in some special cases.

    Link: https://lore.kernel.org/r/20210822093332.25234-1-stian.skjelstad@gmail.com
    Signed-off-by: Stian Skjelstad <stian.skjelstad@gmail.com>
    Signed-off-by: Jan Kara <jack@suse.cz>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    fs/udf/misc.c | 13 +++++++++++--
    1 file changed, 11 insertions(+), 2 deletions(-)

    diff --git a/fs/udf/misc.c b/fs/udf/misc.c
    index 71d1c25f360d..8c7f9ea251e5 100644
    --- a/fs/udf/misc.c
    +++ b/fs/udf/misc.c
    @@ -175,13 +175,22 @@ struct genericFormat *udf_get_extendedattr(struct inode *inode, uint32_t type,
    else
    offset = le32_to_cpu(eahd->appAttrLocation);

    - while (offset < iinfo->i_lenEAttr) {
    + while (offset + sizeof(*gaf) < iinfo->i_lenEAttr) {
    + uint32_t attrLength;
    +
    gaf = (struct genericFormat *)&ea[offset];
    + attrLength = le32_to_cpu(gaf->attrLength);
    +
    + /* Detect undersized elements and buffer overflows */
    + if ((attrLength < sizeof(*gaf)) ||
    + (attrLength > (iinfo->i_lenEAttr - offset)))
    + break;
    +
    if (le32_to_cpu(gaf->attrType) == type &&
    gaf->attrSubtype == subtype)
    return gaf;
    else
    - offset += le32_to_cpu(gaf->attrLength);
    + offset += attrLength;
    }
    }

    --
    2.30.2


    \
     
     \ /
      Last update: 2021-09-20 19:07    [W:7.800 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site