@zhin.js/agent 0.1.25 → 0.1.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/agent-prompt/registry.js +1 -1
- package/lib/agent-prompt/registry.js.map +1 -1
- package/lib/ai-event-bus.d.ts +19 -0
- package/lib/ai-event-bus.d.ts.map +1 -0
- package/lib/ai-event-bus.js +75 -0
- package/lib/ai-event-bus.js.map +1 -0
- package/lib/ai-event-subscriber.d.ts +38 -0
- package/lib/ai-event-subscriber.d.ts.map +1 -0
- package/lib/ai-event-subscriber.js +61 -0
- package/lib/ai-event-subscriber.js.map +1 -0
- package/lib/builtin/ask-user-tool.d.ts +2 -0
- package/lib/builtin/ask-user-tool.d.ts.map +1 -1
- package/lib/builtin/ask-user-tool.js +2 -0
- package/lib/builtin/ask-user-tool.js.map +1 -1
- package/lib/builtin/bash-tool.d.ts +7 -3
- package/lib/builtin/bash-tool.d.ts.map +1 -1
- package/lib/builtin/bash-tool.js +51 -9
- package/lib/builtin/bash-tool.js.map +1 -1
- package/lib/builtin/bing-search-html.d.ts.map +1 -1
- package/lib/builtin/bing-search-html.js +14 -7
- package/lib/builtin/bing-search-html.js.map +1 -1
- package/lib/builtin/builtin-base-tool.d.ts +2 -0
- package/lib/builtin/builtin-base-tool.d.ts.map +1 -1
- package/lib/builtin/builtin-base-tool.js +5 -0
- package/lib/builtin/builtin-base-tool.js.map +1 -1
- package/lib/builtin/edit-file-tool.d.ts +1 -1
- package/lib/builtin/edit-file-tool.d.ts.map +1 -1
- package/lib/builtin/edit-file-tool.js +33 -1
- package/lib/builtin/edit-file-tool.js.map +1 -1
- package/lib/builtin/file-edit-quote-utils.d.ts +1 -3
- package/lib/builtin/file-edit-quote-utils.d.ts.map +1 -1
- package/lib/builtin/file-edit-quote-utils.js +1 -3
- package/lib/builtin/file-edit-quote-utils.js.map +1 -1
- package/lib/builtin/glob-tool.d.ts +1 -1
- package/lib/builtin/glob-tool.d.ts.map +1 -1
- package/lib/builtin/glob-tool.js +15 -3
- package/lib/builtin/glob-tool.js.map +1 -1
- package/lib/builtin/grep-tool.d.ts +1 -1
- package/lib/builtin/grep-tool.d.ts.map +1 -1
- package/lib/builtin/grep-tool.js +16 -3
- package/lib/builtin/grep-tool.js.map +1 -1
- package/lib/builtin/list-dir-tool.d.ts +1 -1
- package/lib/builtin/list-dir-tool.d.ts.map +1 -1
- package/lib/builtin/list-dir-tool.js +14 -3
- package/lib/builtin/list-dir-tool.js.map +1 -1
- package/lib/builtin/read-file-tool.d.ts +1 -1
- package/lib/builtin/read-file-tool.d.ts.map +1 -1
- package/lib/builtin/read-file-tool.js +24 -3
- package/lib/builtin/read-file-tool.js.map +1 -1
- package/lib/builtin/run-deferred-task-tool.d.ts +3 -0
- package/lib/builtin/run-deferred-task-tool.d.ts.map +1 -1
- package/lib/builtin/run-deferred-task-tool.js +2 -0
- package/lib/builtin/run-deferred-task-tool.js.map +1 -1
- package/lib/builtin/spawn-task-tool.d.ts.map +1 -1
- package/lib/builtin/spawn-task-tool.js +2 -0
- package/lib/builtin/spawn-task-tool.js.map +1 -1
- package/lib/builtin/web-fetch-tool.d.ts +2 -2
- package/lib/builtin/web-fetch-tool.d.ts.map +1 -1
- package/lib/builtin/web-fetch-tool.js +12 -18
- package/lib/builtin/web-fetch-tool.js.map +1 -1
- package/lib/builtin/write-file-tool.d.ts +1 -1
- package/lib/builtin/write-file-tool.d.ts.map +1 -1
- package/lib/builtin/write-file-tool.js +33 -1
- package/lib/builtin/write-file-tool.js.map +1 -1
- package/lib/common-adapter-tools.d.ts +8 -41
- package/lib/common-adapter-tools.d.ts.map +1 -1
- package/lib/common-adapter-tools.js +23 -182
- package/lib/common-adapter-tools.js.map +1 -1
- package/lib/deferred-worker-runner.d.ts +13 -2
- package/lib/deferred-worker-runner.d.ts.map +1 -1
- package/lib/deferred-worker-runner.js +91 -13
- package/lib/deferred-worker-runner.js.map +1 -1
- package/lib/discovery/agents.js +1 -1
- package/lib/discovery/agents.js.map +1 -1
- package/lib/discovery/skills.js +1 -1
- package/lib/discovery/skills.js.map +1 -1
- package/lib/discovery/tools.d.ts +1 -1
- package/lib/discovery/tools.d.ts.map +1 -1
- package/lib/discovery/tools.js +17 -4
- package/lib/discovery/tools.js.map +1 -1
- package/lib/discovery/utils.js +1 -1
- package/lib/discovery/utils.js.map +1 -1
- package/lib/hooks.d.ts.map +1 -1
- package/lib/hooks.js +2 -0
- package/lib/hooks.js.map +1 -1
- package/lib/index.d.ts +9 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +6 -0
- package/lib/index.js.map +1 -1
- package/lib/init/message-media.d.ts +3 -1
- package/lib/init/message-media.d.ts.map +1 -1
- package/lib/init/message-media.js +20 -0
- package/lib/init/message-media.js.map +1 -1
- package/lib/init/register-ai-service.js.map +1 -1
- package/lib/init/register-ai-trigger.d.ts.map +1 -1
- package/lib/init/register-ai-trigger.js +71 -10
- package/lib/init/register-ai-trigger.js.map +1 -1
- package/lib/init/register-builtin-tools.js +7 -7
- package/lib/init/register-builtin-tools.js.map +1 -1
- package/lib/init/register-typing-indicator.d.ts +9 -0
- package/lib/init/register-typing-indicator.d.ts.map +1 -0
- package/lib/init/register-typing-indicator.js +206 -0
- package/lib/init/register-typing-indicator.js.map +1 -0
- package/lib/init.d.ts.map +1 -1
- package/lib/init.js +2 -0
- package/lib/init.js.map +1 -1
- package/lib/mcp-client/connection.d.ts +2 -0
- package/lib/mcp-client/connection.d.ts.map +1 -1
- package/lib/mcp-client/connection.js +7 -0
- package/lib/mcp-client/connection.js.map +1 -1
- package/lib/mcp-client/index.d.ts +2 -0
- package/lib/mcp-client/index.d.ts.map +1 -1
- package/lib/mcp-client/index.js +19 -2
- package/lib/mcp-client/index.js.map +1 -1
- package/lib/monitoring/index.d.ts +79 -0
- package/lib/monitoring/index.d.ts.map +1 -0
- package/lib/monitoring/index.js +197 -0
- package/lib/monitoring/index.js.map +1 -0
- package/lib/monitoring/metrics.d.ts +240 -0
- package/lib/monitoring/metrics.d.ts.map +1 -0
- package/lib/monitoring/metrics.js +483 -0
- package/lib/monitoring/metrics.js.map +1 -0
- package/lib/orchestrator/agent-dispatcher.d.ts +170 -0
- package/lib/orchestrator/agent-dispatcher.d.ts.map +1 -0
- package/lib/orchestrator/agent-dispatcher.js +379 -0
- package/lib/orchestrator/agent-dispatcher.js.map +1 -0
- package/lib/orchestrator/hook-registry.d.ts.map +1 -1
- package/lib/orchestrator/hook-registry.js +2 -0
- package/lib/orchestrator/hook-registry.js.map +1 -1
- package/lib/orchestrator/index.d.ts +2 -0
- package/lib/orchestrator/index.d.ts.map +1 -1
- package/lib/orchestrator/index.js +2 -0
- package/lib/orchestrator/index.js.map +1 -1
- package/lib/orchestrator/mcp-lifecycle.d.ts +1 -1
- package/lib/orchestrator/mcp-lifecycle.d.ts.map +1 -1
- package/lib/orchestrator/mcp-lifecycle.js +2 -2
- package/lib/orchestrator/mcp-lifecycle.js.map +1 -1
- package/lib/orchestrator/mcp-registry.d.ts +8 -1
- package/lib/orchestrator/mcp-registry.d.ts.map +1 -1
- package/lib/orchestrator/mcp-registry.js +28 -5
- package/lib/orchestrator/mcp-registry.js.map +1 -1
- package/lib/orchestrator/task-queue.d.ts +147 -0
- package/lib/orchestrator/task-queue.d.ts.map +1 -0
- package/lib/orchestrator/task-queue.js +337 -0
- package/lib/orchestrator/task-queue.js.map +1 -0
- package/lib/orchestrator/tool-selection.d.ts.map +1 -1
- package/lib/orchestrator/tool-selection.js +3 -0
- package/lib/orchestrator/tool-selection.js.map +1 -1
- package/lib/orchestrator/types.d.ts +8 -0
- package/lib/orchestrator/types.d.ts.map +1 -1
- package/lib/plugin-ai-hook-bus.d.ts +4 -0
- package/lib/plugin-ai-hook-bus.d.ts.map +1 -0
- package/lib/plugin-ai-hook-bus.js +24 -0
- package/lib/plugin-ai-hook-bus.js.map +1 -0
- package/lib/security/anomaly-detection.d.ts +119 -0
- package/lib/security/anomaly-detection.d.ts.map +1 -0
- package/lib/security/anomaly-detection.js +305 -0
- package/lib/security/anomaly-detection.js.map +1 -0
- package/lib/security/audit-logger.d.ts +158 -0
- package/lib/security/audit-logger.d.ts.map +1 -0
- package/lib/security/audit-logger.js +379 -0
- package/lib/security/audit-logger.js.map +1 -0
- package/lib/security/bash-tool-context.d.ts +3 -3
- package/lib/security/bash-tool-context.d.ts.map +1 -1
- package/lib/security/budget-limiter.d.ts +156 -0
- package/lib/security/budget-limiter.d.ts.map +1 -0
- package/lib/security/budget-limiter.js +363 -0
- package/lib/security/budget-limiter.js.map +1 -0
- package/lib/security/dangerous-tool-policy.d.ts +17 -0
- package/lib/security/dangerous-tool-policy.d.ts.map +1 -0
- package/lib/security/dangerous-tool-policy.js +137 -0
- package/lib/security/dangerous-tool-policy.js.map +1 -0
- package/lib/security/exec-policy.d.ts +21 -12
- package/lib/security/exec-policy.d.ts.map +1 -1
- package/lib/security/exec-policy.js +198 -25
- package/lib/security/exec-policy.js.map +1 -1
- package/lib/security/file-policy.d.ts +0 -1
- package/lib/security/file-policy.d.ts.map +1 -1
- package/lib/security/file-policy.js +112 -14
- package/lib/security/file-policy.js.map +1 -1
- package/lib/security/file-role-policy.d.ts +119 -0
- package/lib/security/file-role-policy.d.ts.map +1 -0
- package/lib/security/file-role-policy.js +268 -0
- package/lib/security/file-role-policy.js.map +1 -0
- package/lib/security/index.d.ts +59 -0
- package/lib/security/index.d.ts.map +1 -1
- package/lib/security/index.js +68 -0
- package/lib/security/index.js.map +1 -1
- package/lib/security/network-policy.d.ts +94 -0
- package/lib/security/network-policy.d.ts.map +1 -0
- package/lib/security/network-policy.js +291 -0
- package/lib/security/network-policy.js.map +1 -0
- package/lib/security/owner-approve-always-store.d.ts +2 -0
- package/lib/security/owner-approve-always-store.d.ts.map +1 -1
- package/lib/security/owner-approve-always-store.js +37 -0
- package/lib/security/owner-approve-always-store.js.map +1 -1
- package/lib/security/sandbox-enhanced.d.ts +170 -0
- package/lib/security/sandbox-enhanced.d.ts.map +1 -0
- package/lib/security/sandbox-enhanced.js +630 -0
- package/lib/security/sandbox-enhanced.js.map +1 -0
- package/lib/security/sandbox.d.ts +104 -0
- package/lib/security/sandbox.d.ts.map +1 -0
- package/lib/security/sandbox.js +373 -0
- package/lib/security/sandbox.js.map +1 -0
- package/lib/security/security-config.example.d.ts +33 -0
- package/lib/security/security-config.example.d.ts.map +1 -0
- package/lib/security/security-config.example.js +166 -0
- package/lib/security/security-config.example.js.map +1 -0
- package/lib/subagent-goal-notify.d.ts +13 -0
- package/lib/subagent-goal-notify.d.ts.map +1 -0
- package/lib/subagent-goal-notify.js +32 -0
- package/lib/subagent-goal-notify.js.map +1 -0
- package/lib/subagent.d.ts +24 -0
- package/lib/subagent.d.ts.map +1 -1
- package/lib/subagent.js +98 -16
- package/lib/subagent.js.map +1 -1
- package/lib/typing-indicator/adapter-integration.d.ts +140 -0
- package/lib/typing-indicator/adapter-integration.d.ts.map +1 -0
- package/lib/typing-indicator/adapter-integration.js +473 -0
- package/lib/typing-indicator/adapter-integration.js.map +1 -0
- package/lib/typing-indicator/index.d.ts +170 -0
- package/lib/typing-indicator/index.d.ts.map +1 -0
- package/lib/typing-indicator/index.js +311 -0
- package/lib/typing-indicator/index.js.map +1 -0
- package/lib/typing-indicator/integration.d.ts +91 -0
- package/lib/typing-indicator/integration.d.ts.map +1 -0
- package/lib/typing-indicator/integration.js +219 -0
- package/lib/typing-indicator/integration.js.map +1 -0
- package/lib/zhin-agent/config.d.ts +20 -2
- package/lib/zhin-agent/config.d.ts.map +1 -1
- package/lib/zhin-agent/config.js +27 -9
- package/lib/zhin-agent/config.js.map +1 -1
- package/lib/zhin-agent/event-emitter.d.ts +11 -0
- package/lib/zhin-agent/event-emitter.d.ts.map +1 -0
- package/lib/zhin-agent/event-emitter.js +43 -0
- package/lib/zhin-agent/event-emitter.js.map +1 -0
- package/lib/zhin-agent/index.d.ts +9 -31
- package/lib/zhin-agent/index.d.ts.map +1 -1
- package/lib/zhin-agent/index.js +70 -672
- package/lib/zhin-agent/index.js.map +1 -1
- package/lib/zhin-agent/llm-runner.d.ts +16 -0
- package/lib/zhin-agent/llm-runner.d.ts.map +1 -0
- package/lib/zhin-agent/llm-runner.js +85 -0
- package/lib/zhin-agent/llm-runner.js.map +1 -0
- package/lib/zhin-agent/model-resolver.d.ts +9 -0
- package/lib/zhin-agent/model-resolver.d.ts.map +1 -0
- package/lib/zhin-agent/model-resolver.js +25 -0
- package/lib/zhin-agent/model-resolver.js.map +1 -0
- package/lib/zhin-agent/phase-trace.d.ts +12 -0
- package/lib/zhin-agent/phase-trace.d.ts.map +1 -0
- package/lib/zhin-agent/phase-trace.js +24 -0
- package/lib/zhin-agent/phase-trace.js.map +1 -0
- package/lib/zhin-agent/prompt-assembly.d.ts +22 -0
- package/lib/zhin-agent/prompt-assembly.d.ts.map +1 -0
- package/lib/zhin-agent/prompt-assembly.js +66 -0
- package/lib/zhin-agent/prompt-assembly.js.map +1 -0
- package/lib/zhin-agent/prompt-builder.d.ts +200 -0
- package/lib/zhin-agent/prompt-builder.d.ts.map +1 -0
- package/lib/zhin-agent/prompt-builder.js +574 -0
- package/lib/zhin-agent/prompt-builder.js.map +1 -0
- package/lib/zhin-agent/prompt-templates.d.ts +160 -0
- package/lib/zhin-agent/prompt-templates.d.ts.map +1 -0
- package/lib/zhin-agent/prompt-templates.js +436 -0
- package/lib/zhin-agent/prompt-templates.js.map +1 -0
- package/lib/zhin-agent/prompt.d.ts +15 -0
- package/lib/zhin-agent/prompt.d.ts.map +1 -1
- package/lib/zhin-agent/prompt.js +149 -4
- package/lib/zhin-agent/prompt.js.map +1 -1
- package/lib/zhin-agent/session-io.d.ts +10 -0
- package/lib/zhin-agent/session-io.d.ts.map +1 -0
- package/lib/zhin-agent/session-io.js +14 -0
- package/lib/zhin-agent/session-io.js.map +1 -0
- package/lib/zhin-agent/task-continuation.d.ts +144 -0
- package/lib/zhin-agent/task-continuation.d.ts.map +1 -0
- package/lib/zhin-agent/task-continuation.js +346 -0
- package/lib/zhin-agent/task-continuation.js.map +1 -0
- package/lib/zhin-agent/text-sanitize.d.ts +2 -5
- package/lib/zhin-agent/text-sanitize.d.ts.map +1 -1
- package/lib/zhin-agent/text-sanitize.js +2 -25
- package/lib/zhin-agent/text-sanitize.js.map +1 -1
- package/lib/zhin-agent/tool-calls-user-format.d.ts.map +1 -1
- package/lib/zhin-agent/tool-calls-user-format.js +12 -3
- package/lib/zhin-agent/tool-calls-user-format.js.map +1 -1
- package/lib/zhin-agent/tool-orchestration.d.ts +9 -0
- package/lib/zhin-agent/tool-orchestration.d.ts.map +1 -0
- package/lib/zhin-agent/tool-orchestration.js +68 -0
- package/lib/zhin-agent/tool-orchestration.js.map +1 -0
- package/lib/zhin-agent/tool-search-orchestrator.d.ts.map +1 -1
- package/lib/zhin-agent/tool-search-orchestrator.js +5 -2
- package/lib/zhin-agent/tool-search-orchestrator.js.map +1 -1
- package/lib/zhin-agent/turn-pipeline.d.ts +5 -0
- package/lib/zhin-agent/turn-pipeline.d.ts.map +1 -0
- package/lib/zhin-agent/turn-pipeline.js +541 -0
- package/lib/zhin-agent/turn-pipeline.js.map +1 -0
- package/lib/zhin-agent/turn-tracker.d.ts +17 -0
- package/lib/zhin-agent/turn-tracker.d.ts.map +1 -0
- package/lib/zhin-agent/turn-tracker.js +54 -0
- package/lib/zhin-agent/turn-tracker.js.map +1 -0
- package/lib/zhin-agent/web-search-locale-attach.d.ts +4 -0
- package/lib/zhin-agent/web-search-locale-attach.d.ts.map +1 -0
- package/lib/zhin-agent/web-search-locale-attach.js +19 -0
- package/lib/zhin-agent/web-search-locale-attach.js.map +1 -0
- package/lib/zhin-agent/zhin-agent-private.d.ts +66 -0
- package/lib/zhin-agent/zhin-agent-private.d.ts.map +1 -0
- package/lib/zhin-agent/zhin-agent-private.js +4 -0
- package/lib/zhin-agent/zhin-agent-private.js.map +1 -0
- package/package.json +5 -5
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* ZhinAgent 执行策略 — bash 命令的安全检查与工具包装
|
|
3
3
|
*
|
|
4
|
-
* 参考 Claude Code bashPermissions.ts 的纵深防御策略:
|
|
5
4
|
* 1. 危险命令黑名单 — 即使 full 模式也阻止解释器/提权命令
|
|
6
5
|
* 2. 环境变量前缀剥离 — `FOO=bar cmd` → 按 `cmd` 做白名单匹配
|
|
7
6
|
* 3. Safe wrapper 剥离 — `timeout 10 cmd` → 按 `cmd` 做匹配
|
|
8
7
|
* 4. 复合命令拆分 — `&&` `||` `;` 逐段独立检查,deny 优先
|
|
9
8
|
* 5. 只读命令自动放行 — 与 file-policy classifyBashCommand 集成
|
|
10
|
-
* 6. Owner 信号 —
|
|
9
|
+
* 6. Owner 信号 — execApprovalMode=ask 时返回需审批(ZHIN_NEEDS_OWNER),由编排层可硬触发 ask_user
|
|
11
10
|
*/
|
|
12
11
|
import { getPlugin } from '@zhin.js/core';
|
|
13
12
|
import { classifyBashCommand } from './file-policy.js';
|
|
14
|
-
import { getCurrentBashToolContext
|
|
15
|
-
import { isIcqqSensitiveSubcommand, matchesBashOwnerExecBypass, } from './owner-approve-always-store.js';
|
|
13
|
+
import { getCurrentBashToolContext } from './bash-tool-context.js';
|
|
14
|
+
import { isIcqqSensitiveSubcommand, matchesBashOwnerExecBypass, resolveToolRequesterRole, } from './owner-approve-always-store.js';
|
|
15
|
+
import { getAuditLogger } from './audit-logger.js';
|
|
16
16
|
// ── 预设命令白名单 ──────────────────────────────────────────────────
|
|
17
17
|
const PRESET_READONLY = ['ls', 'cat', 'pwd', 'date', 'whoami', 'grep', 'find', 'head', 'tail', 'wc', 'stat', 'file'];
|
|
18
18
|
const PRESET_NETWORK = [...PRESET_READONLY, 'curl', 'wget', 'ping', 'dig', 'nslookup', 'host'];
|
|
@@ -22,7 +22,7 @@ export const EXEC_PRESETS = {
|
|
|
22
22
|
network: PRESET_NETWORK,
|
|
23
23
|
development: PRESET_DEVELOPMENT,
|
|
24
24
|
};
|
|
25
|
-
// ──
|
|
25
|
+
// ── 危险命令黑名单──────────────
|
|
26
26
|
/**
|
|
27
27
|
* 即使在 full 模式下也会被阻止的危险命令。
|
|
28
28
|
* 这些命令可以执行任意代码、提权或造成不可逆破坏。
|
|
@@ -39,24 +39,70 @@ const DANGEROUS_COMMANDS = new Set([
|
|
|
39
39
|
// 环境注入(敏感变量可被设置)
|
|
40
40
|
'export',
|
|
41
41
|
]);
|
|
42
|
+
/**
|
|
43
|
+
* 无论审批模式如何都禁止的破坏性路径操作(避免误删依赖目录)。
|
|
44
|
+
*/
|
|
42
45
|
/**
|
|
43
46
|
* 检查命令是否在危险黑名单中。
|
|
44
47
|
*/
|
|
45
48
|
export function isDangerousCommand(cmdName) {
|
|
46
49
|
return DANGEROUS_COMMANDS.has(cmdName);
|
|
47
50
|
}
|
|
48
|
-
|
|
51
|
+
function matchHardBlockedCommand(command) {
|
|
52
|
+
const lower = command.trim().toLowerCase();
|
|
53
|
+
if (/\b(?:rm|rmdir)\b/.test(lower) && lower.includes('node_modules')) {
|
|
54
|
+
return '拒绝删除依赖目录 node_modules(高风险破坏操作)。';
|
|
55
|
+
}
|
|
56
|
+
if (lower.includes('find') && lower.includes('node_modules') && lower.includes('-delete')) {
|
|
57
|
+
return '拒绝通过 find -delete 删除 node_modules(高风险破坏操作)。';
|
|
58
|
+
}
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
// ── 环境变量前缀剥离──────────────
|
|
49
62
|
/**
|
|
50
63
|
* 剥离命令前面的 `KEY=value` 环境变量前缀。
|
|
51
64
|
* 例如 `FOO=bar BAZ=1 curl http://...` → `curl http://...`
|
|
52
65
|
*
|
|
53
66
|
* 只剥离安全的 key=value 对,不剥离含特殊字符的值(可能是注入)。
|
|
54
67
|
*/
|
|
68
|
+
function tryStripOneEnvAssignment(command) {
|
|
69
|
+
const trimmed = command.trimStart();
|
|
70
|
+
const keyMatch = trimmed.match(/^([A-Za-z_][A-Za-z0-9_]*)=/);
|
|
71
|
+
if (!keyMatch)
|
|
72
|
+
return { rest: command, stripped: false };
|
|
73
|
+
let i = keyMatch[0].length;
|
|
74
|
+
const ch = trimmed[i];
|
|
75
|
+
if (ch === "'") {
|
|
76
|
+
const end = trimmed.indexOf("'", i + 1);
|
|
77
|
+
if (end === -1)
|
|
78
|
+
return { rest: command, stripped: false };
|
|
79
|
+
i = end + 1;
|
|
80
|
+
}
|
|
81
|
+
else if (ch === '"') {
|
|
82
|
+
const end = trimmed.indexOf('"', i + 1);
|
|
83
|
+
if (end === -1)
|
|
84
|
+
return { rest: command, stripped: false };
|
|
85
|
+
i = end + 1;
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
while (i < trimmed.length && !/[\s;|&]/.test(trimmed[i]))
|
|
89
|
+
i++;
|
|
90
|
+
}
|
|
91
|
+
while (i < trimmed.length && /\s/.test(trimmed[i]))
|
|
92
|
+
i++;
|
|
93
|
+
return { rest: trimmed.slice(i), stripped: true };
|
|
94
|
+
}
|
|
55
95
|
export function stripEnvVarPrefix(command) {
|
|
56
|
-
|
|
57
|
-
|
|
96
|
+
let rest = command;
|
|
97
|
+
for (let n = 0; n < 32; n++) {
|
|
98
|
+
const next = tryStripOneEnvAssignment(rest);
|
|
99
|
+
if (!next.stripped)
|
|
100
|
+
break;
|
|
101
|
+
rest = next.rest;
|
|
102
|
+
}
|
|
103
|
+
return rest.trim();
|
|
58
104
|
}
|
|
59
|
-
// ── Safe wrapper
|
|
105
|
+
// ── Safe wrapper 剥离──────────────
|
|
60
106
|
/**
|
|
61
107
|
* Safe wrapper 命令列表 — 这些命令本身是安全的"包装器",
|
|
62
108
|
* 真正需要检查的是它们后面的实际命令。
|
|
@@ -92,7 +138,7 @@ export function stripSafeWrappers(command) {
|
|
|
92
138
|
}
|
|
93
139
|
return remaining;
|
|
94
140
|
}
|
|
95
|
-
// ──
|
|
141
|
+
// ── 复合命令拆分──────────────
|
|
96
142
|
/**
|
|
97
143
|
* 将复合命令按 `&&`, `||`, `;` 拆分为独立子命令。
|
|
98
144
|
* 管道 `|` 不拆分 — 管道中的只读性由 classifyBashCommand 判断。
|
|
@@ -100,8 +146,32 @@ export function stripSafeWrappers(command) {
|
|
|
100
146
|
* 注意:不处理 subshell `$(...)` 和反引号 — 这些场景由危险黑名单覆盖。
|
|
101
147
|
*/
|
|
102
148
|
export function splitCompoundCommand(command) {
|
|
103
|
-
|
|
104
|
-
|
|
149
|
+
const parts = [];
|
|
150
|
+
let current = '';
|
|
151
|
+
let i = 0;
|
|
152
|
+
while (i < command.length) {
|
|
153
|
+
if (command.startsWith('&&', i) || command.startsWith('||', i) || command[i] === ';') {
|
|
154
|
+
const trimmed = current.trim();
|
|
155
|
+
if (trimmed)
|
|
156
|
+
parts.push(trimmed);
|
|
157
|
+
current = '';
|
|
158
|
+
if (command.startsWith('&&', i))
|
|
159
|
+
i += 2;
|
|
160
|
+
else if (command.startsWith('||', i))
|
|
161
|
+
i += 2;
|
|
162
|
+
else
|
|
163
|
+
i += 1;
|
|
164
|
+
while (i < command.length && /\s/.test(command[i]))
|
|
165
|
+
i++;
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
current += command[i];
|
|
169
|
+
i++;
|
|
170
|
+
}
|
|
171
|
+
const tail = current.trim();
|
|
172
|
+
if (tail)
|
|
173
|
+
parts.push(tail);
|
|
174
|
+
return parts;
|
|
105
175
|
}
|
|
106
176
|
/**
|
|
107
177
|
* 从命令字符串中提取实际的可执行程序名。
|
|
@@ -113,6 +183,24 @@ export function extractCommandName(command) {
|
|
|
113
183
|
const name = stripped.split(/[\s|]/)[0] || '';
|
|
114
184
|
return name;
|
|
115
185
|
}
|
|
186
|
+
/**
|
|
187
|
+
* 解析有效审批模式。
|
|
188
|
+
*/
|
|
189
|
+
export function resolveExecApprovalMode(config) {
|
|
190
|
+
return config.execApprovalMode;
|
|
191
|
+
}
|
|
192
|
+
function resolveRequesterRole() {
|
|
193
|
+
const ctx = getCurrentBashToolContext();
|
|
194
|
+
if (!ctx?.platform || !ctx?.botId || !ctx?.senderId)
|
|
195
|
+
return 'unknown';
|
|
196
|
+
try {
|
|
197
|
+
const plugin = getPlugin().root ?? getPlugin();
|
|
198
|
+
return resolveToolRequesterRole(plugin, ctx);
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
return 'unknown';
|
|
202
|
+
}
|
|
203
|
+
}
|
|
116
204
|
// ── 核心检查函数 ────────────────────────────────────────────────────
|
|
117
205
|
/**
|
|
118
206
|
* Resolves the effective allowlist by merging preset commands with custom allowlist.
|
|
@@ -140,7 +228,11 @@ function tryExecBypassForSensitiveIcqq(normalizedSubCommand) {
|
|
|
140
228
|
* 检查单条子命令是否允许执行。
|
|
141
229
|
* 内部函数 — 不做复合命令拆分。
|
|
142
230
|
*/
|
|
143
|
-
function checkSingleCommand(cmdName, fullSubCommand, allowlist, security,
|
|
231
|
+
function checkSingleCommand(cmdName, fullSubCommand, allowlist, security, approvalMode, requesterRole) {
|
|
232
|
+
const hardBlockedReason = matchHardBlockedCommand(fullSubCommand);
|
|
233
|
+
if (hardBlockedReason) {
|
|
234
|
+
return { allowed: false, reason: hardBlockedReason };
|
|
235
|
+
}
|
|
144
236
|
// 1. 危险黑名单 — 任何模式都拒绝
|
|
145
237
|
if (isDangerousCommand(cmdName)) {
|
|
146
238
|
return { allowed: false, reason: `拒绝执行危险命令「${cmdName}」— 该命令可提权或执行任意代码。` };
|
|
@@ -163,7 +255,26 @@ function checkSingleCommand(cmdName, fullSubCommand, allowlist, security, execAs
|
|
|
163
255
|
if (tryExecBypassForSensitiveIcqq(norm)) {
|
|
164
256
|
return { allowed: true };
|
|
165
257
|
}
|
|
166
|
-
if (
|
|
258
|
+
if (requesterRole === 'owner') {
|
|
259
|
+
return { allowed: true };
|
|
260
|
+
}
|
|
261
|
+
if (requesterRole === 'admin') {
|
|
262
|
+
return {
|
|
263
|
+
allowed: false,
|
|
264
|
+
needsApproval: true,
|
|
265
|
+
reason: `icqq 敏感操作不在 execAllowlist,需 Owner 确认:${norm.slice(0, 280)}`,
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
if (requesterRole === 'other') {
|
|
269
|
+
return {
|
|
270
|
+
allowed: false,
|
|
271
|
+
reason: `icqq 敏感操作仅允许 owner 直接执行;admin 需 Owner 审批:${norm.slice(0, 280)}`,
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
if (approvalMode === 'allow') {
|
|
275
|
+
return { allowed: true };
|
|
276
|
+
}
|
|
277
|
+
if (approvalMode === 'ask') {
|
|
167
278
|
return {
|
|
168
279
|
allowed: false,
|
|
169
280
|
needsApproval: true,
|
|
@@ -172,7 +283,7 @@ function checkSingleCommand(cmdName, fullSubCommand, allowlist, security, execAs
|
|
|
172
283
|
}
|
|
173
284
|
return {
|
|
174
285
|
allowed: false,
|
|
175
|
-
reason: `icqq
|
|
286
|
+
reason: `icqq 敏感操作已被拒绝(execApprovalMode=deny):${norm.slice(0, 280)}`,
|
|
176
287
|
};
|
|
177
288
|
}
|
|
178
289
|
// 4. 白名单匹配
|
|
@@ -188,8 +299,27 @@ function checkSingleCommand(cmdName, fullSubCommand, allowlist, security, execAs
|
|
|
188
299
|
if (allowed) {
|
|
189
300
|
return { allowed: true };
|
|
190
301
|
}
|
|
302
|
+
if (requesterRole === 'owner') {
|
|
303
|
+
return { allowed: true };
|
|
304
|
+
}
|
|
305
|
+
if (requesterRole === 'admin') {
|
|
306
|
+
return {
|
|
307
|
+
allowed: false,
|
|
308
|
+
needsApproval: true,
|
|
309
|
+
reason: `命令「${cmdName}」不在 execAllowlist,需 Owner 确认后执行。`,
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
if (requesterRole === 'other') {
|
|
313
|
+
return {
|
|
314
|
+
allowed: false,
|
|
315
|
+
reason: `命令「${cmdName}」不在 execAllowlist,且发起者不是 owner/admin,已拒绝。`,
|
|
316
|
+
};
|
|
317
|
+
}
|
|
191
318
|
// 5. 需审批或拒绝
|
|
192
|
-
if (
|
|
319
|
+
if (approvalMode === 'allow') {
|
|
320
|
+
return { allowed: true };
|
|
321
|
+
}
|
|
322
|
+
if (approvalMode === 'ask') {
|
|
193
323
|
return {
|
|
194
324
|
allowed: false,
|
|
195
325
|
needsApproval: true,
|
|
@@ -210,10 +340,20 @@ function checkSingleCommand(cmdName, fullSubCommand, allowlist, security, execAs
|
|
|
210
340
|
export function checkExecPolicy(config, command) {
|
|
211
341
|
const security = config.execSecurity ?? 'deny';
|
|
212
342
|
if (security === 'deny') {
|
|
213
|
-
|
|
343
|
+
const result = { allowed: false, reason: '当前配置禁止执行 Shell 命令(execSecurity=deny)。如需开放请在配置中设置 ai.agent.execSecurity。' };
|
|
344
|
+
// 记录审计日志
|
|
345
|
+
try {
|
|
346
|
+
const auditLogger = getAuditLogger();
|
|
347
|
+
auditLogger.logExecPolicy(command, false, result.reason);
|
|
348
|
+
}
|
|
349
|
+
catch {
|
|
350
|
+
// 忽略审计日志错误
|
|
351
|
+
}
|
|
352
|
+
return result;
|
|
214
353
|
}
|
|
215
354
|
const allowlist = resolveExecAllowlist(config);
|
|
216
|
-
const
|
|
355
|
+
const approvalMode = resolveExecApprovalMode(config);
|
|
356
|
+
const requesterRole = resolveRequesterRole();
|
|
217
357
|
const cmd = (command || '').trim();
|
|
218
358
|
if (!cmd) {
|
|
219
359
|
return { allowed: false, reason: '命令为空' };
|
|
@@ -225,9 +365,17 @@ export function checkExecPolicy(config, command) {
|
|
|
225
365
|
const cmdName = extractCommandName(sub);
|
|
226
366
|
if (!cmdName)
|
|
227
367
|
continue;
|
|
228
|
-
const result = checkSingleCommand(cmdName, sub, allowlist, security,
|
|
368
|
+
const result = checkSingleCommand(cmdName, sub, allowlist, security, approvalMode, requesterRole);
|
|
229
369
|
// deny 立即返回(deny > ask 优先级)
|
|
230
370
|
if (!result.allowed && !result.needsApproval) {
|
|
371
|
+
// 记录审计日志
|
|
372
|
+
try {
|
|
373
|
+
const auditLogger = getAuditLogger();
|
|
374
|
+
auditLogger.logExecPolicy(sub, false, result.reason);
|
|
375
|
+
}
|
|
376
|
+
catch {
|
|
377
|
+
// 忽略审计日志错误
|
|
378
|
+
}
|
|
231
379
|
return result;
|
|
232
380
|
}
|
|
233
381
|
// 记录第一个需要审批的
|
|
@@ -237,15 +385,41 @@ export function checkExecPolicy(config, command) {
|
|
|
237
385
|
}
|
|
238
386
|
// 有需要审批的段
|
|
239
387
|
if (pendingApproval) {
|
|
388
|
+
// 记录审计日志
|
|
389
|
+
try {
|
|
390
|
+
const auditLogger = getAuditLogger();
|
|
391
|
+
auditLogger.logExecPolicy(cmd, false, pendingApproval.reason);
|
|
392
|
+
}
|
|
393
|
+
catch {
|
|
394
|
+
// 忽略审计日志错误
|
|
395
|
+
}
|
|
240
396
|
return pendingApproval;
|
|
241
397
|
}
|
|
398
|
+
// 记录成功的审计日志
|
|
399
|
+
try {
|
|
400
|
+
const auditLogger = getAuditLogger();
|
|
401
|
+
auditLogger.logExecPolicy(cmd, true);
|
|
402
|
+
}
|
|
403
|
+
catch {
|
|
404
|
+
// 忽略审计日志错误
|
|
405
|
+
}
|
|
242
406
|
return { allowed: true };
|
|
243
407
|
}
|
|
408
|
+
export function checkExecPolicyWithOptions(config, command, options = {}) {
|
|
409
|
+
if (!options.approvalMode) {
|
|
410
|
+
return checkExecPolicy(config, command);
|
|
411
|
+
}
|
|
412
|
+
const shadowConfig = {
|
|
413
|
+
...config,
|
|
414
|
+
execApprovalMode: options.approvalMode,
|
|
415
|
+
};
|
|
416
|
+
return checkExecPolicy(shadowConfig, command);
|
|
417
|
+
}
|
|
244
418
|
/**
|
|
245
419
|
* Wrap `bash` tools with exec policy enforcement.
|
|
246
|
-
* 当
|
|
420
|
+
* 当 execApprovalMode=ask 且命令需审批时,返回提示信息而非抛错。
|
|
247
421
|
*/
|
|
248
|
-
export function applyExecPolicyToTools(config, tools) {
|
|
422
|
+
export function applyExecPolicyToTools(config, tools, options = {}) {
|
|
249
423
|
return tools.map(t => {
|
|
250
424
|
if (t.name !== 'bash')
|
|
251
425
|
return t;
|
|
@@ -254,12 +428,11 @@ export function applyExecPolicyToTools(config, tools) {
|
|
|
254
428
|
...t,
|
|
255
429
|
execute: async (args) => {
|
|
256
430
|
const cmd = args?.command != null ? String(args.command) : '';
|
|
257
|
-
const result =
|
|
431
|
+
const result = checkExecPolicyWithOptions(config, cmd, {
|
|
432
|
+
approvalMode: options.approvalMode,
|
|
433
|
+
});
|
|
258
434
|
if (!result.allowed) {
|
|
259
435
|
if (result.needsApproval) {
|
|
260
|
-
if (isDirectAgentExecution()) {
|
|
261
|
-
return original(args);
|
|
262
|
-
}
|
|
263
436
|
// 权威首行 + 正文:硬编排识别;与旧「请使用 ask_user」话术合并为单套
|
|
264
437
|
return `ZHIN_NEEDS_OWNER:\n⚠️ ${result.reason}\n\n此 shell 命令需 Bot Owner 审批后方可执行。`;
|
|
265
438
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exec-policy.js","sourceRoot":"","sources":["../../src/security/exec-policy.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"exec-policy.js","sourceRoot":"","sources":["../../src/security/exec-policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -56,7 +56,6 @@ export interface BashCommandClassification {
|
|
|
56
56
|
* 对管道命令(如 `cat file | grep pattern`),所有非中性部分
|
|
57
57
|
* 都必须是搜索/读/列出类,整条命令才算只读。
|
|
58
58
|
*
|
|
59
|
-
* 参考 Claude Code BashTool `isSearchOrReadBashCommand`。
|
|
60
59
|
*/
|
|
61
60
|
export declare function classifyBashCommand(command: string): BashCommandClassification;
|
|
62
61
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-policy.d.ts","sourceRoot":"","sources":["../../src/security/file-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"file-policy.d.ts","sourceRoot":"","sources":["../../src/security/file-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA+BH;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAQ7D;AAID,gCAAgC;AAChC,eAAO,MAAM,kBAAkB,QAAoB,CAAC;AACpD,qCAAqC;AACrC,eAAO,MAAM,kBAAkB,QAAqB,CAAC;AA2ErD,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAiBD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,qBAAqB,CAoFvE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAKvD;AA8DD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAoB1F;AAyBD,MAAM,WAAW,yBAAyB;IACxC,cAAc;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,4BAA4B;IAC5B,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,yBAAyB,CAqC9E;AAID;;GAEG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAIpE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAG7E;AAID;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C"}
|
|
@@ -12,7 +12,8 @@
|
|
|
12
12
|
*/
|
|
13
13
|
import * as path from 'node:path';
|
|
14
14
|
import * as os from 'node:os';
|
|
15
|
-
|
|
15
|
+
import { getAuditLogger } from './audit-logger.js';
|
|
16
|
+
// ── 设备路径阻止──────────────
|
|
16
17
|
/**
|
|
17
18
|
* 会导致进程挂起的设备文件路径。
|
|
18
19
|
* 检查纯路径即可(无 I/O),安全设备如 /dev/null 不在此列。
|
|
@@ -47,7 +48,7 @@ export function isBlockedDevicePath(filePath) {
|
|
|
47
48
|
return true;
|
|
48
49
|
return false;
|
|
49
50
|
}
|
|
50
|
-
// ──
|
|
51
|
+
// ── 文件大小限制──────────────
|
|
51
52
|
/** 读取文件最大字节数(256 MiB),防止 OOM */
|
|
52
53
|
export const MAX_READ_FILE_SIZE = 256 * 1024 * 1024;
|
|
53
54
|
/** 编辑文件最大字节数(1 GiB),防止 V8 字符串长度溢出 */
|
|
@@ -143,29 +144,73 @@ export function checkFileAccess(filePath) {
|
|
|
143
144
|
// 1. 检查敏感路径前缀
|
|
144
145
|
for (const prefix of SENSITIVE_PATH_PREFIXES) {
|
|
145
146
|
if (normalizedCandidates.some(candidate => candidate.startsWith(prefix))) {
|
|
146
|
-
|
|
147
|
+
const result = { allowed: false, reason: `拒绝访问系统敏感文件: ${prefix}` };
|
|
148
|
+
// 记录审计日志
|
|
149
|
+
try {
|
|
150
|
+
const auditLogger = getAuditLogger();
|
|
151
|
+
auditLogger.logFileAccess(filePath, false, result.reason);
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
// 忽略审计日志错误
|
|
155
|
+
}
|
|
156
|
+
return result;
|
|
147
157
|
}
|
|
148
158
|
}
|
|
149
159
|
// 2. 检查敏感目录
|
|
150
160
|
const parts = normalizePathSeparators(resolved).split('/');
|
|
151
161
|
for (let i = 0; i < parts.length; i++) {
|
|
152
162
|
if (SENSITIVE_DIR_NAMES.has(parts[i])) {
|
|
153
|
-
|
|
163
|
+
const result = { allowed: false, reason: `拒绝访问敏感目录: ${parts[i]}` };
|
|
164
|
+
// 记录审计日志
|
|
165
|
+
try {
|
|
166
|
+
const auditLogger = getAuditLogger();
|
|
167
|
+
auditLogger.logFileAccess(filePath, false, result.reason);
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
// 忽略审计日志错误
|
|
171
|
+
}
|
|
172
|
+
return result;
|
|
154
173
|
}
|
|
155
174
|
// 对多级目录名做拼接检查(如 .config/gcloud)
|
|
156
175
|
if (i > 0) {
|
|
157
176
|
const twoLevel = `${parts[i - 1]}/${parts[i]}`;
|
|
158
177
|
if (SENSITIVE_DIR_NAMES.has(twoLevel)) {
|
|
159
|
-
|
|
178
|
+
const result = { allowed: false, reason: `拒绝访问敏感目录: ${twoLevel}` };
|
|
179
|
+
// 记录审计日志
|
|
180
|
+
try {
|
|
181
|
+
const auditLogger = getAuditLogger();
|
|
182
|
+
auditLogger.logFileAccess(filePath, false, result.reason);
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
// 忽略审计日志错误
|
|
186
|
+
}
|
|
187
|
+
return result;
|
|
160
188
|
}
|
|
161
189
|
}
|
|
162
190
|
}
|
|
163
191
|
// 3. 检查敏感文件名
|
|
164
192
|
for (const pattern of SENSITIVE_BASENAME_PATTERNS) {
|
|
165
193
|
if (pattern.test(basename)) {
|
|
166
|
-
|
|
194
|
+
const result = { allowed: false, reason: `拒绝访问敏感文件: ${basename} 可能包含密钥或凭据` };
|
|
195
|
+
// 记录审计日志
|
|
196
|
+
try {
|
|
197
|
+
const auditLogger = getAuditLogger();
|
|
198
|
+
auditLogger.logFileAccess(filePath, false, result.reason);
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
// 忽略审计日志错误
|
|
202
|
+
}
|
|
203
|
+
return result;
|
|
167
204
|
}
|
|
168
205
|
}
|
|
206
|
+
// 记录成功的审计日志
|
|
207
|
+
try {
|
|
208
|
+
const auditLogger = getAuditLogger();
|
|
209
|
+
auditLogger.logFileAccess(filePath, true);
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
// 忽略审计日志错误
|
|
213
|
+
}
|
|
169
214
|
return { allowed: true };
|
|
170
215
|
}
|
|
171
216
|
/**
|
|
@@ -185,7 +230,62 @@ export function assertFileAccess(filePath) {
|
|
|
185
230
|
*/
|
|
186
231
|
const ENV_DUMP_COMMANDS = /^\s*(env|printenv|export|set)\b/;
|
|
187
232
|
const ENV_ECHO_PATTERN = /\$\{?\w*(KEY|SECRET|TOKEN|PASSWORD|PASS|CREDENTIAL|AUTH|APIKEY|API_KEY)\w*\}?/i;
|
|
188
|
-
|
|
233
|
+
function splitPipeSegments(command) {
|
|
234
|
+
const parts = [];
|
|
235
|
+
let current = '';
|
|
236
|
+
for (let i = 0; i < command.length; i++) {
|
|
237
|
+
if (command[i] === '|' && command[i + 1] !== '|') {
|
|
238
|
+
const seg = current.trim();
|
|
239
|
+
if (seg)
|
|
240
|
+
parts.push(seg);
|
|
241
|
+
current = '';
|
|
242
|
+
continue;
|
|
243
|
+
}
|
|
244
|
+
current += command[i];
|
|
245
|
+
}
|
|
246
|
+
const tail = current.trim();
|
|
247
|
+
if (tail)
|
|
248
|
+
parts.push(tail);
|
|
249
|
+
return parts;
|
|
250
|
+
}
|
|
251
|
+
function isCatSensitiveFile(command) {
|
|
252
|
+
const lower = command.toLowerCase();
|
|
253
|
+
if (!/\bcat\b/.test(lower))
|
|
254
|
+
return false;
|
|
255
|
+
return (lower.includes('.env') ||
|
|
256
|
+
lower.includes('.pem') ||
|
|
257
|
+
lower.includes('.key') ||
|
|
258
|
+
lower.includes('.p12') ||
|
|
259
|
+
lower.includes('.pfx'));
|
|
260
|
+
}
|
|
261
|
+
function splitShellOperatorParts(command) {
|
|
262
|
+
const parts = [];
|
|
263
|
+
let current = '';
|
|
264
|
+
let i = 0;
|
|
265
|
+
while (i < command.length) {
|
|
266
|
+
if (command.startsWith('&&', i) || command.startsWith('||', i) || command[i] === ';' || command[i] === '|') {
|
|
267
|
+
const trimmed = current.trim();
|
|
268
|
+
if (trimmed)
|
|
269
|
+
parts.push(trimmed);
|
|
270
|
+
current = '';
|
|
271
|
+
if (command.startsWith('&&', i))
|
|
272
|
+
i += 2;
|
|
273
|
+
else if (command.startsWith('||', i))
|
|
274
|
+
i += 2;
|
|
275
|
+
else
|
|
276
|
+
i += 1;
|
|
277
|
+
while (i < command.length && /\s/.test(command[i]))
|
|
278
|
+
i++;
|
|
279
|
+
continue;
|
|
280
|
+
}
|
|
281
|
+
current += command[i];
|
|
282
|
+
i++;
|
|
283
|
+
}
|
|
284
|
+
const tail = current.trim();
|
|
285
|
+
if (tail)
|
|
286
|
+
parts.push(tail);
|
|
287
|
+
return parts;
|
|
288
|
+
}
|
|
189
289
|
/**
|
|
190
290
|
* 检查 bash 命令是否可能泄漏敏感环境变量或文件。
|
|
191
291
|
* 返回 { safe: true } 或 { safe: false, reason: string }。
|
|
@@ -193,7 +293,7 @@ const ENV_CAT_SENSITIVE = /\bcat\b.*\.(env|pem|key|p12|pfx)\b/i;
|
|
|
193
293
|
export function checkBashCommandSafety(command) {
|
|
194
294
|
const trimmed = command.trim();
|
|
195
295
|
// 拆管道,检查每段
|
|
196
|
-
const segments = trimmed
|
|
296
|
+
const segments = splitPipeSegments(trimmed);
|
|
197
297
|
for (const seg of segments) {
|
|
198
298
|
if (ENV_DUMP_COMMANDS.test(seg)) {
|
|
199
299
|
return { safe: false, reason: '禁止执行环境变量导出命令(env/printenv/export/set),可能泄漏密钥' };
|
|
@@ -202,12 +302,12 @@ export function checkBashCommandSafety(command) {
|
|
|
202
302
|
if (ENV_ECHO_PATTERN.test(trimmed)) {
|
|
203
303
|
return { safe: false, reason: '禁止通过 echo/printf 输出含密钥名的环境变量' };
|
|
204
304
|
}
|
|
205
|
-
if (
|
|
305
|
+
if (isCatSensitiveFile(trimmed)) {
|
|
206
306
|
return { safe: false, reason: '禁止通过 cat 读取敏感文件(.env/.pem/.key)' };
|
|
207
307
|
}
|
|
208
308
|
return { safe: true };
|
|
209
309
|
}
|
|
210
|
-
// ── bash
|
|
310
|
+
// ── bash 命令读写分类──────────────
|
|
211
311
|
/** 搜索类命令 */
|
|
212
312
|
const BASH_SEARCH_COMMANDS = new Set([
|
|
213
313
|
'find', 'grep', 'rg', 'ag', 'ack', 'locate', 'which', 'whereis',
|
|
@@ -231,12 +331,10 @@ const BASH_NEUTRAL_COMMANDS = new Set([
|
|
|
231
331
|
* 对管道命令(如 `cat file | grep pattern`),所有非中性部分
|
|
232
332
|
* 都必须是搜索/读/列出类,整条命令才算只读。
|
|
233
333
|
*
|
|
234
|
-
* 参考 Claude Code BashTool `isSearchOrReadBashCommand`。
|
|
235
334
|
*/
|
|
236
335
|
export function classifyBashCommand(command) {
|
|
237
336
|
const trimmed = command.trim();
|
|
238
|
-
|
|
239
|
-
const parts = trimmed.split(/\s*(?:\|\||&&|\||;)\s*/);
|
|
337
|
+
const parts = splitShellOperatorParts(trimmed);
|
|
240
338
|
let hasSearch = false;
|
|
241
339
|
let hasRead = false;
|
|
242
340
|
let hasList = false;
|
|
@@ -271,7 +369,7 @@ export function classifyBashCommand(command) {
|
|
|
271
369
|
isReadOnly: hasSearch || hasRead || hasList,
|
|
272
370
|
};
|
|
273
371
|
}
|
|
274
|
-
// ── 文件 mtime
|
|
372
|
+
// ── 文件 mtime 比对──────────────
|
|
275
373
|
/**
|
|
276
374
|
* 文件修改时间快照,用于检测编辑前是否被并发修改。
|
|
277
375
|
*/
|