oss-sec mailing list archives
Re: Announce: OpenSSH 10.3 released
From: Demi Marie Obenour <demiobenour () gmail com>
Date: Mon, 6 Apr 2026 19:12:31 -0400
On 4/6/26 02:20, Damien Miller wrote:
On Fri, 3 Apr 2026, Demi Marie Obenour wrote:* ssh(1): validation of shell metacharacters in user names supplied on the command-line was performed too late to prevent some situations where they could be expanded from %-tokens in ssh_config. For certain configurations, such as those that use a "%u" token in a "Match exec" block, an attacker who can control the user name passed to ssh(1) could potentially execute arbitrary shell commands. Reported by Florian Kohnhäuser. We continue to recommend against directly exposing ssh(1) and other tools' command-lines to untrusted input. Mitigations such as this can not be absolute given the variety of shells and user configurations in use.Is it safe (from a shell injection perspective) to pass inputs that are sanitized for character set, but otherwise untrusted? For instance, is it sufficient to limit usernames to ^[A-Za-z][A-Za-z0-9_-]{0,31}$ and domain names to valid host names [1]?Probably, but this is the essence of the problem as we see it: we can't know for sure whether this is safe, because we don't can effectively reason about what shell is in use (and thus what its metacharacters are) and what the user is doing with these characters in their configuration file.
What about using execve() directly for these commands, rather than a shell? That would break backwards compatibility for what I suspect to be rare configurations, while fixing most of these injection problems.
To make things harder, this isn't the full set of characters that appear in usernames. At least %, @, \ and / are relatively common too :(
\ cannot be used safely unless single quoted on POSIX shells.
Can one assume that in situations where entries come from an untrusted source (such as AuthorizedKeysCommand), OpenSSH _does_ do such checking?The *Command options in sshd_config require that the user exist in the system password database, otherwise they will not be executed. It's still possible to shoot youself in the foot with these if you try hard enough though, e.g. if you've rigged NSS to allow arbitrary usernames with no character filtering, then there is the potential for shell injection if the admin has specified token expansion in a *Command directive.
Does NSS generally enforce some sort of validation?
[1]: No more than 254 bytes (plus optional trailing '.'), no leading '.', each '.'-delimited component must start and end with [a-z0-9], not be more than 63 bytes, and only have [a-z0-9-].This too would block some hostnames that people use frequently. As a trivial example, '_' is common in hostnames despite being strictly invalid. IIRC there are other more esoteric ones too. -d
-- Sincerely, Demi Marie Obenour (she/her/hers)
Attachment:
OpenPGP_0xB288B55FFF9C22C1.asc
Description: OpenPGP public key
Attachment:
OpenPGP_signature.asc
Description: OpenPGP digital signature
Current thread:
- Announce: OpenSSH 10.3 released Damien Miller (Apr 02)
- Re: Announce: OpenSSH 10.3 released Agostino Sarubbo (Apr 03)
- Re: Announce: OpenSSH 10.3 released Salvatore Bonaccorso (Apr 03)
- Re: Announce: OpenSSH 10.3 released Demi Marie Obenour (Apr 03)
- Re: Announce: OpenSSH 10.3 released Damien Miller (Apr 06)
- Re: Announce: OpenSSH 10.3 released Demi Marie Obenour (Apr 07)
- Re: Announce: OpenSSH 10.3 released Damien Miller (Apr 07)
- Re: Announce: OpenSSH 10.3 released Demi Marie Obenour (Apr 07)
- Re: Announce: OpenSSH 10.3 released Damien Miller (Apr 06)
- Re: Announce: OpenSSH 10.3 released Agostino Sarubbo (Apr 03)
