[PATCH e2fsprogs 1/2] debugfs: reject path-traversal names in rdump
Nexory <[email protected]> Fri, 7 Aug 2026 12:03:03 +0200
| Newsgroups | org.kernel.vger.linux-ext4 |
|---|---|
| Message-ID | <OS6P279MB11807BB1AB25D78C31814B39CBD12@OS6P279MB1180.NORP279.PROD.OUTLOOK.COM> |
rdump_dirent() copies the raw on-disk directory entry name and passes it to rdump_inode(), which sprintf()s it into the destination path and open()s / symlink()s the result. An entry named "../foo" (or one containing '/') in a crafted or corrupted image therefore escapes the destination directory when "rdump" extracts a tree from an untrusted filesystem image. Reject such names in rdump_dirent() before use. Valid ext2/3/4 filesystems never contain them, so there is no change for legitimate images; e2fsck already treats '/' in a name as corruption (PR_2_BAD_NAME). Signed-off-by: Nexory <[email protected]> --- debugfs/dump.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/debugfs/dump.c b/debugfs/dump.c index cc81a50..e959cd0 100644 --- a/debugfs/dump.c +++ b/debugfs/dump.c @@ -317,6 +317,16 @@ static int rdump_dirent(struct ext2_dir_entry *dirent, strncpy(name, dirent->name, thislen); name[thislen] = 0; + /* Path-traversal guard: reject entry names that would escape the + * destination directory. A valid ext2/3/4 filesystem never contains + * a name with '/' or an empty name; e2fsck treats such names as + * corruption (PR_2_BAD_NAME). */ + if (name[0] == 0 || strchr(name, '/')) { + com_err("rdump", 0, "skipping entry with unsafe name (inode %u)", + dirent->inode); + return 0; + } + if (debugfs_read_inode(dirent->inode, &inode, name)) return 0; -- 2.53.0