PowerShell / Win32-OpenSSH

Win32 port of OpenSSH
7.36k stars 757 forks source link

Error when putting file with permissions while ChrootDirectory is set #2263

Open argonym opened 1 month ago

argonym commented 1 month ago

Prerequisites

Steps to reproduce

When I put -p somefile while the connected user has a ChrootDirectory set, the operation always fails with "remote fsetstat: Bad message".

The probable root cause was tracked down by @MichaelEischer. Quoting from https://github.com/restic/restic/issues/4335#issuecomment-2241315352:

The error looks very much like a bug in the homegrown chroot implementation used in the Windows openssh sftp port. In https://github.com/PowerShell/openssh-portable/blob/661803c9ec4d7dee6574eb6ff0c85b2b7006edb1/contrib/win32/win32compat/w32fd.c#L1013 it first retrieves the filepath for the handle (the real path on the windows filesystem) and passes it to w32_chmod which applies the chroot a second time! That ultimately results in a call to _wchmod with a broken file path. This triggers an EINVAL error that gets translated to the "Bad message" error.

Expected behavior

sftp> put -p somefile
Uploading somefile to /somefile
somefile                                      100%   22KB   6.9MB/s   00:00
<transfer completes w/o error>

Actual behavior

sftp> put -p somefile
Uploading somefile to /somefile
somefile                                      100%   22KB   6.9MB/s   00:00
remote fsetstat: Bad message

Error details

No response

Environment data

AllowGroups ssh-backup
Match Group ssh-backup
    AuthorizedKeysFile C:/_backups/%u.authorized_keys
    ChrootDirectory C:/_backups/%u

Version

OpenSSH_for_Windows_9.4p1, LibreSSL 3.7.3

Visuals

No response