OpenSSH 可以从 % 令牌展开的最大字符串是多少?

dat*_*ess 6 ssh token

我使用的是 sshd 通过选项调用的自定义密钥验证程序,而不是服务器上传统的authorized_keys 文件AuthorizedKeysCommand。在 sshd_config 中,我可以指定应将用户的公钥作为参数提供给此命令,如下所示:

AuthorizedKeysCommand /path/to/verifier %k
Run Code Online (Sandbox Code Playgroud)

问题是密钥编码了大量附加数据,因此可能非常大。如果它大于大约 4135 字节,sshd 在扩展%k令牌时会记录一个致命错误:

sshd[5914]: fatal: percent_expand: string too long
Run Code Online (Sandbox Code Playgroud)

我一直在梳理源代码percent_expand但没有看到任何地方string too long可能会遇到此错误。代币大小似乎有某种限制,但它是什么呢?它是在哪里定义的?

anx*_*anx 13

您使用的是较旧的 OpenSSH 版本,该版本恰好将整个扩展缓冲区限制为 4096 个八位位组。更新到 8.1 以上,无论如何你都应该更新。

您在源代码中找不到的消息已在提交中删除switch percent_expand() to use sshbuf instead of a limited fixed buffer- 请参阅OpenSSH-portableOpenBSD 上游

  • 我*认为*之后的限制接近 256kiB 最大数据包大小(调用 `sftp -v` 时打印为“上传大小”) - 远远超出了允许密钥大小的预期证书大小 - 这在 Linux 上的 OpenSSH-portable 上将保持低于(base64 编码)2MiB `ARG_MAX` 命令调用。 (2认同)