Skip to content

Reject directory listing entries containing a path separator#6172

Open
aizu-m wants to merge 1 commit into
cfengine:masterfrom
aizu-m:reject-dirent-separator
Open

Reject directory listing entries containing a path separator#6172
aizu-m wants to merge 1 commit into
cfengine:masterfrom
aizu-m:reject-dirent-separator

Conversation

@aizu-m

@aizu-m aizu-m commented Jun 10, 2026

Copy link
Copy Markdown

Found while tracing cf-agent's recursive copy from a remote server. The
directory listing entries pass through ConsiderFile() and are then joined
to the local path by PathAppend(), which only concatenates:

entry  = "../../../etc/cron.d/x"
joined = "<dest>/../../../etc/cron.d/x"

ConsiderFile() already rejects ".", ".." and "..." (the last with a
CWE-32 note) but not a name that carries a separator. A genuine dirent is
one path component and never contains '/', so a listing entry that does
is a hostile server stepping outside the destination. cf-agent normally
runs as root, so that is an arbitrary file write.

cf-net "getdir" walks a remote listing the same way in
process_dir_recursive(); it skips "." and ".." and nothing else.

Both now reject an entry that contains a separator (IsFileSep). The unit
test fails before the change and passes after.

Entries from a remote directory listing are joined to a local path
during recursive copy (cf-agent) and getdir (cf-net). A genuine dirent
is a single path component; one carrying a separator escapes the
destination once joined, so a hostile server can write outside it.
ConsiderFile() already blocks ".", ".." and "..."; reject
separator-bearing names there and in process_dir_recursive() too.

Signed-off-by: aizu-m <aizumusheer2@gmail.com>
@CLAassistant

CLAassistant commented Jun 10, 2026

Copy link
Copy Markdown

CLA assistant check
All committers have signed the CLA.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

2 participants