返回博客列表

Claude Code 幽灵会话 Bug:未知来源的 stdin 注入

发现 resume 列表中出现了从未输入过的对话记录,通过 JSONL 日志分析发现异常的 queue-operation 行为。

#Claude Code#Bug#Debug

起因

在使用 Claude Code 过程中,我发现 resume 列表中出现了 4 个奇怪的对话记录,每个对话的首条消息都是 C:/Program Files/Git/help,但我从未主动输入过这个内容。

这 4 个"幽灵会话"出现在同一天的 2 小时内:

Session ID时间文件大小
12bd3669-...07:01:286.6KB
8a3ec0bf-...07:39:03189KB
79a0f413-...08:54:414.6KB
228b9365-...08:57:2512.9KB

调查经过

1. 初步排查

首先排除了以下可能性:

  • 子代理触发: 主会话中没有 enqueue 操作指向这些会话 ID
  • 插件 Hook 输出: 搜索所有插件脚本,没有代码会输出 C:/Program Files/Git/help
  • 定时任务/Cron: 没有相关触发记录
  • MCP Channel/Bridge: 没有远程消息记录
  • 剪贴板粘贴: 剪贴板中没有此内容,且四个时间点分散

2. 日志分析

每个问题会话的 JSONL 文件都以 queue-operation 开头:

{"type":"queue-operation","operation":"enqueue","timestamp":"2026-05-09T07:01:28.124Z","content":"C:/Program Files/Git/help"}
{"type":"queue-operation","operation":"dequeue","timestamp":"2026-05-09T07:01:28.126Z"}
{"type":"progress","data":{"hookEvent":"SessionStart"...}

关键发现:

  • enqueue-dequeue 间隔仅 2ms,明显是程序化输入而非用户手动输入
  • 正常会话的 JSONL 文件以 SessionStart hook 开头,没有 queue-operation
  • 问题会话的 queue-operation 是文件的第一条记录

3. 核心异常

正常会话开始流程

进程启动 → SessionStart hook → REPL 初始化 → 等待用户输入 → 直接处理(无 queue)

问题会话启动流程

进程启动 → queue-operation enqueue(异常)→ dequeue → SessionStart hook → 处理入队消息

这说明消息在会话启动期间被注入了队列。

4. 根因未知但范围确认

确认的事实

  • 何时: 会话启动期间内容被注入队列
  • 何物: 注入内容是 C:/Program Files/Git/help
  • 速度: 2ms 间隔表明程序化输入

未确认:什么进程/组件触发了注入

可能的调查方向:

  • stdin 捕获机制(session initialization 期间)
  • Windows Terminal 缓冲区行为

与其他 Issue 的区分

系统自动标记了 3 个可能重复的 issue,但我们确认这是不同的问题:

Issue核心问题症状
#57413僵尸进程持有全局锁文件CLI 卡在 loading 动画
#50865后台 shell 在会话结束后继续运行现有会话中意外执行命令
#55893后台 bash 任务卡住任务显示 "running" 但实际卡住
#57605未知 - 队列注入检测到意外创建新会话,内容为幽灵输入

前三者是进程生命周期管理问题(孤儿/僵尸进程),本 issue 是队列注入问题

提交 Issue

已提交 Issue: https://github.com/anthropics/claude-code/issues/57605(opens in a new tab)

Issue 被自动标记为可能重复,已提交评论说明与其他 Issue 的区别。

经验教训

  1. 日志分析很重要: JSONL 文件记录了完整的会话流程,是排查问题的关键
  2. 对比正常行为: 发现异常的关键是了解正常流程是什么样的
  3. 如实记录未知: 根因不确定时明确标注,为后续调查提供方向

相关链接


最后更新: 2026-05-09