From: sashiko-bot@kernel.org
To: "Marc Kleine-Budde" <mkl@pengutronix.de>
Cc: "Oleksij Rempel" <o.rempel@pengutronix.de>,
"Oliver Hartkopp" <socketcan@hartkopp.net>,
"Vincent Mailhol" <mailhol@kernel.org>,
linux-can@vger.kernel.org,
"Marc Kleine-Budde" <mkl@pengutronix.de>
Subject: Re: [PATCH net 06/19] can: bcm: defer rx_op deallocation to workqueue to fix thrtimer UAF
Date: Fri, 17 Jul 2026 16:45:53 +0000 [thread overview]
Message-ID: <20260717164554.12AD41F00A3A@smtp.kernel.org> (raw)
In-Reply-To: <20260716155528.809908-7-mkl@pengutronix.de>
Thank you for your contribution! Sashiko AI review found 4 potential issue(s) to consider:
Pre-existing issues:
- [High] Unprotected concurrent modification of `op->frames` in `bcm_tx_setup` can lead to corrupted or torn CAN frames being transmitted.
- [High] Unprotected modification of `op->frames` and `op->flags` in `bcm_rx_setup` races with `bcm_rx_handler` in softirq context.
- [High] The `tx_ops` and `rx_ops` lists are updated without RCU list primitives, creating a data race with concurrent readers in `bcm_proc_show()`.
- [Medium] Concurrent execution of `bcm_rx_handler` on multiple CPUs causes data corruption for `op->last_frames` and statistics.
--
--- Patch [6]: [PATCH net 06/19] can: bcm: defer rx_op deallocation to workqueue to fix thrtimer UAF ---
commit 542011e18159cf5ca68d911f15d0136be9c07cb9
Author: Lee Jones <lee@kernel.org>
Subject: can: bcm: defer rx_op deallocation to workqueue to fix thrtimer UAF
This commit resolves a use-after-free by deferring timer cancellation and
memory deallocation to a dedicated unbound workqueue. It also takes a
reference on op->sk to ensure the socket is not freed while timers are
still armed.
Link: https://patch.msgid.link/20260714-bcm_fixes-v15-1-562f7e3e42da@hartkopp.net
> diff --git a/net/can/bcm.c b/net/can/bcm.c
> index a4bef2c48a559..bdf53241bd7b3 100644
> --- a/net/can/bcm.c
> +++ b/net/can/bcm.c
[ ... ]
> @@ -1060,6 +1081,7 @@ static int bcm_tx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg,
>
> /* bcm_can_tx / bcm_tx_timeout_handler needs this */
> op->sk = sk;
> + sock_hold(sk);
> op->ifindex = ifindex;
[Severity: High]
This isn't a bug introduced by this patch, but does the unprotected
modification of op->frames in bcm_tx_setup() allow torn CAN frames to be
transmitted?
When updating an existing operation, the code copies data from userspace:
bcm_tx_setup() {
...
err = memcpy_from_msg((u8 *)cf, msg, op->cfsiz);
...
}
Could a concurrent bcm_can_tx() executed by the TX timer read from
op->frames while the copy is happening, since the timer drops the
bcm_tx_lock before calling skb_put_data(skb, cf, op->cfsiz)?
[Severity: High]
This is a pre-existing issue, but does adding new elements to the ops
lists create a data race with concurrent readers?
When adding a new element, the setup functions call list_add():
bcm_tx_setup() {
...
list_add(&op->list, &bo->tx_ops);
...
}
Since list_add() lacks RCU write barriers, could concurrent readers in
bcm_proc_show() observe torn list pointers when iterating over tx_ops
under rcu_read_lock()?
[ ... ]
> @@ -1221,6 +1243,7 @@ static int bcm_rx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg,
>
> /* bcm_can_tx / bcm_tx_timeout_handler needs this */
> op->sk = sk;
> + sock_hold(sk);
> op->ifindex = ifindex;
[Severity: High]
This is a pre-existing issue, but can bcm_rx_setup() race with
bcm_rx_handler() in softirq context when modifying op->frames?
When bcm_rx_setup() updates an existing operation, it copies frame data:
bcm_rx_setup() {
...
err = memcpy_from_msg(op->frames, msg, msg_head->nframes * op->cfsiz);
...
}
Since this is only protected by lock_sock() and not serialized against
softirq, could an incoming CAN frame trigger bcm_rx_handler()
concurrently, leading to inconsistent filter configurations and
out-of-bounds array accesses when op->nframes changes?
[Severity: Medium]
This isn't a bug introduced by this patch, but are the shared RX
statistics and op->last_frames vulnerable to data corruption?
If bcm_rx_handler() runs concurrently on multiple CPUs for the same
bcm_op, it performs non-atomic updates:
bcm_rx_handler() {
...
op->frames_abs++;
...
bcm_rx_update_and_send(op, op->last_frames, rxframe, traffic_flags);
...
}
Does modifying op->last_frames and op->frames_abs without holding a
spinlock allow torn writes and lost increments?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260716155528.809908-1-mkl@pengutronix.de?part=6
next prev parent reply other threads:[~2026-07-17 16:45 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-16 15:47 [PATCH net 0/19] pull-request: can 2026-07-16 Marc Kleine-Budde
2026-07-16 15:47 ` [PATCH net 01/19] can: vxcan: Kconfig: fix description stating no local echo provided Marc Kleine-Budde
2026-07-17 9:50 ` patchwork-bot+netdevbpf
2026-07-16 15:47 ` [PATCH net 02/19] can: esd_usb: kill anchored URBs before freeing netdevs Marc Kleine-Budde
2026-07-17 16:45 ` sashiko-bot
2026-07-16 15:47 ` [PATCH net 03/19] can: raw: add locking for raw flags bitfield Marc Kleine-Budde
2026-07-17 16:45 ` sashiko-bot
2026-07-16 15:47 ` [PATCH net 04/19] can: j1939: fix lockless local-destination check Marc Kleine-Budde
2026-07-16 15:47 ` [PATCH net 05/19] can: peak: Modification of references to email accounts being deleted Marc Kleine-Budde
2026-07-16 15:47 ` [PATCH net 06/19] can: bcm: defer rx_op deallocation to workqueue to fix thrtimer UAF Marc Kleine-Budde
2026-07-17 16:45 ` sashiko-bot [this message]
2026-07-16 15:47 ` [PATCH net 07/19] can: bcm: fix lockless bound/ifindex race and silent RX_SETUP failure Marc Kleine-Budde
2026-07-17 16:46 ` sashiko-bot
2026-07-16 15:47 ` [PATCH net 08/19] can: bcm: add locking when updating filter and timer values Marc Kleine-Budde
2026-07-17 16:45 ` sashiko-bot
2026-07-16 15:47 ` [PATCH net 09/19] can: bcm: fix CAN frame rx/tx statistics Marc Kleine-Budde
2026-07-17 16:45 ` sashiko-bot
2026-07-16 15:47 ` [PATCH net 10/19] can: bcm: add missing rcu list annotations and operations Marc Kleine-Budde
2026-07-17 16:45 ` sashiko-bot
2026-07-16 15:47 ` [PATCH net 11/19] can: bcm: extend bcm_tx_lock usage for data and timer updates Marc Kleine-Budde
2026-07-16 15:47 ` [PATCH net 12/19] can: bcm: validate frame length in bcm_rx_setup() for RTR replies Marc Kleine-Budde
2026-07-16 15:47 ` [PATCH net 13/19] can: bcm: add missing device refcount for CAN filter removal Marc Kleine-Budde
2026-07-16 15:47 ` [PATCH net 14/19] can: bcm: fix stale rx/tx ops after device removal Marc Kleine-Budde
2026-07-16 15:47 ` [PATCH net 15/19] can: bcm: fix data race on rx_stamp/rx_ifindex in bcm_rx_handler() Marc Kleine-Budde
2026-07-17 16:46 ` sashiko-bot
2026-07-16 15:47 ` [PATCH net 16/19] can: bcm: track a single source interface for ANYDEV timeout/throttle ops Marc Kleine-Budde
2026-07-16 15:47 ` [PATCH net 17/19] can: isotp: use unconditional synchronize_rcu() in isotp_release() Marc Kleine-Budde
2026-07-17 16:46 ` sashiko-bot
2026-07-16 15:47 ` [PATCH net 18/19] can: isotp: fix use-after-free race with concurrent NETDEV_UNREGISTER Marc Kleine-Budde
2026-07-17 16:46 ` sashiko-bot
2026-07-16 15:47 ` [PATCH net 19/19] can: isotp: serialize TX state transitions under so->rx_lock Marc Kleine-Budde
2026-07-17 16:46 ` sashiko-bot
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=20260717164554.12AD41F00A3A@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=linux-can@vger.kernel.org \
--cc=mailhol@kernel.org \
--cc=mkl@pengutronix.de \
--cc=o.rempel@pengutronix.de \
--cc=sashiko-reviews@lists.linux.dev \
--cc=socketcan@hartkopp.net \
/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.