fix(install): prevent symlink race condition in install -D (fixes #10013)#10140
Conversation
|
GNU testsuite comparison: |
fc7eade to
0b91865
Compare
|
GNU testsuite comparison: |
Merging this PR will not alter performance
Comparing Footnotes
|
|
The 3.46% performance regression is an acceptable trade-off for fixing the symlink race condition vulnerability. The safe directory traversal using file descriptors adds unavoidable overhead, but prevents potential security exploits. |
|
GNU testsuite comparison: |
|
sorry but could you please rebase it ? thanks |
agreed |
fe7aec2 to
4fb0779
Compare
|
some conflicts, sorry |
4fb0779 to
f95bed7
Compare
|
There, that should resolve the conflicts :) |
|
GNU testsuite comparison: |
|
The sort regression is benchmark noise - this PR only touches |
|
This is a lot of added complexity and I think you could have a bit more polish before submitting for review :/ |
Yeah that was rough, won't happen again |
|
GNU testsuite comparison: |
b804df6 to
d138468
Compare
|
GNU testsuite comparison: |
|
GNU testsuite comparison: |
|
GNU testsuite comparison: |
…s a file When -t is used with -D and the target exists as a file (not a directory), we should fail immediately without printing verbose directory creation messages. This matches GNU behavior and fixes the failing GNU test tests/install/basic-1.
- Replace std::io::copy() with copy_stream() for consistency and splice optimization - Consolidate DirFd::open() and open_subdir() to take follow_symlinks parameter - Extract finalize_installed_file() helper to reduce code duplication - Add documentation for security behavior (symlink removal) and mode handling - Clean up verbose comments
268e92d to
d694c9e
Compare
d694c9e to
a1ef268
Compare
|
GNU testsuite comparison: |
|
it looks great, i will wait for the ci to finish |
|
@abendrothj Would you please have a look at the issue I'm having? It seems the ancestors_mode_directories_with_file test only passed with the root user on my system, and unsure if my "fix" is correct. |
Something changed in 0.7.0 re. what happens when boulder builds some packages, that makes boulder record directories as part of the package, which can in turn cause conflicts (notably seen with inputplumber). To avoid this becoming an issue, and to give us time to investigate further, downgrade to 0.6.0 for now. Signed-off-by: Rune Morling <ermo@aerynos.com>
This PR fixes a TOCTOU (Time-of-Check-Time-of-Use) race condition in the install -D command where an attacker could replace a directory component with a symlink between directory creation and file installation, redirecting writes to an arbitrary location.
Changes
mkdir_at()andopen_file_at()methods toDirFdfor safe operationsopen_no_follow()to prevent following symlinks when opening directoriescreate_dir_all_safe()function that uses directory file descriptorscopy_file_safe()function for safe file copying using directory fdsHow the Fix Works
The fix prevents the race condition by:
mkdirat/openat) instead of pathnamesThis eliminates the race window by ensuring all critical operations use directory file descriptors that cannot be replaced by symlinks.
Testing
Fixes #10013