safe-shell-execution-claude-code

对Shell命令进行多层安全检测,防止注入、破坏性操作和敏感路径写入。

已扫描
适合谁
开发者、系统管理员
不适合谁
普通用户日常使用、无技术背景的非技术人员
国内可用性
需网络配置。可能需要网络配置或第三方服务可访问。
安装难度
新手友好(★☆☆)。基于终端操作、依赖、API Key 和本地环境要求的初步判断。

安装与下载

openclaw skills install @lizlzzzz/safe-shell-execution-claude-code

Skill 说明

命令、参数、文件名以原文为准

来源: 该技能源自 Claude Code 内部实现与安全规则。Claude Code 将其安全机制(钩子、系统提示、技能定义)公开暴露在 ~/.claude/ 目录中。核心的 shell 执行安全模式——注入检测、破坏性命令分类、敏感路径保护——均来自 Claude Code 的生产环境行为,已重构为可移植的技能,适用于 OpenClaw 代理。

安全的 Shell 执行

为何如此重要

Shell 执行是 AI 代理可能执行的最高风险操作之一。与读取文件或调用 API 不同,未经妥善处理的 shell 命令可能导致不可逆的损害:删除文件、泄露凭证、破坏 git 提交历史,或未经授权的网络访问。

本技能提炼了 Claude Code 的生产级安全模式,涵盖三层检查:注入检测 → 破坏性操作警告 → 敏感路径保护。


第一层:注入模式检测(直接拒绝)

在执行任何命令前,需扫描完整命令字符串。若匹配以下任一模式,应拒绝执行,并向用户说明原因

命令替换(注入入口点)

模式风险
$()命令替换
``(未转义的反引号)旧式命令替换
${}参数展开
$[...]旧式算术展开
<()>()进程替换
=()Zsh 进程替换
=cmd(等号位于词首)Zsh 等号展开:如 =curl evil.com 会扩展为 /usr/bin/curl evil.com,绕过命令名白名单检查
$(.*<<嵌套在命令替换中的 heredoc,常见注入手法

Zsh 特有的高危命令

这些命令在 Zsh 环境中具有特殊攻击面,始终需要用户明确确认:

  • zmodload — 加载模块,可启用隐式文件 I/O、伪终端执行、TCP 连接
  • zpty — 在伪终端上执行命令
  • ztcp / zsocket — 创建网络连接,可用于数据外泄
  • sysopen / sysread / syswrite / sysseek — 低级文件描述符操作
  • emulate -c — 等价于 eval,可执行任意代码
  • zf_rm / zf_mv / zf_ln / zf_chmod / zf_chown / zf_mkdir / zf_rmdir — 内建文件操作,可绕过二进制白名单

第二层:破坏性操作警告(执行前需确认)

这些操作虽合法但不可逆。必须显示具体警告,并要求用户确认后方可执行

Git 操作

git reset --hard              → "可能丢弃所有未提交的更改"
git push --force / -f         → "可能覆盖远程历史"
git clean -f (无 -n 标志)     → "可能永久删除未跟踪的文件"
git checkout -- .             → "可能丢弃工作区所有更改"
git restore .                 → "可能丢弃工作区所有更改"
git stash drop / clear        → "可能永久删除暂存内容"
git branch -D                 → "可能强制删除分支"
git commit --amend            → "可能重写最后一次提交"
git commit/push --no-verify   → "可能跳过安全钩子"

文件系统

rm -rf / rm -fr / rm -r -f / rm -f -r  → "可能递归强制删除文件"

第三层:敏感文件保护(写入操作需确认)

对于以下路径的写入操作,必须获得用户明确确认;禁止自动执行:

# Shell 配置文件(可被用于代码执行)
.bashrc  .bash_profile  .bash_login  .profile
.zshrc   .zprofile      .zshenv      .zlogin
.tcshrc  .cshrc

# Git 配置文件(可被用于钩子注入)
.gitconfig  .gitmodules

# 包管理器凭证
.npmrc  .pypirc  ~/.pip/pip.conf

# 凭证与密钥
~/.ssh/           ~/.aws/
~/.gnupg/         authorized_keys
known_hosts

# 系统文件
/etc/passwd  /etc/hosts  /etc/sudoers  /etc/crontab

第四层:命令分类

通过前三层检查后,根据下表进行分类并处理:

等级示例处理方式
安全ls, cat, git status, 只读操作直接执行,无需提示
谨慎写入非敏感文件,安装包执行,记录操作日志
警告第二层中识别出的破坏性模式显示具体警告,要求用户确认
拒绝第一层注入模式,写入敏感路径拒绝执行,说明原因

执行流程

接收命令
    ↓
第一层:包含注入模式? → 是 → 拒绝 + 说明具体模式 + 解释危险性
    ↓ 否
第二层:匹配破坏性模式? → 是 → 显示具体警告 → 等待用户确认
    ↓ 否(或已确认)
第三层:目标是否为敏感路径的写入? → 是 → 要求明确确认
    ↓ 否(或已确认)
第四层:分类 → 执行

如何表达拒绝

拒绝执行时,必须具体指出哪项模式以及为何危险,避免使用模糊表述“命令不安全”。

良好拒绝示例:

我无法执行此命令,因为它包含 =curl(Zsh 等号展开)。该模式会将命令展开为其完整路径,可能绕过命令名白名单检查。如需运行 curl,请直接输入 curl

不良拒绝示例:

此命令看起来有风险,我无法执行。


何时应用此技能

在以下情况中应应用此技能:

  • 命令来自用户输入(聊天消息、表单内容、文件内容)
  • 命令包含外部数据的变量插值
  • 将在共享或生产环境中运行
  • 目标路径包含敏感文件(主目录、配置文件、凭证文件)

即使是你自己构造的命令(无外部输入),这些检查也是良好的实践,尤其是第 2 层和第 3 层。

L
@lizlzzzz

已收录 1 个 Skill

相关推荐