Commit Graph
56 Commits
Author SHA1 Message Date
TanXin 0871b64426 fix(ssh): 修复 IPv6 地址连接失败和重连计数器不递增的问题
- IPv6 地址传入 connect() API 前自动添加方括号包裹,避免冒号被误解析为 host:port 分隔符
- 移除 WebSocket onopen 中的 reconnectAttempts 重置,改为 SSH 认证成功时才重置,修复重连计数始终显示 1/5 的问题
2026-06-21 17:23:51 +08:00
TanXin 4c4476cf5e fix(security): 主机密钥签名验证失败时阻断连接,修复sendMutex乱序,移除本地速率限制,消除any类型
- 主机密钥签名验证失败/异常/不支持算法时默认阻断连接(STRICT_HOST_KEY_VERIFY=false 可跳过)
- 修复 sendMutex 的 .catch(() => {}) 导致后续操作可能乱序的问题
- 移除分布式环境下无效的本地内存速率限制(rateLimitMap)
- 替换 ssh-session.ts 和 user-db.ts 中 18 处 any 类型为具体类型
- 移除未使用的 findCRLF 死代码
- 移除 enableEncryption 中泄露密钥/IV 的调试日志
- connectTokens 增加 MAX_CONNECT_TOKENS=1000 上限防止内存泄漏
2026-06-21 12:43:22 +08:00
TanXin c7bd10aa77 修复安全漏洞:实现分布式速率限制和HMAC-SHA256令牌签名 2026-06-21 11:35:18 +08:00
GreenhandTan aa62391997 fix(ui): 修复匿名断开后点击 GitHub 登录导致表单意外提交刷新的 BUG 2026-06-21 11:06:57 +08:00
GreenhandTan 6ac398accb fix(ui): 修复从终端返回用户空间后连接按钮状态未重置的 BUG 2026-06-21 10:55:57 +08:00
GreenhandTan 557444dff9 feat: 自动生成并持久化 SESSION_SECRET
- 在 UserDBDO 中新增 system_config 表用于持久化系统级配置
- 当环境变量未提供 SESSION_SECRET 时,自动生成安全的随机密钥并保存,提升易用性和安全性
- 移除中英文 README 及 wrangler.toml 中手动设置 SESSION_SECRET 的指引
2026-06-21 10:38:11 +08:00
GreenhandTan c60b004fb4 feat: 新增 GitHub OAuth 登录与个人空间服务器管理功能
- 引入 SQLite (UserDBDO) 存储用户、会话与服务器凭据
- 实现基于 GitHub 的 OAuth 授权登录工作流
- 新增用户个人空间界面,支持服务器节点的增删改查
- 支持服务器凭据的一键连接(通过 one-time-token 安全传递凭据)
- 修改开源协议为 Apache License 2.0
- 更新中英文 README,添加新增功能的配置与部署说明
2026-06-21 10:25:45 +08:00
TanXin 8da7a97e31 fix: 用户 exit 时不再触发自动重连
- 区分正常关闭(用户 exit、会话结束)和异常关闭(网络错误等)
- 正常关闭使用 WebSocket close code 1000
- 客户端仅在 close code !== 1000 时触发重连
2026-06-17 18:02:35 +08:00
TanXin 4da150c20d fix: 添加心跳保活和自动重连,解决 SSH 连接自动断开问题
- 客户端每 30 秒发送 WebSocket ping 保持连接活跃
- 服务端每 25 秒发送 SSH_MSG_IGNORE 保活 SSH 连接
- 正确响应 keepalive@openssh.com 全局请求
- 连接断开后自动重连(指数退避,最多 5 次)
2026-06-17 17:46:40 +08:00
TanXin adf126c715 fix: 修复重连时按键重复输入问题
- 保存 onData/onResize 事件的 IDisposable
- 断开连接时清理所有事件监听器
- 防止多次连接导致监听器累积
2026-06-17 11:35:52 +08:00
TanXin ef231fbd17 feat: 支持 ssh-rsa 及其 SHA-2 变体的主机密钥签名验证 2026-06-17 08:59:11 +08:00
TanXin 15650ce7a8 refactor: Turnstile sitekey 改为环境变量配置
- 添加 TURNSTILE_SITEKEY 环境变量
- 用户无需修改代码,只需配置环境变量即可启用
- 更新 README 文档简化配置说明
2026-06-16 14:03:56 +08:00
TanXin db9dcfd08d fix: Turnstile 改为会话级别验证
- 验证通过后当前会话有效,关闭浏览器后失效
- 移除24小时 Max-Age,使用会话 cookie
2026-06-16 13:59:53 +08:00
TanXin 8ccf0bb3ed feat: 集成 Cloudflare Turnstile 人机验证
- 添加 Turnstile 验证 API 端点
- 前端集成 Turnstile 组件
- 支持可选配置,未配置时不影响使用
- 更新 README 文档添加配置说明
2026-06-16 13:54:04 +08:00
谭鑫 d917ed36d1 feat: 完善 IPv6 地址支持
- 前端输入框自动移除 IPv6 地址的方括号格式
- 更新 placeholder 示例包含 IPv6 地址
- README 文档添加 IPv4/IPv6 双栈支持说明
2026-06-16 10:51:21 +08:00
GreenhandTan 7e4123c1a3 refactor: 移除 WebSocket Roaming 机制
由于目标使用场景为网络稳定的桌面浏览器,移除 Roaming 可避免在断线期间保持 Durable Object 存活而产生不必要的活跃时间配额消耗。
2026-06-15 08:31:00 +08:00
GreenhandTan ff7b65dcd1 feat: 核心功能升级与安全加固
- 🛡️ 安全(Security):
  - 彻底修复 IPv6 及保留地址的 SSRF 绕过漏洞。
  - 新增基于 IP 的连接频率限制 (10次/分钟) 防范暴力破解。
  - 在 localStorage 中通过 Web Crypto (AES-GCM) 对记住的凭证进行加密存储。
  - 连接时静默计算并输出服务器 Host Key 指纹 (SHA-256),兼顾安全与易用性。

- ✨ 功能(Feature):
  - 支持基于 Ed25519 的 SSH 纯文本私钥直接登录。
  - 前端终端集成 zmodem.js,支持在终端中运行 rz/sz 实现浏览器与服务器文件的直接拖拽与无缝传输。
  - 支持 WebSocket 会话漫游 (Roaming),网络短暂断开可借助 Durable Object 在 15 秒内静默重连恢复会话,免去重新输入密码的繁琐。

- 🎨 体验与界面(UX/UI):
  - 前端渲染引擎升级为 WebGL (@xterm/addon-webgl),大幅提升海量文本滚动的帧率与流畅度。
  - 新增内置极客主题下拉框 (Cyberpunk / Glacier / Gruvbox) 及右键复制粘贴支持。
2026-06-15 08:22:59 +08:00
GreenhandTan 31d3008151 fix(ssh): 修复因并发发送导致 AES-GCM 序列号错乱而断开连接的 Bug,以及部分按键被忽略的问题 2026-06-14 11:26:05 +08:00
GreenhandTan 1e3b1377d1 fix(security): 增加 HTTP 安全响应头与 WebSocket Origin 校验
- 增加 X-Frame-Options: DENY 防止点击劫持
- 增加 X-Content-Type-Options: nosniff 防止 MIME 嗅探
- 增加 WebSocket Origin 校验防止跨站 WebSocket 劫持 (CSWSH) 和额度滥用
2026-06-14 11:14:56 +08:00
GreenhandTan 6d20ce383a fix(security): 防止内网扫描与高危端口访问 (SSRF 防护)
- 拦截指向内网 IP (如 127.0.0.x, 10.x.x.x, 192.168.x.x 等) 的连接请求
- 拦截非 SSH 常用端口 (如 80, 443, 25, 3306 等)
- 防止恶意用户利用免认证接口滥用 Cloudflare 边缘节点充当非法代理跳板
2026-06-14 11:11:28 +08:00
GreenhandTan 4b04c07f0f feat: 完善核心功能并完成开源准备
- 修复 AES-GCM 数据包 Padding 计算错误
- 修复 SSH Keepalive 心跳包导致自动断开的问题,引入 Global Request 处理
- 将 WebSocket 实现迁移至 Durable Object Hibernation API,支持超长会话
- 前端添加动态版权年份,并精简控制台 Debug 输出
- 添加中英文双语 README 帮助文档
- 清理测试产生的日志与临时文件
2026-06-14 11:02:15 +08:00
GreenhandTan 4fc4e7ec42 chore: 添加KEX详细字节调试日志并修复package.json中的wrangler执行方式 2026-06-14 10:05:56 +08:00
GreenhandTan 6fdd83e631 fix: 解决主机密钥算法不兼容导致密钥协商卡死的问题并健全TCP连接断开处理 2026-06-14 09:29:28 +08:00
GreenhandTan e85bcee10e style: 将最新的赛博朋克主题UI与样式迁移至模块化前端项目并重新编译 2026-06-14 09:24:22 +08:00
GreenhandTan ddf2156103 fix: 修复前端资源内嵌时由于 String.replace 占位符解析引发的乱码与DOM损坏问题 2026-06-14 09:21:19 +08:00
GreenhandTan 5ed25efe6f fix: 修复SSH自定义协议连接缺陷并优化前端集成构建流程 2026-06-14 09:12:46 +08:00
TanXin 58432afd04 fix: 修复SSH协议实现和改善错误处理
- 修复nonce构造方法,使用字节操作替代DataView
- 修复密钥派生函数,正确编码H参数为SSH字符串
- 改善版本交换处理,正确解析CRLF分割的版本信息
- 添加SSH_MSG_CHANNEL_OPEN_FAILURE消息类型支持
- 清理冗余调试日志,保留关键调试信息
- 改善错误处理和状态管理
- 添加通道打开失败和PTY请求失败处理
2026-06-13 21:17:41 +08:00
TanXin 806fd2c9ec fix: encode session_id as SSH string in key derivation + add AES-GCM AAD
Key derivation: session_id must be encoded as SSH string (4-byte length
prefix + value) per OpenSSH implementation, matching how shared_secret
is already encoded as mpint.

AES-GCM: pass packet_length as additionalData (AAD) per RFC 5647.
2026-06-13 00:45:04 +08:00
TanXin b4da52e645 fix: add AES-GCM AAD (packet_length) for SSH RFC 5647 compliance
AES-GCM requires the 4-byte packet_length field as Additional
Authenticated Data (AAD). Without this, the server's MAC verification
fails and it closes the connection.
2026-06-13 00:06:42 +08:00
TanXin 295c453fba fix: restore seqNum resets after NEWKEYS test 2026-06-13 00:02:39 +08:00
TanXin 96482c1a2c test: try no seqNum reset at NEWKEYS 2026-06-12 23:54:19 +08:00
TanXin 738c206cdb fix: keep parser seqNum at 3 for EXT_INFO after NEWKEYS 2026-06-12 23:46:58 +08:00
TanXin 5e5375430f debug: add detailed key exchange and encryption logging 2026-06-12 23:42:10 +08:00
TanXin 9f248777c4 fix: send SERVICE_REQUEST before auth per RFC 4252 2026-06-12 23:37:32 +08:00
TanXin 344e4534c2 fix: 修复 AES-GCM nonce 构造和解密认证标签问题,添加调试日志
- 修复 buildNonce: 使用 XOR 替代直接替换 (OpenSSH 规范要求)
- 修复 nextPacket: 传入完整 ciphertext+tag 给 AES-GCM 解密
- 保留 NEWKEYS 后序列号重置为 0
- 添加加密/解密调试日志和前端状态消息
2026-06-12 23:33:36 +08:00
IT d355e2c10c fix: NEWKEYS 后重置序列号为 0(加密上下文切换) 2026-06-12 19:01:43 +08:00
IT 8c5f0fa6ed fix: AES-GCM 模式下 packet_length 不加密 (RFC 5647)
- Builder: 加密时只加密 length 之后的数据,保留明文 length 字段
- Parser: 解密时跳过 length 字段,只解密后续数据
- 通过 hasAuthTag 参数区分 AES-GCM 和普通模式
2026-06-12 18:44:17 +08:00
IT 448547ed5b fix: 修复 encrypt/decrypt 异步调用未 await 导致 Promise 写入 socket 的问题
- SSHPacketBuilder.build 改为 async,await encrypt 函数
- SSHPacketParser.nextPacket 改为 async,await decrypt 函数
- 所有调用点加上 await
2026-06-12 18:31:43 +08:00
IT 4a94323cdd debug: 改进错误日志,显示具体错误信息 2026-06-12 18:29:26 +08:00
IT e49f7fe4ef fix: 修复 SSH 协议实现的多个关键 bug
- ECDH_INIT 发送原始 EC 点而非 SSH 公钥 blob
- Exchange hash 计算使用 encodeString 包装所有字段
- NEWKEYS 以明文发送后再启用加密
- AES-GCM 模式下 MAC 算法改为 none
- 修复 WebSocket 发送 Uint8Array 时 buffer 偏移问题
2026-06-12 18:22:02 +08:00
IT cbafaef1ac debug: 添加完整的 SSH 流程调试日志 2026-06-12 17:45:56 +08:00
IT bf9003d176 debug: 添加凭据接收调试日志 2026-06-12 17:41:59 +08:00
IT 9c3168cb8d fix: 清理重复代码 2026-06-12 17:37:19 +08:00
IT 890d3055dc security: 凭据通过 WebSocket 消息传递,不再暴露在 URL 中 2026-06-12 17:35:42 +08:00
IT 2c44d4fedd debug: 添加更详细的 KEX 调试日志 2026-06-12 17:33:32 +08:00
IT b09eb5bad7 debug: 添加 KEX 流程调试日志 2026-06-12 17:27:23 +08:00
IT c3fb472b2b fix: KEX 阶段不需要 GCM auth tag 2026-06-12 17:19:02 +08:00
IT 54bf260817 debug: 添加 SSH 协议调试日志 2026-06-12 17:14:13 +08:00
IT 68014add8b fix: 修复 shell 状态处理,添加调试日志 2026-06-12 17:08:42 +08:00
IT 103065245d feat: 重构终端页面 UI 为赛博朋克风格 2026-06-12 16:59:34 +08:00