From: "Liao, Bard" <yung-chuan.liao@linux.intel.com>
To: Tavian Barnes <tavianator@tavianator.com>, linux-sound@vger.kernel.org
Cc: Liam Girdwood <lgirdwood@gmail.com>,
Peter Ujfalusi <peter.ujfalusi@linux.intel.com>,
Ranjani Sridharan <ranjani.sridharan@linux.intel.com>,
Daniel Baluta <daniel.baluta@nxp.com>,
Kai Vehmanen <kai.vehmanen@linux.intel.com>,
Pierre-Louis Bossart <pierre-louis.bossart@linux.dev>,
Mark Brown <broonie@kernel.org>, Jaroslav Kysela <perex@perex.cz>,
Takashi Iwai <tiwai@suse.com>, Brent Lu <brent.lu@intel.com>,
Peter Zijlstra <peterz@infradead.org>,
sound-open-firmware@alsa-project.org,
linux-kernel@vger.kernel.org, bard.liao@intel.com
Subject: Re: [PATCH RESEND v2] ASoC: SOF: Intel: hda: Fix UAF when reloading module
Date: Wed, 7 May 2025 13:09:59 +0800 [thread overview]
Message-ID: <405eaed5-0671-4dc0-a7bc-c4dab8be5e8f@linux.intel.com> (raw)
In-Reply-To: <5aaee9fdfe8437ef2566b200bea45e4baaba3fcb.1745426811.git.tavianator@tavianator.com>
On 5/6/2025 11:12 PM, Tavian Barnes wrote:
> hda_generic_machine_select() appends -idisp to the tplg filename by
> allocating a new string with devm_kasprintf(), then stores the string
> right back into the global variable snd_soc_acpi_intel_hda_machines.
> When the module is unloaded, this memory is freed, resulting in a global
> variable pointing to freed memory. Reloading the modules then triggers
> a use-after-free:
>
> BUG: KFENCE: use-after-free read in string+0x48/0xe0
>
> Use-after-free read at 0x00000000967e0109 (in kfence-#99):
> string+0x48/0xe0
> vsnprintf+0x329/0x6e0
> devm_kvasprintf+0x54/0xb0
> devm_kasprintf+0x58/0x80
> hda_machine_select.cold+0x198/0x17a2 [snd_sof_intel_hda_generic]
> sof_probe_work+0x7f/0x600 [snd_sof]
> process_one_work+0x17b/0x330
> worker_thread+0x2ce/0x3f0
> kthread+0xcf/0x100
> ret_from_fork+0x31/0x50
> ret_from_fork_asm+0x1a/0x30
>
> kfence-#99: 0x00000000198a940f-0x00000000ace47d9d, size=64, cache=kmalloc-64
>
> allocated by task 333 on cpu 8 at 17.798069s (130.453553s ago):
> devm_kmalloc+0x52/0x120
> devm_kvasprintf+0x66/0xb0
> devm_kasprintf+0x58/0x80
> hda_machine_select.cold+0x198/0x17a2 [snd_sof_intel_hda_generic]
> sof_probe_work+0x7f/0x600 [snd_sof]
> process_one_work+0x17b/0x330
> worker_thread+0x2ce/0x3f0
> kthread+0xcf/0x100
> ret_from_fork+0x31/0x50
> ret_from_fork_asm+0x1a/0x30
>
> freed by task 1543 on cpu 4 at 141.586686s (6.665010s ago):
> release_nodes+0x43/0xb0
> devres_release_all+0x90/0xf0
> device_unbind_cleanup+0xe/0x70
> device_release_driver_internal+0x1c1/0x200
> driver_detach+0x48/0x90
> bus_remove_driver+0x6d/0xf0
> pci_unregister_driver+0x42/0xb0
> __do_sys_delete_module+0x1d1/0x310
> do_syscall_64+0x82/0x190
> entry_SYSCALL_64_after_hwframe+0x76/0x7e
>
> Fix it by saving the filename in pdata->tplg_filename instead, just like
> every other code path that appends to the tplg filename.
>
> Fixes: 5458411d7594 ("ASoC: SOF: Intel: hda: refactoring topology name fixup for HDA mach")
> Signed-off-by: Tavian Barnes <tavianator@tavianator.com>
> ---
> v2: Fix typo
>
> sound/soc/sof/intel/hda.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/sound/soc/sof/intel/hda.c b/sound/soc/sof/intel/hda.c
> index b34e5fdf10f1..1767977e7cff 100644
> --- a/sound/soc/sof/intel/hda.c
> +++ b/sound/soc/sof/intel/hda.c
> @@ -1069,7 +1069,7 @@ static void hda_generic_machine_select(struct snd_sof_dev *sdev,
> if (!tplg_filename)
> return;
>
> - hda_mach->sof_tplg_filename = tplg_filename;
> + pdata->tplg_filename = tplg_filename;
It will break the existing tplg name fixup mechanism. Please see below
in hda_machine_select()
if (!sof_pdata->tplg_filename) {
/* remove file extension if it exists */
tplg_filename = remove_file_ext(mach->sof_tplg_filename);
if (!tplg_filename)
return NULL;
sof_pdata->tplg_filename = tplg_filename;
tplg_fixup = true;
}
With the change, sof_pdata->tplg_filename will be set and we won't do
tplg fixup for other components.
> }
>
> if (codec_num == 2 ||
next prev parent reply other threads:[~2025-05-07 5:10 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-04-22 18:48 Bad topology file paths when re-inserting snd_sof_pci_intel_tgl Tavian Barnes
2025-04-23 7:27 ` Takashi Iwai
2025-04-23 15:07 ` [PATCH] ASoC: SOF: Intel: hda: Fix UAF when reloading module Tavian Barnes
2025-04-23 16:50 ` [PATCH v2] " Tavian Barnes
2025-05-06 15:12 ` [PATCH RESEND " Tavian Barnes
2025-05-07 5:09 ` Liao, Bard [this message]
2025-05-07 7:33 ` Péter Ujfalusi
2025-05-07 14:04 ` Tavian Barnes
2025-05-15 8:05 ` Péter Ujfalusi
2025-05-15 12:19 ` Tavian Barnes
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=405eaed5-0671-4dc0-a7bc-c4dab8be5e8f@linux.intel.com \
--to=yung-chuan.liao@linux.intel.com \
--cc=bard.liao@intel.com \
--cc=brent.lu@intel.com \
--cc=broonie@kernel.org \
--cc=daniel.baluta@nxp.com \
--cc=kai.vehmanen@linux.intel.com \
--cc=lgirdwood@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-sound@vger.kernel.org \
--cc=perex@perex.cz \
--cc=peter.ujfalusi@linux.intel.com \
--cc=peterz@infradead.org \
--cc=pierre-louis.bossart@linux.dev \
--cc=ranjani.sridharan@linux.intel.com \
--cc=sound-open-firmware@alsa-project.org \
--cc=tavianator@tavianator.com \
--cc=tiwai@suse.com \
/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.