From: Kees Cook <keescook@chromium.org>
To: "Gustavo A. R. Silva" <gustavoars@kernel.org>
Cc: Michael Turquette <mturquette@baylibre.com>,
Stephen Boyd <sboyd@kernel.org>,
Nobuhiro Iwamatsu <nobuhiro1.iwamatsu@toshiba.co.jp>,
linux-clk@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, linux-hardening@vger.kernel.org
Subject: Re: [PATCH 1/2][next] clk: visconti: Fix undefined behavior bug in struct visconti_pll_provider
Date: Thu, 12 Oct 2023 09:21:28 -0700 [thread overview]
Message-ID: <202310120921.08062349C7@keescook> (raw)
In-Reply-To: <0a59a721d54b557076cc94eabeb694d463773204.1697076650.git.gustavoars@kernel.org>
On Wed, Oct 11, 2023 at 08:17:36PM -0600, Gustavo A. R. Silva wrote:
> `struct clk_hw_onecell_data` is a flexible structure, which means that
> it contains flexible-array member at the bottom, in this case array
> `hws`:
>
> include/linux/clk-provider.h:
> 1380 struct clk_hw_onecell_data {
> 1381 unsigned int num;
> 1382 struct clk_hw *hws[] __counted_by(num);
> 1383 };
>
> This could potentially lead to an overwrite of the objects following
> `clk_data` in `struct visconti_pll_provider`, in this case
> `struct device_node *node;`, at run-time:
>
> drivers/clk/visconti/pll.h:
> 16 struct visconti_pll_provider {
> 17 void __iomem *reg_base;
> 18 struct clk_hw_onecell_data clk_data;
> 19 struct device_node *node;
> 20 };
>
> Notice that a total of 56 bytes are allocated for flexible-array `hws`
> at line 328. See below:
>
> include/dt-bindings/clock/toshiba,tmpv770x.h:
> 14 #define TMPV770X_NR_PLL 7
>
> drivers/clk/visconti/pll-tmpv770x.c:
> 69 ctx = visconti_init_pll(np, reg_base, TMPV770X_NR_PLL);
>
> drivers/clk/visconti/pll.c:
> 321 struct visconti_pll_provider * __init visconti_init_pll(struct device_node *np,
> 322 void __iomem *base,
> 323 unsigned long nr_plls)
> 324 {
> 325 struct visconti_pll_provider *ctx;
> ...
> 328 ctx = kzalloc(struct_size(ctx, clk_data.hws, nr_plls), GFP_KERNEL);
>
> `struct_size(ctx, clk_data.hws, nr_plls)` above translates to
> sizeof(struct visconti_pll_provider) + sizeof(struct clk_hw *) * 7 ==
> 24 + 8 * 7 == 24 + 56
> ^^^^
> |
> allocated bytes for flex array `hws`
>
> $ pahole -C visconti_pll_provider drivers/clk/visconti/pll.o
> struct visconti_pll_provider {
> void * reg_base; /* 0 8 */
> struct clk_hw_onecell_data clk_data; /* 8 8 */
> struct device_node * node; /* 16 8 */
>
> /* size: 24, cachelines: 1, members: 3 */
> /* last cacheline: 24 bytes */
> };
>
> And then, after the allocation, some data is written into all members
> of `struct visconti_pll_provider`:
>
> 332 for (i = 0; i < nr_plls; ++i)
> 333 ctx->clk_data.hws[i] = ERR_PTR(-ENOENT);
> 334
> 335 ctx->node = np;
> 336 ctx->reg_base = base;
> 337 ctx->clk_data.num = nr_plls;
>
> Fix all these by placing the declaration of object `clk_data` at the
> end of `struct visconti_pll_provider`. Also, add a comment to make it
> clear that this object must always be last in the structure, and
> prevent this bug from being introduced again in the future.
>
> Fixes: b4cbe606dc36 ("clk: visconti: Add support common clock driver and reset driver")
> Cc: stable@vger.kernel.org
> Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
Another good catch. :)
Reviewed-by: Kees Cook <keescook@chromium.org>
--
Kees Cook
WARNING: multiple messages have this Message-ID (diff)
From: Kees Cook <keescook@chromium.org>
To: "Gustavo A. R. Silva" <gustavoars@kernel.org>
Cc: Michael Turquette <mturquette@baylibre.com>,
Stephen Boyd <sboyd@kernel.org>,
Nobuhiro Iwamatsu <nobuhiro1.iwamatsu@toshiba.co.jp>,
linux-clk@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, linux-hardening@vger.kernel.org
Subject: Re: [PATCH 1/2][next] clk: visconti: Fix undefined behavior bug in struct visconti_pll_provider
Date: Thu, 12 Oct 2023 09:21:28 -0700 [thread overview]
Message-ID: <202310120921.08062349C7@keescook> (raw)
In-Reply-To: <0a59a721d54b557076cc94eabeb694d463773204.1697076650.git.gustavoars@kernel.org>
On Wed, Oct 11, 2023 at 08:17:36PM -0600, Gustavo A. R. Silva wrote:
> `struct clk_hw_onecell_data` is a flexible structure, which means that
> it contains flexible-array member at the bottom, in this case array
> `hws`:
>
> include/linux/clk-provider.h:
> 1380 struct clk_hw_onecell_data {
> 1381 unsigned int num;
> 1382 struct clk_hw *hws[] __counted_by(num);
> 1383 };
>
> This could potentially lead to an overwrite of the objects following
> `clk_data` in `struct visconti_pll_provider`, in this case
> `struct device_node *node;`, at run-time:
>
> drivers/clk/visconti/pll.h:
> 16 struct visconti_pll_provider {
> 17 void __iomem *reg_base;
> 18 struct clk_hw_onecell_data clk_data;
> 19 struct device_node *node;
> 20 };
>
> Notice that a total of 56 bytes are allocated for flexible-array `hws`
> at line 328. See below:
>
> include/dt-bindings/clock/toshiba,tmpv770x.h:
> 14 #define TMPV770X_NR_PLL 7
>
> drivers/clk/visconti/pll-tmpv770x.c:
> 69 ctx = visconti_init_pll(np, reg_base, TMPV770X_NR_PLL);
>
> drivers/clk/visconti/pll.c:
> 321 struct visconti_pll_provider * __init visconti_init_pll(struct device_node *np,
> 322 void __iomem *base,
> 323 unsigned long nr_plls)
> 324 {
> 325 struct visconti_pll_provider *ctx;
> ...
> 328 ctx = kzalloc(struct_size(ctx, clk_data.hws, nr_plls), GFP_KERNEL);
>
> `struct_size(ctx, clk_data.hws, nr_plls)` above translates to
> sizeof(struct visconti_pll_provider) + sizeof(struct clk_hw *) * 7 ==
> 24 + 8 * 7 == 24 + 56
> ^^^^
> |
> allocated bytes for flex array `hws`
>
> $ pahole -C visconti_pll_provider drivers/clk/visconti/pll.o
> struct visconti_pll_provider {
> void * reg_base; /* 0 8 */
> struct clk_hw_onecell_data clk_data; /* 8 8 */
> struct device_node * node; /* 16 8 */
>
> /* size: 24, cachelines: 1, members: 3 */
> /* last cacheline: 24 bytes */
> };
>
> And then, after the allocation, some data is written into all members
> of `struct visconti_pll_provider`:
>
> 332 for (i = 0; i < nr_plls; ++i)
> 333 ctx->clk_data.hws[i] = ERR_PTR(-ENOENT);
> 334
> 335 ctx->node = np;
> 336 ctx->reg_base = base;
> 337 ctx->clk_data.num = nr_plls;
>
> Fix all these by placing the declaration of object `clk_data` at the
> end of `struct visconti_pll_provider`. Also, add a comment to make it
> clear that this object must always be last in the structure, and
> prevent this bug from being introduced again in the future.
>
> Fixes: b4cbe606dc36 ("clk: visconti: Add support common clock driver and reset driver")
> Cc: stable@vger.kernel.org
> Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
Another good catch. :)
Reviewed-by: Kees Cook <keescook@chromium.org>
--
Kees Cook
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2023-10-12 16:21 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-12 2:14 [PATCH 0/2][next] clk: visconti: Fix undefined behavior bug and add bounds-checking coverage Gustavo A. R. Silva
2023-10-12 2:14 ` Gustavo A. R. Silva
2023-10-12 2:17 ` [PATCH 1/2][next] clk: visconti: Fix undefined behavior bug in struct visconti_pll_provider Gustavo A. R. Silva
2023-10-12 2:17 ` Gustavo A. R. Silva
2023-10-12 16:21 ` Kees Cook [this message]
2023-10-12 16:21 ` Kees Cook
2023-10-15 22:49 ` nobuhiro1.iwamatsu
2023-10-15 22:49 ` nobuhiro1.iwamatsu
2023-10-12 2:18 ` [PATCH 2/2][next] clk: visconti: Add bounds-checking coverage for " Gustavo A. R. Silva
2023-10-12 2:18 ` Gustavo A. R. Silva
2023-10-12 16:21 ` Kees Cook
2023-10-12 16:21 ` Kees Cook
2023-10-15 22:50 ` nobuhiro1.iwamatsu
2023-10-15 22:50 ` nobuhiro1.iwamatsu
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=202310120921.08062349C7@keescook \
--to=keescook@chromium.org \
--cc=gustavoars@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-clk@vger.kernel.org \
--cc=linux-hardening@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mturquette@baylibre.com \
--cc=nobuhiro1.iwamatsu@toshiba.co.jp \
--cc=sboyd@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.