RSSH(1)

πŸ“¦ version 2.3.4, in alpine 3.22

okay so first things first: this is rssh(1), and it’s by Derek D. Martin. manual name? folded in right here at the top, bestie πŸŽ€. part 1 is the NAME, SYNOPSIS, and DESCRIPTION era, and more parts are literally on the way, so don’t close the tab πŸ’–

πŸ’– NAME πŸ’–

rssh β€” restricted secure shell allowing only scp and/or sftp

that’s the whole name section, short and iconic ✨

✨ SYNOPSIS ✨

here’s the summoning syntax, copy it exactly:

rssh [ options... ] [ ... ]
rssh -v

πŸŽ€ DESCRIPTION πŸŽ€

okay so rssh is a restricted shell β€” the whole point is giving limited access to a host via ssh(1). if a user’s shell is configured to be rssh, they can use one or more of these commands: scp(1), sftp(1), cvs(1), rdist(1), and rsync(1). and only those commands. periodt. it’s not a free-for-all, it’s a curated little guest list πŸ’…

it’s intended primarily to work with OpenSSH (see http://www.openssh.com), but it may work with other implementations too. lowkey flexible.

the system administrator should install the shell on the restricted system. then they edit the password file entry of any user for whom it is desireable to provide restricted access, such that that user’s shell is rssh. for example, it looks like this:

luser:x:666:666::/home/luser:/usr/bin/rssh

if you invoke it with the -v option, rssh will report its version, and exit. that’s the whole vibe. all the other arguments to rssh are those specified by the remote ssh(1) client β€” not really something the average user needs to stress about. the arguments provided must be what a shell on the remote end would receive in order to pass control to scp(1), sftp(1), etc.

if rssh receives arguments that don’t conform, it will emit an error message and exit. no cap. and if the program the user is trying to run isn’t allowed, or if it contains syntax that will try to execute a shell command (such as a command substitution), it will also emit an error and exit. so yeah, it’s giving strict gatekeeper energy πŸ”₯

rssh also has a configuration file, rssh.conf(5), which allows some of the behavior of rssh to be customized. see that man page for the details, bestie 🫢

🚨 SECURITY NOTES 🚨

okay bestie, read this part with exceptional care, or you may literally put your system at risk πŸ’€ no cap. like, fr fr, this is not the section to skim.


πŸ§› Using rssh With CVS

so if you're using rssh to allow CVS access, ngl you should know: it is not possible to prevent a user who is very familiar with CVS from bypassing rssh and getting a shell β€” unless that user does not have write access in the repository πŸ™ˆ. and obviously the user must have write access to the repository in order to update it, which allows them to upload arbitrary programs into the repository. CVS provides several mechanisms for executing such arbitrary programs… 😭

the only reasonably safe way to use rssh with CVS is to use the chroot jail facilities to place the CVS repository within a chroot jail πŸŽ€. please see below and all relevant documentation for details of how to set up chroot jails ✨. note that users will still be able to get shell access within the jail; the only protection which is provided is that they can not escape the jail πŸ”’.

the author has been pursuaded to retain support for CVS because this protection is better than no protection. you have been warned. Use CVS at your own risk. πŸ’…

πŸ’€ Potential root Compromise With Old Versions

before rssh 2.3.0, if a regular user had shell access to a machine where rssh was installed, a root compromise was possible 😱 β€” due to rssh_chroot_helper allowing a user to arbitrarily chroot(2) to anywhere on the filesystem. like, anywhere. yikes.

it is possible to mitigate this attack against affected versions of rssh using strict access controls to files, by making sure that the user can not write to any file on the same partition as system executables, and that any partition where they can write files does not allow execution of SUID programs 🫢.

as of rssh 2.3.0, this attack has been prevented by preventing arbitrary chroot(), if your jail is set up securely 🌸. in particular, make sure that regular users can not write to directories inside the jail which contain the copied binaries. that should be obvious, but it needs to be said πŸ’….

though it should not be strictly necessary, to further protect your system from possible compromise, it is also advisable to follow the section below, entitled "Safeguards Against Bypassing rssh" ✨.


πŸ›‘οΈ Safeguards Against Bypassing rssh

rssh is designed to interact with several other programs. even if rssh is completely bug-free, changes in those other programs could possibly result in methods to circumvent the protection that rssh is intended to provide 😬. so it's important for you, the system administrator, to stay current on the services you make available with rssh, to be sure that these commands do not provide mechanisms to allow the user to run arbitrary commands πŸ”₯. also, while the goal of every release is to be bug free, no one is perfect… there may be undiscovered bugs in rssh which might allow a user to circumvent it πŸ™ˆ.

you can protect your system from those who would take advantage of such weaknesses πŸ’ͺ. this is not required for rssh to work properly, but it is a really good idea πŸ‘‘. there are six basic steps:

  1. protect all non-administrator accounts with rssh (i.e. no regular user should have shell access to the server)
  2. place your users in a chroot jail
  3. limit the binaries which live in the jail to the absolute minimum required
  4. mount their home filesystem with the noexec/nosuid option (i.e. use separate partitions in the jail for user home directories and all other files, if possible/reasonable)
  5. create a group for rssh users, and limit executable access to the binaries to users in that group.
  6. use standard file permissions carefully and appropriately

if possible, make sure that no regular user has any kind of shell access to the system other than through rssh πŸŽ€. otherwise, users with shell access could potentially exploit undiscovered bugs in rssh_chroot_helper to gain root access to the server 😭.

rssh gives the system administrator the ability to place the users in a chroot jail ✨. see details in the man page for rssh.conf and in the file CHROOT which is distributed with the source code. if you want to ensure users can not run arbitrary programs, use a chroot jail, and be sure not to put any programs other than what are absolutely necessary to provide the service you are trying to provide. this prevents them from running standard system commands 🚫.

then, make sure the user's files inside the jail are on a seperate filesystem from your system's executables πŸ¦‹. if possible in your environment, make sure you mount this filesystem using the noexec and nosuid options, if your operating system provides them. this prevents the users from being able to execute programs which they have uploaded to the target machine (e.g. using scp) which might otherwise be executable, and prevents SUID programs from respecting the SUID bits πŸ”’. note that these options necessitate the users' files are on separate partitions from the binaries and libraries that live in the jail. therefore you will need at least 2 partitions for your jail to do this properly (one for the system binaries in the jail, the other for the user directories) πŸ’….

additionally, create a group, for example "rsshuser", for rssh users. put all your users who will be restricted by rssh in that group 🌈. set the ownership and permissions on rssh and rssh_chroot_helper so that only those users can execute them. the following commands should illustrate:

# groupadd rsshuser
# chown root:rsshuser rssh rssh_chroot_helper
# chmod 550 rssh
# chmod 4550 rssh_chroot_helper

lastly, use standard Unix/POSIX file permissions to ensure they can not access files they should not be able to within the chroot jail πŸŽ€.


πŸ” Command Line Parser

as of rssh version 2.2.3, the program must parse out the complete command line to avoid command line options which cause the execution of arbitrary programs (and hence bypass the security of rssh) 😀. in order to keep the program source code sane, the parser is a little over-zealous about matching command line options πŸ™ˆ. in practice, this probably will not be an issue, but in theory it is possible.

if you run into a problem where rssh refuses to run, claiming to be rejecting insecure command line options which were not specified, try changing your command line such that all short options are specified as single-letter option flags (e.g. -e -p instead of -ep) and make sure you separate arguments from their respective options by a space (e.g. -p 123 instead of -p123) ✨. in virtually all cases, this should solve the problem 🫢. admittedly, an exhaustive search was not performed, but no problematical cases were found which were likely to be common.

the alternative would have been to include a complete command-line parser for rcp, rdist, and rsync; this was way out of the scope of this project πŸ’€. in practice, the existing parser should suffice. if, however, you find cases where it does not, please post details to the rssh mailing list πŸ“¬. details about how to post to the mailing list can be found at the rssh homepage 🌸.


🐚 OpenSSH Versions and Bypassing rssh

prior to OpenSSH 3.5, sshd(8) will generally attempt to parse files in the user's home directory, and may also try to run a start-up script from the user's $HOME/.ssh directory 😬. rssh does not make use of the user's environment in any way πŸ™…β€β™€οΈ. the relevant command is executed by calling execv(3) with the full path to the command, as specified at compile time. it does not depend upon the user's PATH variable, or on any other environment variable πŸ‘‘

there are, however, several problems that can arise. this is due entirely to the way the OpenSSH Project's sshd works, and is in no way the fault of rssh πŸ’…. for example, one problem which might exist is that, according to the sshd(8) man page from at least some releases of OpenSSH, the commands listed in the $HOME/.ssh/rc file are executed with /bin/sh instead of the user's defined shell 😱. this appears not to be the case on the systems the author had available to test on; commands were executed using the user's configured shell (rssh), which did not allow the execution. however if it is true on your system, then a malicious user may be able to circumvent rssh by uploading a file to $HOME/.ssh/rc which will be executed by /bin/sh on that system πŸ’€. if any releases (of OpenSSH) are, in fact, vulnerable to this problem, then it is very likely that they are only old, outdated versions. so long as you are running a recent version of OpenSSH, this should not be a problem as far as I can tell ✨.

if your sshd is vulnerable to this attack, there is a workaround for this problem, though it is pretty restrictive πŸŽ€. the user's home directory absolutely must not be writable by the user 🚫. if it is, the user can use sftp to remove the directory or rename it, and then create a new one, and fill it up with whatever environment files they like 😭. for providing file uploads, this means a user-writable directory must be created for them, and they must be made aware of their inability to write into their home directory other than in this location.

a second problem is that after authenticating the user, sshd also reads $HOME/.ssh/environment to allow the user to set variables in their environment πŸ™ˆ. this allows the user to completely circumvent rssh by clever manipulation of such environment variables as LD_LIBRARY_PATH or LD_PRELOAD to link the rssh binary against arbitrary shared libraries 😱. in order to prevent this from being a problem, as of version 0.9.3, by default rssh is now compiled statically πŸ”’. the restrictive work-around mentioned above will also defeat this sort of attack πŸ’ͺ.

as of OpenSSH 3.5, sshd now supports the option PermitUserEnvironment which is set to "no" by default ⭐. this option allows restricted shells like rssh to function properly without requiring them to be linked statically. as of rssh version 1.0.1, the configure script should detect that OpenSSH 3.5 is present, and disable the default of static compilation 🌸.

πŸ’€ BUGS πŸ’€

None. =8^)

Literally zero bestie, we're thriving ✨


🫢 A Note About Getting Help 🫢

okay so if you're having trouble getting rssh working, or you think you've found a bug, please use the mailing list, and do not e-mail me directly, i'm begging πŸ™ˆ.

You must sign up for the list in order to post. Info about how to sign up is available on the rssh homepage. And like, if you mail me directly with questions, I will almost certainly ignore you β€” or at the very least, ask you to repost your question on the mailing list. no cap πŸ’…

Also please feel free to provide feedback about rssh on the mailing list, whether positive or negative (especially negative). we love a hater, fr fr.


πŸ”’ Security Problems πŸ”’

The only exception to all of the above is if you believe you've found a security problem with rssh. If that's the case, then please do contact me privately 🫑.

If you're unable to find my direct contact info, post a message on the mailing list requesting that I contact you about a potential security problem. Security problems should be dealt with privately, so that the threat can be properly assessed, and so as not to needlessly endanger the installations of rssh in production environments πŸ”₯. I take security problems seriously, and will work to resolve them as quickly as possible. periodt.


πŸ“š N.B.: πŸ“š

Before you e-mail me (or the mailing list) with questions, be sure to THOROUGHLY read all of the following files:

  • README
  • INSTALL
  • CHROOT
  • SECURITY

All of these files are distributed with the rssh source code, as well as all binary packages of rssh. If you downloaded a binary package, these files should be located wherever your distribution keeps its documentation files (usually /usr/share/doc/rssh-version/ or something similar) πŸŽ€.

Also THOROUGHLY read the man pages for rssh(1), and rssh.conf(5). Finally, if you're still having problems, read the FAQ at http://www.pizzashack.org/rssh/faq.shtml 🌐.

If it's clear to me that you have not read these documents, I will ignore you 😭. In most cases, these documents will already have everything you need to get rssh working, and I won't be able to explain it any better on a mailing list than I did in those documents… like, i literally already wrote it down bestie, please read it πŸ’€

🌈 SEE ALSO 🌈

go read the whole fam, they're all iconic πŸ‘‘


🌸 and that's the whole page, bestie! this lil masterpiece lives in the man pages collection, dated 1 Aug 2010, and it's known and loved as RSSH(1) πŸ¦‹ tysm for reading, mwah πŸ’–βœ¨

πŸ“¦ where this page comes from