首页
/ Lodash 安全事件响应计划解析:从漏洞上报、分诊到负责任披露的完整流程

Lodash 安全事件响应计划解析:从漏洞上报、分诊到负责任披露的完整流程

2026-09-04 21:46:48作者:瞿蔚英Wynne

Lodash 仓库根目录下的 incident_response_plan.md 定义了该项目处理安全漏洞报告的正式流程:安全分诊团队(Security Triage Team)如何分诊(triage)、评估并负责任地披露(responsible disclosure)漏洞。本文完整继承该文档的流程图、角色职责与 Runbook,并结合 SECURITY.md 中的时限政策、threat-model.md 中的安全边界,以及 lodash.jstest/test.js 中的源码级证据,说明该流程如何在 Lodash 这个被广泛使用的 JavaScript 工具库中落地。

流程总览与安全报告处理流程图

文档开宗明义:安全是 Lodash 的顶级优先事项,该文档是安全分诊团队从漏洞上报到解决的流程指南,且必须与项目的 SECURITY 政策保持一致。

原文档以 Mermaid 流程图刻画了完整的决策路径,这里完整保留:

flowchart TD
    A[Security Report Received] --> B[Assign Security Report Coordinator]
    B --> E{Premature Disclosure?}

    E -- No --> J[Proceed with Standard Private Process]
    E -- Yes --> F[Privatize Disclosure]
    F --> G[Handle Related PRs & Issues]
    G --> H[Request GitHub to Remove Public PR/Issues]
    H --> I[Create Public Placeholder Issue]
    I --> J[Acknowledge within 5 days to the Reporter]
    J --> K[Create Issue in Triage Repo for Visibility]

    K --> L[Assess Report]
    L --> M{Enough Information?}

    M -- No --> N[Request Additional Info]
    N --> L[Assess Report]

    M -- Yes --> O{Valid Vulnerability?}
    O -- No --> X[Close Report as Invalid]
    X --> Y[Acknowledge within 10 days to the Reporter]

    O -- Yes --> Q[Create Advisory]
    Q --> Q1[Calculate CVSS Score]
    Q1 --> Q2[Request a CVE]

    Q2 --> R{Patch Required?}

    R -- No --> Z[Public Disclosure]

    R -- Yes --> T[Develop Patch]
    T --> U[Test Solution]
    U --> V[Add Regression Testing]
    V --> W[Create a Security Release with CVE Included]
    W --> Z[Public Disclosure]
    Z --> Z1[Notify Community]
    Z1 --> Z2[Official Blog Post]
    Z1 --> Z3[Social Media Announcements]

流程的关键决策点可以归纳为四条主线:

  1. 是否已提前公开(Premature Disclosure?):若报告已意外或刻意公开,先走“私有化”支线(处理相关 PR/Issue、请求删除、创建公开占位 Issue),再汇入标准私有流程;
  2. 信息是否充分(Enough Information?):不充分则回到“请求补充信息”的循环,反复评估;
  3. 是否为有效漏洞(Valid Vulnerability?):无效则关闭报告并在 10 天内告知上报者;有效则进入 Advisory → CVSS 评分 → 申请 CVE 的正式路径;
  4. 是否需要补丁(Patch Required?):不需要则直接公开披露;需要则走“开发补丁 → 测试 → 回归测试 → 含 CVE 的安全版本发布”的完整链路。

公开披露之后,通过社区通知(官方博客文章、社交媒体公告)完成信息触达。

角色与职责(Roles & Responsibilities)

文档将安全事件处理拆分为五类角色,每类角色都有明确的“职责(Responsibilities)”与“期望(Expectations)”。

Finder(发现者)

发现项目中潜在安全漏洞的人,Finder 与 Reporter 可能是同一人,也可能将细节转交他人代为上报。

  • 职责:识别潜在安全漏洞;向 Reporter 或直接向安全分诊团队分享足够多的漏洞细节。
  • 期望:遵循负责任披露指南,确保漏洞在公开披露前以私密方式上报;提供清晰准确的信息以便报告流程推进。

Reporter(上报者)

向安全分诊团队提交安全报告并提供漏洞详细信息的主体,期望其在整个过程中与团队配合并遵循负责任披露指南。

  • 职责:向安全分诊团队提交安全报告。
  • 期望:提供关于疑似漏洞的详细信息;遵循负责任披露(先私密上报,后公开披露);在需要时提供补充细节配合团队;(在适用时)测试并验证补丁;尊重安全时间线,避免提前公开披露。

Coordinator(安全报告协调者,SRC)

针对某个具体安全报告的对口负责人,确保该报告全程遵循负责任披露指南。SRC 负责在漏洞确认后协调修复流程,保证流程被执行、必要行动被采取。注意:SRC 并不必然亲自做分析、修复或打补丁——但如果其同时担任 Analyst 或 Remediation Developer 角色,也可以承担这些任务。

  • 职责
    • 在规定时限内确认收到安全报告;
    • 主持禁运期(embargo)管理,确定涉及人员的最小集合,并提醒所有相关者不得通知/拉入任何其他个体——若确需拉人,必须经过 SRC;
    • 指派 Analyst 来评估和验证报告;
    • 确保整个过程中与上报者的持续沟通;
    • 漏洞确认后协调修复流程;
    • 如适用,监督 Advisory 与 CVE 申请流程;
    • 必要时升级(escalate)严重漏洞;
    • 跟踪所有安全报告以保证可见性与汇报能力。
  • 要求:必须是安全分诊团队的成员。

根据 GOVERNANCE.md 的说明,当前 Lodash 的安全分诊工作由 TSC(Technical Steering Committee,技术指导委员会)承担,即上述 SRC、Analyst 等角色实际上由 TSC 成员出任。

Analyst(分析师)

  • 判断上报问题是否为真实漏洞,且是否在项目 威胁模型 定义的范围内;
  • 验证 PoC(概念验证)利用;
  • 评估安全报告并判定其严重性(协助 CVSS 评分);
  • 对照最佳实践验证所报告漏洞;
  • 识别潜在的缓解策略与绕行方案(workaround);
  • 为 SRC 准备评估报告。

Remediation Developer(修复开发者)

  • 基于上报漏洞开发补丁或解决方案;
  • 确保补丁遵循最佳实践且可测试;
  • 向现有测试套件添加测试用例:用于在补丁前确认漏洞存在、补丁后确认修复有效;
  • 测试补丁确保其按预期工作;
  • 创建 Pull Request 将补丁合入项目。

Runbook:分步流程详解

文档的 Runbook 部分是整个计划的操作核心,按 Step 0 至 Step 4 展开,每个决策点、场景与可能动作都有说明。以下按原文骨架完整继承并展开。

Step 0:收到安全报告

安全漏洞报告通过官方渠道收到,也可能通过其他渠道(第三方通告服务、博客文章、社交媒体等)进入视野。

理想情况下,报告应包含清晰且详细的信息:受影响版本、一个能演示问题的小型 PoC/示例项目、复现步骤、预期行为与实际行为的差异、潜在影响等。但由于沟通渠道不同,报告未必一开始就满足这些要求——这些信息会在后续步骤中逐步收集并完善报告。

关于官方渠道,SECURITY.md 进一步给出了可操作的时限承诺,这为流程中“确认收到(Acknowledge within 5 days)”节点提供了政策锚点:

  • 若上报者在 6 个工作日内未收到确认,或找不到私密安全联系渠道,可以向 OpenJS Foundation CNA(security@lists.openjsf.org)升级;
  • 若项目确认了报告但在 14 天内无任何进一步响应或互动,同样可以升级。

Step 1:指派 SRC 并整合报告

1.1 安全分诊团队中一人主动认领(self-assign)负责该案件,并预期一直担任 SRC 直到流程结束。文档附注指出:虽然行文上以单个 SRC 简化表述,实践中设两位协调者是可以接受且常常有益的——第二协调者可以协助在 Advisory 发布前审查其内容,确保准确与完整。

1.2 若报告被意外或刻意创建在公开渠道(例如 GitHub issues),**必须尽快(ASAP)**在私密 Slack 频道 #lodash-security-triage 同步给安全分诊团队。此阶段的首要优先级是尽快把报告从公众视野中移除,并让上报者知道接下来会发生什么。

1.2.1 若报告以 Pull Request 或 Issue 形式出现在 Lodash GitHub 组织下,由 Lodash TSC 成员执行以下固定动作序列(原文完整保留):

  • 将 Issue 移动到私有仓库 lodash/security-triage
  • 对任何相关 Pull Request,在 lodash/security-triage 仓库中创建关联 Issue:附上该 PR 补丁副本,并附上 PR 中讨论的截图;
  • 以 Lodash(team)组织账号向 GitHub 提交工单,请求删除该 Pull Request;
  • 若该 PR 分支开启了 “allow edits by maintainers”,则向 PR 分支 force-push,用一个占位提交(placeholder commit)覆盖代码,确保敏感信息立即被清除;
  • 在 PR 评论中通知作者关于 force-push 的事由,原文模板为:

    FYI @xxxx, we force-pushed to your branch to remove sensitive information while we work on releases in private.

  • 在公开仓库中开设新 Issue,标题为 FYI - pull request deleted #YYYY,附给用户的说明:

    FYI @xxxx we asked GitHub to delete your pull request while we work on releases in private.

  • 在 Slack 频道 #lodash-security-triage 更新团队进展。

1.2.2 若报告公开在非本团队拥有/可控的其他渠道,Lodash TSC 将尝试缓解:向平台支持方举报、请上报者自行删除等,使其从公开视野中移除。

1.3 在此阶段,SRC 在私有仓库 lodash/security-triage 中创建 Issue(若 Step 1.2.1 已创建则复用),汇集报告中的现有信息。该 Issue 作为此报告的中心讨论点。同时,SRC 在此阶段向报告者确认收到安全报告。文档附注:该 Issue 预期指派给 SRC,并保持打开直到流程结束。

Step 2:审查报告并判定严重性

2.1 安全分诊团队审查报告、判定严重性,并评估其对项目的影响。某些情况下报告过于模糊而无法准确定级,此时 SRC 需要联系报告者补充信息、完善报告——对应流程图中 “Not Enough Information → Request Additional Info” 的循环。

2.2 若团队判定报告无关或不成立,SRC 关闭 Issue 并告知报告者报告已被驳回(dismissed)。理想情况下应给出驳回理由,避免同一报告未来被重复提交。对应流程图中 “Close Report as Invalid → Acknowledge within 10 days” 的分支。

2.3 若报告被判定相关且有效,SRC 创建 Advisory 并申请 CVE 编号,同时将修复开发者、分析师以及(可能的)报告者纳入 Advisory,以便他们在私有 fork 上开始修复安全问题的协作。

Step 3:补丁与发布

3.1 安全分诊团队确定该漏洞是否要打补丁并开始工作。若不打补丁,跳到 Step 4(对应流程图中 “Patch Required? → No” 分支)。

3.2 缓解团队(修复开发者、分析师、报告者)负责补丁工作;补丁就绪后重新评估报告,并(在可能时)加入回归测试——这与前述 Remediation Developer 的职责完全对应。

3.3 Lodash TSC 在公开 Issue 上宣布:安全补丁可用,计划在某具体日期发布,并列出受影响版本——刻意不提供额外细节,以防止提前披露(early disclosure)。

3.4 Lodash TSC 创建发布版本并发布到 npm。GOVERNANCE.md 中说明了发布权限的归属:Release Team 是唯一负责向 npm 发布新版本的团队。

Step 4:公开披露

4.1 SRC 将 Advisory 公开,并关闭 Step 1 中创建的协调 Issue。

4.2 SRC 可请 Lodash TSC 通过 OpenJS Foundation 渠道协调博客文章或社交媒体公告。

判定的依据:威胁模型划定“有效漏洞”的边界

流程图中 “Valid Vulnerability?” 的判断并非随意而为。Runbook 的 Step 2 明确要求判断报告是否在 threat-model.md 定义的范围内,这是 Lodash 区分“项目漏洞”与“非漏洞”的正式依据。从该文档看,边界规则相当具体:

  • 范围内(in scope)的典型例子:原型链污染(如 mergedefaultsDeepset 允许通过不可信输入修改 Object.prototype)、意外代码执行(如 template() 将攻击者可控输入当作代码执行)、通过逻辑缺陷导致的拒绝服务(无界递归、内存耗尽、挂起)。
  • 范围外(out of scope)的典型例子:应用未校验输入(如 _.merge(req.body, config) 属于应用缺陷)、只读的原型链访问(_.get(obj, 'constructor.prototype') 返回 Object.prototype 是 JavaScript 语言语义而非 Lodash 行为)、getter/setter/Proxy 支撑的路径参数(check/use mismatch 需要进程内代码配合)、跨库漏洞链与 gadget、JS 引擎自身缺陷、环境配置问题、供应链投毒。

此外,threat-model.md 对 _.template 给出了专门安全提示:当前实现会将模板字符串编译为可执行代码,在给定不可信输入时可能导致代码注入,官方认为其不安全并建议在 Lodash v5 中移除;在其仍可用的期间,仅建议用于开发者可控的静态模板字符串与可信数据。

流程落地的源码证据:原型链污染防护与回归测试

Runbook 中 “Develop Patch → Test Solution → Add Regression Testing” 这条链路在仓库中有直接对应。以威胁模型重点关注的原型链污染为例:

防护实现方面,从源码结构看,lodash.js 中多处对危险键做了硬拦截:

  • baseSet(路径写入)中,若路径任一段为 __proto__constructorprototype,直接返回原对象而不继续写入(见 lodash.js);
  • 在路径合法性校验中,__proto__ 出现在路径任意位置(且非对象自身属性)即判定路径非法;constructor/prototype 作为非末端遍历键也会被阻断,防止逃逸出对象图触及内建构造函数与原型(见 lodash.js 中的注释 “Always block __proto__ anywhere in the path” 与 “Block constructor/prototype as non-terminal traversal keys”)。

回归测试方面,test/test.js 中存在专门验证这些防护的用例,恰好体现了事件响应计划对 Remediation Developer 的“补丁前确认漏洞、补丁后确认修复”的要求:

  • QUnit.module('__proto__ property bugs') 模块覆盖内部数据对象、键分组、赋值等场景下的 __proto__ 处理(见 test/test.js);
  • _.merge 不合并 __proto__ 属性的用例,直接以 JSON.parse('{"__proto__":{"a":1}}') 作为攻击输入(见 test/test.js);
  • _.unset 系列用例验证 foo.__proto__.toLowerCase 及数组包裹段([['__proto__'], ['foo']])这类绕过写法的访问被阻断(见 test/test.js);
  • zipObjectDeep 针对 __proto__constructorprototype 三个键逐一测试原型链污染防护(见 test/test.js);
  • _.template 相关用例验证继承键中的代码注入不会执行,并引用了历史安全通告 GHSA-r5fr-rjxr-66jc 作为回归依据(见 test/test.js)。

这些用例共同说明:在 Lodash 的事件响应实践中,“Add Regression Testing” 不是口号,而是以 QUnit 测试套件为载体、与具体 CVE/Advisory 编号关联的可追溯验证。

相关文档索引

文档 作用
incident_response_plan.md 安全事件响应的正式流程:流程图、角色职责、Runbook
SECURITY.md 支持版本范围、报告渠道(仓库 Security tab)、升级路径与时限(6 个工作日 / 14 天)
threat-model.md 信任边界定义,划分 in-scope / out-of-scope 漏洞类别
GOVERNANCE.md TSC 成员名单、Security Triage Team(当前由 TSC 承担分诊)与 Release Team 职责

适用前提说明:本文描述的流程以当前仓库文档为准;其中涉及私有仓库 lodash/security-triage 与私密 Slack 频道的部分,属于仅限安全分诊团队可见的内部操作,外部读者只能了解其流程位置与目的,无法访问具体内容。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.12 K
2.72 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
528
588
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
906
1.83 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
854
1.34 K
docsdocs
暂无描述
Markdown
891
5.79 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.53 K
1.01 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.34 K
1.45 K
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
988
506
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
540
384