安装验证:沙盒安装通过,Web 冒烟失败 (L5 failed) · 验证于 dsh 0.2.1-rc.2 · 验证日期 安装验证详情 →
功能介绍
手机远程操控 DSH:手机浏览器原生页面 + 限时门 + 企微机器人长连接
安装
dsh plugin --profile web add github:renger185/dsh-phone-remote安装方式: GitHub · 沙盒安装通过,Web 冒烟失败 (L5 failed)
验证与兼容性
按插件版本分组:每张卡是该插件版本实测过的 dsh 版本与安装兼容结论(L5 优先)。只列真测过的组合——未列出 = 未实测,不推定兼容。L1–L3 为插件级静态档(与 dsh 版本无关,各 dsh 行同值):在行内「验证等级」格里与 L4/L5 并列显示、标注「静态」,证据体为插件级单份、随行内「查看检查项与证据」出现,不在各版本重复存储。
External credentials(插件级):未检测到
○ 作者未声明 dsh 版本要求 —— 安装不会因版本被拒。
| 插件版本 \ dsh | dsh 0.2.1-rc.2 |
|---|---|
| v0.3.0 | · |
v0.3.0github2026-10-21
https://github.com/renger185/dsh-phone-remote
该版本无运行时安装实测(仅静态扫描)——兼容性未知,不推定。
仅展示最近 3 个已发布版本;源码快照(commit hash)组、未标注工件组与更早版本不展示——全量档案保留在数据层(插件无任何已发布版本时,快照/未标注组才照常展示)。
作者徽章
将官方徽章嵌入你的 README,展示插件的安全与安装检测状态:
`[](https://www.dsh.so/artifact/dsh-phone-remote-2/)`安全报告
两层自动化检查,都不是人工审核:静态扫描(逐插件规则判定)与模型驱动的动态安全审计(只覆盖静态判定 warn 及以上的插件子集,不执行插件代码)。
静态扫描 低,动态审计最高 高,按「取更严者」→ 总评级 高。
v0.3.0dsh 清单v0.3.0git2026-10-21v0.3.0版本一致clean · gitvet 为 AST 静态扫描(npm 发布物或 git 源码)。
静态发现(10 条)
- 警告childProcess · code-exec
companion/phone-proxy-supervisor.mjs:53child = spawn(process.execPath, [PROXY], { stdio: 'inherit', cwd: HERE, windowsHide: true }) - 警告fsWrite · files
companion/phone-proxy-supervisor.mjs:22fs.appendFileSync(SUPERVISOR_LOG, text + '\n', 'utf8') - 警告fsWrite · files
companion/phone-proxy.mjs:36fs.appendFileSync(LOG_FILE, `[${new Date().toISOString()}] ${line}\n`, 'utf8') - 警告childProcess · code-exec
companion/temp-door.mjs:146const child = spawn(cloudflared, ['tunnel', '--url', `http://127.0.0.1:${PROXY_PORT}`, '--no-autoupdate'], { - 警告netIp · network
companion/temp-door.mjs:146const child = spawn(cloudflared, ['tunnel', '--url', `http://127.0.0.1:${PROXY_PORT}`, '--no-autoupdate'], { - 警告fsWrite · files
companion/temp-door.mjs:56fs.appendFileSync(LOG_FILE, text + '\n', 'utf8') - 警告fsWrite · files
companion/temp-door.mjs:249fs.writeFileSync(STATE_FILE, JSON.stringify({ - 警告childProcess · code-exec
companion/wecom-bot.mjs:55const child = spawn(process.execPath, [path.join(HERE, 'temp-door.mjs'), '--minutes', String(minutes)], { - 警告fsWrite · files
companion/wecom-bot.mjs:40fs.appendFileSync(LOG_FILE, text + '\n', 'utf8') - 警告childProcess · code-exec
index.js:104const child = spawn(process.execPath, [doorScript, '--minutes', String(doorMinutes), '--quiet'], {
展开 5 条审计发现
- high随附代理监听 0.0.0.0,向任何未认证访问者重定向下发真实登录令牌
companion/phone-proxy.mjs:92currentToken() 读取的正是插件写入 login-link.txt 的连接令牌,即可换取 30 天 cookie 的完全控制凭据。监听绑定在 0.0.0.0(第 151 行),局域网内任意主机或经 temp-door/Tailscale 到达该端口的任何人都能 GET / 直接拿到令牌并换取登录会话,构成完全认证绕过。
- hightemp-door 通过 cloudflared 将泄露令牌的代理发布到公网
companion/temp-door.mjs:122注释声称『没有登录钥匙进不去』,但隧道指向的 phone-proxy 会对任何未认证 GET / 自动下发 ?token=。30 分钟窗口内,任何拿到或猜到 trycloudflare 地址(该地址被发到企微聊天记录)的公网用户即可完全控制 Harness,注释中的安全前提不成立。
- medium代理改写 Host 与 Origin,绕过 Harness 的 loopback 信任校验
companion/phone-proxy.mjs:82Host/Origin 校验是 Harness 防御 DNS rebinding 与跨站 WebSocket 劫持的主要手段。代理把二者统一改成 127.0.0.1:<upstream> 并删除 forwarded-for 头,使所有请求看起来同源,上游无法再识别浏览器跨源攻击。
- medium企微聊天文本含「开门」即可远程开启公网隧道
companion/wecom-bot.mjs:82任何能给机器人发消息的主体(机器人所在群的任意成员)都会触发 temp-door 并在会话中回传公网地址。没有发送者白名单、没有二次确认、没有频率限制,暴露窗口可被无限次重新触发。
- medium插件将原始连接令牌推送到第三方 webhook / 聊天记录
index.js:139link 来自 ctx.connection.authenticatedUrl(base),内含进程连接令牌。每次激活都会 POST 到配置的企微 webhook(或 ntfy),完全控制凭据因此进入群聊天记录与第三方服务,任何能访问该通道的人在令牌轮换前均可使用。
宿主插件本身无害,但随附代理监听 0.0.0.0 并向任何未认证请求直接下发登录令牌,temp-door 又把该入口暴露到公网。
口径:动态审计只会把风险往严重里判,不会把风险降下来(只升不降,不构成豁免);模型判错时由人工复核撤回,撤回后回到静态判定。合并判定 = 两层中更严的那一个。
免责声明:静态扫描与动态安全审计都是自动化分析,不构成安全保证。安装前请自行审查。
活跃度
最近提交 2026-10-21 · 活跃度:活跃
• 仓库创建: 2026-10-18
• 星标: ★ 1 · 复刻: 0
• 健康度: 活跃 — 近 30 天有提交
来源
作者 README
GitHub 原文 ↗展示作者仓库中的原始 README 内容,实时抓取、未做改写;优先加载中文版(README.zh-CN.md 等),无中文版时回退英文。
