Miklos Szeredi <[EMAIL PROTECTED]> wrote:
>> >> For example, consider the classic symlink attack.
>> >> We're not supposed to follow symlinks and our system lacks support
>> >> for open's O_NOFOLLOW flag.  So we lstat the target directory,
>> >> determine that it is indeed a directory, then open it.  But between
>> >> the lstat and the open, someone moved it aside and replaced it with
>> >> a symlink to another directory.  The only way to detect that is to
>> >> compare dev/inode pairs before and after.
>> >
>> > OK, but for systems which do have O_NOFOLLOW, this isn't necessary and
>> > less efficient than just using O_NOFOLLOW.  So can't this test be made
>> > conditional for systems lacking O_NOFOLLOW?
>>
>> For that one yes, but there is a more insidious attack.
>>
>> The case in which a partially processed (visited just once so far)
>> directory is renamed to reside at a different level in the file system
>
> You mean a directory that is an ancestor of the current directory, but
> a descendant of the root of find is moved?

Yes.

>> hierarchy must also be detected.  There, O_NOFOLLOW doesn't help at all.
>> It can be detected upon traversing a ".." link only by comparing prior
>> and current dev/ino pairs.
>
> Shouldn't holding the current directory open prevent the ancestor from
> changing inodes in this case?

No.
What's changed is the identity (dev/inode) of the parent directory,
once you try to chdir("..") "up" beyond the renamed directory.


Reply via email to