DSH Quality

安装脚本与运行时脚本:扫描到底覆盖了什么

一个插件可能在两个完全不同的时点出问题,而多数扫描只覆盖其中一个。install script scanning 读的是什么,为什么 runtime script risk 落在它的范围之外,以及剩下的部分怎么自己补上。

一个插件可能在两个完全不同的时点出问题,而多数扫描只覆盖其中一个。install script scanning 读的是插件声明"安装时要跑什么":preinstall、install、postinstall 这几个钩子,以及这些钩子从网上拉下来的东西。postinstall script scanning 正因为如此才覆盖得最充分,而 runtime script risk 是另一半,也就是那段不是装的时候跑一次、而是每次调用插件都会执行的代码。搞清楚 install vs runtime scripts 在哪里分岔,才能判断一次干净的扫描结果到底值多少。下面讲的是 what plugin scanners check、这份覆盖在哪里止步,以及三个可以自己在本机上补上的检查。

install script scanning 覆盖了什么

扫描器读取清单文件和插件声明的安装钩子,再拿这些钩子去比对此前出过事的那些模式。主要看四样东西。

  • 清单里声明的 preinstall、install 和 postinstall 脚本。它们是在安装期间以你的权限运行的,这也是 postinstall script scanning 最受关注的原因。
  • 这些钩子发出的网络请求。安装时去拉一个第二阶段的可执行文件,正是多数告警所围绕的那个模式。
  • 插件目录之外的文件写入。凡是碰到你的家目录、shell 配置文件或编辑器配置的,都会被标记。
  • 打包声明。没有附带打包声明的插件更难审计,所以它的处理方式是扣分,而不是悄悄放行。

这些检查背后的机制写在 /blog/how-install-script-scanning-works,会触发告警的具体模式列在 /blog/dangerous-install-script-explained。

runtime script risk:一直在跑的那半边

上面那些都只发生一次。一个在安装时表现得很规矩的插件,完全可能在每次调用时做别的事;而那段代码就是普通的插件源码,扫描器本身没有理由单独把它当成危险项。

  • 每次运行时从环境变量或配置文件里读凭据。
  • 正常使用过程中的对外请求。不读代码的话,它和正常的遥测上报长得一模一样。
  • 事后写进项目目录的文件,而不是安装时写的。
  • 由输入拼出来的 shell 命令,风险取决于输入本身,而不是那段脚本。

这就是缺口所在。安装期的行为是声明式的、结构化的,容易检查;运行期的行为只是代码在干代码该干的事,要看懂它是人的活。

安装脚本运行时脚本
运行时机安装时一次每次调用
存放位置清单钩子插件源码
谁来检查静态 install script scanning很少,且主要靠人工评审
权限你的用户账号你的用户账号加上你的凭据
典型失效方式从网络拉第二阶段载荷长期缓慢地泄露或篡改
是否体现在扫描结果里是通常不

install vs runtime scripts:边界到底在哪

边界不在文件上,而在代码运行的那个时点;同一个插件可以把同一个动作放在边界的任意一侧。

  • 安装时下载一个辅助程序的插件,做的是安装期动作,也就在安装期被评判。
  • 同一个插件每次运行时检查更新,做的是运行期动作,而这条路径很少被扫描。
  • 往你的 shell 配置里写内容的钩子是安装期的;每次会话读取这份配置的插件是运行期的。
  • 多数插件两边都有,这也正是一次干净的安装扫描能告诉你的比看上去要少的原因。
一次干净的安装扫描,说明的是安装过程是诚实的;它不说明这个插件跑起来之后依然诚实。

运行期那半边,自己怎么补

你不需要逐行审源码。三个检查能覆盖大部分要紧的地方,而且它们的成本可控,因为你只需要对那些已经通过安装扫描的插件跑一遍。

值得花一个下午的三个检查

  • 读一遍网络调用。在插件源码里搜对外请求,看它们发到哪。正常的遥测会写明端点,说不清来源的就值得问一句。
  • 看它从环境里读了什么。按名字去取 token 或密钥的插件,应该在 README 里说明。一份好文档长什么样,写在 /blog/how-to-evaluate-plugin-documentation-quality。
  • 盯住第一周。新插件先装在你能察觉到异常写入的机器上,而不是一次铺开。CI 那一侧的做法在 /blog/ci-cd-plugin-scanning。

常见问题

  • 一次干净的安装扫描意味着插件安全吗?它意味着安装过程是规矩的。运行期行为是另一回事,任何静态安装扫描都对它无从评价。
  • 为什么 runtime script risk 更难打分?因为同一段代码无害还是有害取决于意图,而意图不写在清单里。人工评审抓得住,模式匹配抓不住。
  • 带 postinstall 脚本的插件是不是都该避开?不是。不少正经插件要靠它编译原生代码或拉取平台二进制。要看这个钩子具体做了什么,而不是仅凭存在与否就否掉。
  • 既然运行期不扫描,评分从哪来?评分覆盖维护状况、文档质量、生态健康度和安装期行为。评分独立于开发者自报数据这件事,写在 /blog/dsh-plugin-review-process。

把一次干净的安装扫描当成第一道闸门,而不是最后一道。dshquality.com 上每个插件都有评分页,写明哪些查过、哪些没查,你能直接看到自己面对的是整幅图的哪一半。评分背后的评审流程在 /blog/dsh-plugin-review-process,我们发布的全部文章在 /blog。

install script scanningruntime script riskinstall vs runtime scriptsplugin scanner coverageruntime script riskinstall vs runtime scriptspostinstall script scanningwhat plugin scanners check