跳到正文
豫言包管理
← 全部包

安全外壳服务端互通验证 0.1.0

豫言 · 可执行文件

与 OpenSSH 客户端验证服务端换钥、认证及终端会话。

会话运行期间识别本通道、不要求应答的 signal;无 PTY 时仅向登记的子进程发信号,PTY 时仅向登记的控制终端进程组发送。豫言客户端的无 PTY、PTY 模式均验证 TERM 与 INT,服务端返回对应的 exit-signal。未知扩展信号名不执行。

客户端在 exec 应答后连续发送加密 IGNORE、UNIMPLEMENTED、DEBUG,服务端在无 PTY 与 PTY 会话中均继续处理后续 INT 请求并回传 exit-signal。

在无 PTY 与 PTY 会话中,客户端发送要求应答的未知 GLOBAL_REQUEST,服务端返回 REQUEST_FAILURE 后继续处理 INT;无 PTY 会话还验证了 want_reply=false 时直接继续而不发送应答。

创建 /tmp/yyssh服务端互通/服务端会话控制模式 后,服务端在命令应答后发送 IGNORE、UNIMPLEMENTED、DEBUG 和不要求应答的未知 GLOBAL_REQUEST。再创建 /tmp/yyssh服务端互通/服务端会话全局待答模式,服务端另发要求应答的未知全局请求,并验证收到客户端的 REQUEST_FAILURE。豫言客户端使用单步会话收包库时,两种模式均完成命令会话;撤去标记后的默认路径也通过。

真实 OpenSSH 客户端以 RekeyLimit=4K 在通道运行期间多次发起 KEXINIT:无 PTY 的 /bin/cat 会话回传 131072 字节逐字相同;PTY 的 /bin/cat 会话在去除终端正常添加的 CR 后,48894 字节与输入逐字相同。两条路径均在多轮重换钥后正常发送退出和关闭报文,服务端正常退出。

服务端标准流和 PTY 双向桥接还按单调时钟检查本轮换钥间隔,默认 3600 秒。创建 /tmp/yyssh服务端互通/计时重换钥模式 后改为 1 秒:真实 OpenSSH 客户端执行 sleep 2; printf YYSSH_SERVER_TIME_OK,以及 PTY /bin/cat 接收延迟两秒的输入,两条路径的客户端日志均记录首次握手和两次运行中重换钥,输出正确,双方正常退出。撤去标记后的 exit 23 短会话仅记录首次握手并返回 23。

创建 /tmp/yyssh服务端互通/会话主动重换钥模式 后,探针在 exec 应答后发送 KEXINIT。旧钥下先到的通道报文会被有界暂存,并在 NEWKEYS 后按原顺序交给桥接层。豫言客户端无 PTY 小窗口输出和 PTY /bin/cat 输入均已通过;真实 OpenSSH 客户端在该模式下既收到预期的命令退出码 23,也用无 PTY cat 完成 120000 字节逐字回传。关闭此模式时的普通 OpenSSH 命令路径已回归。

认证成功后,服务端探针可识别客户端主动发来的加密 KEXINIT,使用原有密钥交换第二轮 Curve25519/Ed25519 报文,并在双向 NEWKEYS 边界分别切换密钥和 IV。创建 /tmp/yyssh服务端互通/主动重换钥模式 后,服务端会主动发送 KEXINIT;它可保存随后先到的单条 CHANNEL_OPEN,待换钥完成再处理。豫言客户端的两种发起方向及真实 OpenSSH 客户端的服务端主动重协商均已完成命令会话。通道运行期间可处理客户端发起的重协商,也可按任一方向的报文数自动发起,默认阈值为每轮 4096 包。创建 /tmp/yyssh服务端互通/自动重换钥模式 后阈值降至 4 包,供互通测试;无 PTY 的 262144 字节回传和 PTY 的 48894 字节回传均逐字一致,OpenSSH 日志分别记录 11 次和 60 次 KEXINIT 接收(含首次握手)。按时间自动换钥尚未接入,在途通道报文有 16 条及 1 MiB 上限。

若有 /tmp/yyssh服务端互通/主机私钥,探针优先解析无口令 OpenSSH Ed25519 私钥;缺少时才读取 主机私种 原始 32 字节种子。加密或损坏的标准私钥会被拒绝。

PTY、shell 和 exec 请求均按 want_reply 处理:为真才发送 CHANNEL_SUCCESS;为假仍执行请求,并直接进入后续会话。豫言客户端已分别验证无 PTY exec 及 PTY 加 exec 的不要求应答路径,真实 OpenSSH 客户端的要求应答 exec 回归也通过。

无 PTY shell 请求也已接入同一标准流会话循环:服务端启动当前用户的 /bin/sh,接收客户端 stdin,并分别转发输出和错误。真实 OpenSSH 客户端以 ssh -T 发送 echo YUYAN_NO_PTY_SHELL_OK、exit,双方均以 0 退出;新增分流后 exec 的双路输出回归也通过。

无 PTY exec 路径在认证后校验非空、至多 65536 字节且不含 NUL 的命令,再以当前用户身份运行 /bin/sh -c。服务端按加密通道数据写入子进程 stdin,分别把 stdout、stderr 封为 CHANNEL_DATA 和 CHANNEL_EXTENDED_DATA,共用远端窗口,并返回实际 exit-status。真实 OpenSSH 客户端已验证双路输出、cat 回传 120894 字节逐字相同,以及 exit 23 返回 23。探针仍限回环地址、单连接和有界空闲时间;高权限多用户模式尚未实现。

PTY shell 路径可响应真实 OpenSSH 客户端的 shell 请求,启动当前用户的 /bin/sh,双向转发命令与输出,并以实际子进程退出码返回 exit-status。已验证输入 echo YUYAN_SHELL_OK、exit 后客户端与服务端均以 0 退出。cat 和 tty 路径仍分别通过双向与单向转发回归。

若存在 /tmp/yyssh服务端互通/authorized_keys,探针优先从其中逐行查找请求所呈的 Ed25519 公钥;可列出多把钥。no-pty、restrict 等受支持限制会随认证结果传入会话,终端分配请求收到 CHANNEL_FAILURE 和 CHANNEL_CLOSE;无 PTY 的命令仍可运行。真实 OpenSSH 客户端已验证这两条路径。其他前置选项不授权。缺少此文件时继续使用下述 .pub 或 32 字节单钥文件。

若存在 /tmp/yyssh服务端互通/获准公钥.pub,探针从单行 OpenSSH ssh-ed25519 公钥文本读取授权钥;否则沿用 /tmp/yyssh服务端互通/获准公钥 的 32 字节原始公钥。真实 OpenSSH 客户端用 ssh-keygen 生成的 .pub 文件认证已通过。

/bin/cat 路径调用 安全外壳会话/双向终端。豫,以同一次多路等待交错推进 TCP 收包、PTY 待读写和窗口增量;只按实际写入 PTY 的字节回补接收窗口,输出则受客户端窗口约束。PTY 从端关闭回显但保留规范行模式。真实 OpenSSH 客户端发送 22,000 条编号记录(132,000 字节,超过两倍初始接收窗口)后,全部记录按序各回传一次,无缺号或重复。

豫言客户端探针另以 64 字节和 1 字节初始接收窗口请求 PTY cat;服务端分别完整回传 1,000 字节与 5 字节。1 字节窗口使服务端每发送一个字节就必须等待下一次 WINDOW_ADJUST。

服务端现用单步非阻塞加密收包库保留半包、余帧与接收 IV。OpenSSH 默认在 exec 前发送数条 env 通道请求;探针严格解析这些请求但不应用环境变量,若要求应答则回 CHANNEL_FAILURE。无 PTY 的 true、PTY 的 /usr/bin/tty 和 /bin/cat 路径都已与真实 OpenSSH 客户端通过;PTY 路径也在发送 CLOSE 后等待客户端 CLOSE,再关闭 TCP。

认证成功后,探针还会发送一个未知且要求应答的 probe@example.com 全局请求;它允许 CHANNEL_OPEN 与 REQUEST_FAILURE 按任一顺序到达,验证两者后再确认通道。固定 true 路径发送退出状态、EOF 和 CLOSE 后,会等客户端回送 CHANNEL_CLOSE 再关闭 TCP。真实 OpenSSH 客户端和豫言客户端均已完成此流程。

此一次性测试程序监听 127.0.0.1:22222,读取标准主机私钥或原始种子、用户名 以及 authorized_keys、.pub 或 32 字节 获准公钥。它与 OpenSSH 客户端交换版本、KEXINIT、Curve25519 回报和 NEWKEYS,接受加密的 ssh-userauth 服务请求,然后拒绝 none 认证。公钥认证循环最多处理 12 次请求:未授权请求收到 USERAUTH_FAILURE,获准公钥试探收到 PK_OK,只有指定用户、服务和会话号上的有效 Ed25519 签名才收到 USERAUTH_SUCCESS;第 12 次失败则发送加密 DISCONNECT,原因码 14。真实 OpenSSH 客户端使用两把临时密钥时,先收到未授权密钥的失败,再以第二把获准密钥登录;仅用 12 把错误密钥时收到明确的 DISCONNECT。两种结局下探针均关闭连接和监听端并正常退出;成功后才解析 session 通道开启。无 PTY 时执行获准用户所请的 exec 命令,发送请求成功、exit-status 0、EOF 和 CLOSE,并以通道寿命状态等待客户端 CLOSE,拒绝重复 EOF。收到 PTY 请求时接受 shell 请求启动当前用户的 /bin/sh,或接受受限的 /usr/bin/tty 与 /bin/cat 的 exec 请求,启动当前用户的真实控制终端子进程,并按客户端窗口将 PTY 输出转发为 CHANNEL_DATA。cat 路径把客户端 CHANNEL_DATA 写入 PTY,对部分写入的尾部等待可写并限次重试,按累计实际写入量发送 WINDOW_ADJUST,客户端 EOF 后向终端写入 EOT。真实 OpenSSH 客户端在四种路径下均以 0 退出;tty 返回实际 /dev/ttys...,cat 回传测试文本。cat 路径可处理经验证的多轮接收窗口数据;探针仍限定单连接、受限 exec 命令和有界空闲时间,尚不支持通用长期会话。测试须预置匹配的主机公钥并严格校验,结束后删除临时私钥。

依赖

查看包配置

上传历史

当前上传修订:1 ·

  1. 上传修订 1
    下载 ZIP

包层级

父包:安全外壳

没有子包。