SFTP chroot: Writable root

Jakub Jelen jjelen at redhat.com
Wed Jan 10 20:05:43 AEDT 2018


On Tue, 2018-01-09 at 21:21 +0000, halfdog wrote:
> [...]
> 
> There are multiple weaknesses to be seen:
> 
> * Ssh searches for /proc/[pid]/fd: I do not know, how sftp would
>   react, when that directory is found, but it is not nice, that
>   a hypothetical user "proc" could influence login behavior of
>   other processes
> 
> 907   open("/proc/907/fd", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC)
> = -1 ENOENT (No such file or directory)

This is just part of the closefrom() procedure [1] -- it searches for
open file descriptor and if it finds them, it tries to close them. I
don't think there is any straightforward way to exploit it.

[1] https://github.com/openssh/openssh-portable/blob/master/openbsd-com
pat/bsd-closefrom.c#L79


>   Same argument for:
> 
> 906   stat("/usr/lib/openssh/sftp-server", 0x7fff75547e00) = -1
> ENOENT (No such file or directory)
> 
>   (When found, it is still not executed in sftp-internal mode)
> 
> * Loading of sshrc - really bad:
> 
> 907   stat("/etc/ssh/sshrc", 0x7fff75547460) = -1 ENOENT (No such
> file or directory)

This can be a real problem from my point of view.

> * Search for other /etc files - I would not bet, that the passwd
>   parser was hardened against malicious input. Simply not a use case.
> 
> 895   open("/etc/localtime", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such
> file or directory)
> 895   open("/etc/passwd", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such
> file or directory)
> 895   open("/etc/group", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such
> file or directory)
> 
> * This is also seems not really nice: if the target directory does
> not
>   exist, login does not stop. But maybe it is a requirement, e.g.
>   to support login to users without having their own home directory.
> 
> 907   chdir("/home/build")              = -1 ENOENT (No such file or
> directory)

This is quite expected, that in chroot, there might not be the real
home directory. Outside of chroot, it would be fatal error [2]. I don't
think there is a way to misuse it in some way.

[2] https://github.com/openssh/openssh-portable/blob/master/session.c#L
1586

Regards,
-- 
Jakub Jelen
Software Engineer
Security Technologies
Red Hat, Inc.



More information about the openssh-unix-dev mailing list