Do not copy directory symlinks recursively. #29
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
When copying files (running the
cptask, or moving files from/to sandbox), symlinks to directories are followed. The target of the symlink is copied. The resolution and copying happens outside of the sandbox.By creating a directory containing a nonempty file and a few symlinks to the directory itself, this can be abused for a DoS attack against the worker, filling all allowed space on the disk containing the working directory. After the copying fails due to full disk, the files are not cleaned up.
Moreover, if a compiler could be persuaded to create a symlink, some directories outside of the sandbox could be copied into the execution sandbox, making it readable to the evaluated program.
Fixed this by replacing
is_directory(const path&)(equivalent tois_directory(status(const path&))) withis_directory(symlink_status(const path&)).symlink_statusis identical tostatus, except that if the path refers to a symbolic link, it obtains information about the link itself, not the target.