]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
binfmt_elf_fdpic: only honour the first PT_INTERP
authorChristian Brauner <brauner@kernel.org>
Tue, 21 Jul 2026 11:20:45 +0000 (13:20 +0200)
committerChristian Brauner <brauner@kernel.org>
Tue, 21 Jul 2026 11:22:34 +0000 (13:22 +0200)
The program header scan handles PT_INTERP from a switch nested in the
scan loop, so its break leaves the switch and not the loop. A binary
carrying more than one PT_INTERP runs the case again and overwrites both
interpreter_name and interpreter. The previous name allocation leaks and
so does the previous interpreter reference, along with the write denial
open_exec() took on it. The denial is never released, so the file stays
unwritable for as long as the system runs.

An unprivileged caller reaches this with a crafted binary and repeats it
at will. binfmt_elf stops at the first PT_INTERP. Do the same here.

The flaw dates back to the driver's introduction in the pre-git history
tree introduced in v2.6.11 by 91808d6ebe39 ("[PATCH] FRV: Add FDPIC ELF
binary format driver").

Link: https://patch.msgid.link/20260721-gezittert-medium-kreide-b41fc1f0277e@brauner
Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
Cc: stable@vger.kernel.org
Reviewed-by: Jori Koolstra <jkoolstra@xs4all.nl>
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
fs/binfmt_elf_fdpic.c

index 7e3108489c83ca43242d3bc2732a40c395dff23e..fe0b5c5ed2bccea7869a86ab0e68e133c5525e25 100644 (file)
@@ -231,6 +231,10 @@ static int load_elf_fdpic_binary(struct linux_binprm *bprm)
        for (i = 0; i < exec_params.hdr.e_phnum; i++, phdr++) {
                switch (phdr->p_type) {
                case PT_INTERP:
+                       /* elf ABI allows only one interpreter */
+                       if (interpreter_name)
+                               continue;
+
                        retval = -ENOMEM;
                        if (phdr->p_filesz > PATH_MAX)
                                goto error;