> How did you confirm that d_path() shows /branch_ro/README.txt?
a kernel part of the openvz checkpoint/restore preform a checks about
a path of the opened files. Then it tells:
setting up checkpoint...
suspend...
Can not suspend container: Device or resource busy
Error: file struct is referenced outside 3 4
Checkpointing failed
Not understanding this message I removed a checks. And checkpoint is
performed. But then a restore failed with message:
Restoring container ...
Restore error, undump failed: No such file or directory
Error: rst_open_file: failed to lookup path
'/livecd/images/_vz_private_202/ct-202-01-base.lzm/lib/libnss_files-2.12.so'
The path of the file in the message is a real path to the file in
squashfs branch. And rst_open_file() don't want to open a file
outside of the container root.
A removed check was in d_path and looks like this:
fs/dcache.c
* The other option is to allow exposing of known abstract spaces
* explicitly and hide the path information for other cases.
* This approach is more safe, let's take it. 2001/04/22 SAW
*/
if (!(oldmnt->mnt_sb->s_flags & MS_NOUSER) &&
!ve_accessible_veid(vfsmnt->owner, get_exec_env()->veid)) {
retval = ERR_PTR(-EINVAL);
goto out_err;
}
ve_accessible_veid() checks that path is accessible inside a container root.
In out example it must begin with /mnt/union but really starts with /branch_ro
If I use a user space bindfs like this
mkdir /mnt/union2
bindfs /mnt/union /mnt/union2
and /mnt/union2 as a container root fs then all check are passed and
suspend/resume is performed.
PS: can you suggest a more direct test? I will try to search exploits
for a container escape case regarding to a path of the opened file
(like this one
http://comments.gmane.org/gmane.linux.kernel.containers.lxc.general/7261
)
2014-07-17 9:46 GMT+04:00, [email protected]
<[email protected]>:
>
> Sergey Korshunoff:
>> return a real path for a file located inside union. Example:
>> /mnt/union
>> /branch_rw
>> /branch_ro
>> mount -t aufs o dirs=/branch_rw=rw,/branch_ro=ro none /mnt/union
>> For the file README.txt in /branch_ro opened by program from
>> /mnt/union/README.txt a path returned by a kernel d_path will be
>> /branch_ro/README.txt and not a /mnt/union/README.txt
>> Is a path translation layer implemented by current version of aufs?
>
> How did you confirm that d_path() shows /branch_ro/README.txt?
>
>
> J. R. Okajima
>
------------------------------------------------------------------------------
Want fast and easy access to all the code in your enterprise? Index and
search up to 200,000 lines of code with a free copy of Black Duck
Code Sight - the same software that powers the world's largest code
search on Ohloh, the Black Duck Open Hub! Try it now.
http://p.sf.net/sfu/bds