orca-sec-scans

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Skill: orca-sec-scans

Skill: orca-sec-scans

WHAT

是什么

Purpose và context

目的与上下文

  • Purpose: Một luồng quét bảo mật static, chỉ-đọc (Trivy không sửa mã khi quét), dùng được local lẫn CI/Jenkins. Bao trùm: dependency CVE (Go/Node/Python lockfile), misconfig (Dockerfile/compose/nginx), và secret lộ trong file. Ngoài lớp static đó còn hai lớp: quét ĐỘNG kiểm chứng giả định mặc định của dev bằng request thật, và quét RA NGOÀI (chuỗi cung ứng/thương hiệu, keyless).
  • Trigger (when to use):
    • User nói "quét bảo mật", "scan", "trivy", "check CVE", "security scan", "có lỗ hổng không"
    • Trước khi release / merge nhánh deploy
    • Định kỳ trong CI (
      trivy fs . --config trivy.yaml --exit-code 1
      )
    • Diff rơi vào bảng Trigger-conditions (auth, input người dùng, secret, endpoint mới, thanh toán/dữ liệu nhạy cảm, đưa app ra public domain) → BẮT BUỘC scan; user nói "có lỗ hổng không", "an toàn chưa" → luôn là trigger.
  • Non-goals: không auto-bump hàng loạt khi submodule có thay đổi chưa commit; không xoá finding khỏi report (chấp nhận thì ghi
    .trivyignore
    ); không commit report lên server deploy; không điều tra mối đe doạ ngoài diện rộng kiểu cti-expert (chỉ mẩu supply-watch keyless).
  • 目的: 一套 static、只读的安全扫描流程(Trivy 扫描时不会修改代码),既可在 local 使用,也可在 CI/Jenkins 使用。覆盖:dependency CVE(Go/Node/Python lockfile)、misconfig(Dockerfile/compose/nginx),以及文件中泄露的 secret。 除该 static 层外,还有两层:通过真实 request 动态扫描并验证开发者的默认假设,以及向外扫描(供应链/品牌,keyless)。
  • 触发条件(何时使用):
    • 用户提到「quét bảo mật」、「scan」、「trivy」、「check CVE」、「security scan」、「có lỗ hổng không」
    • release / merge 部署 branch 之前
    • 在 CI 中定期执行(
      trivy fs . --config trivy.yaml --exit-code 1
      )
    • diff 命中 Trigger-conditions 表(auth、用户输入、secret、新 endpoint、支付/敏感数据、将 app 部署到 public domain)→ 必须 scan;用户说「có lỗ hổng không」、「an toàn chưa」→ 始终构成 trigger。
  • 非目标: 当 submodule 存在尚未提交的更改时,不批量自动升级依赖;不从 report 中删除 finding(接受后写入
    .trivyignore
    );不将 report commit 到部署服务器;不开展 cti-expert 那种大范围外部威胁调查(仅采用 supply-watch keyless 片段)。

Mental model

思维模型

Trivy có chưa? → scope (lockfile) → quét static HIGH/CRITICAL → report JSON+HTML → tóm tắt + đề xuất fix → re-scan NONE
, song song
giả định dev → request thật (curl/dig/git diff) → xác nhận hoặc lỗ hổng
, cộng tuỳ chọn
tên thương hiệu → biến thể tất định → DNS sống + CT log
. Static sạch KHÔNG có nghĩa là an toàn.
是否已有 Trivy? → scope(lockfile) → static 扫描 HIGH/CRITICAL → JSON+HTML 报告 → 汇总 + 修复建议 → re-scan NONE
,并行执行
开发者假设 → 真实请求(curl/dig/git diff)→ 确认或发现漏洞
,并可选执行
品牌名称 → 确定性变体 → 存活 DNS + CT log
。Static 扫描干净并不意味着安全。

Input và output contract

输入与输出约定

FieldRequired?Ý nghĩa
Inthư mục mã nguồn (be, fe hoặc
.
)
cótarget quét;
trivy.yaml
nếu repo có
InHOST / domain đang chạycho quét độngđể curl/dig kiểm chứng thật
Intên thương hiệukhôngcho
supply-watch.py
Out
security/trivy-report.json
+
security/trivy-report.html
córeport đầy đủ, chỉ là artifact review
Outbảng HIGH/CRITICAL theo target + đề xuất fixcóbump deps, USER non-root, xoay secret
Outkết quả quét độngcótừng giả định: đúng/sai kèm lệnh + mã HTTP/DNS thật
Outkết quả re-scankhi có fix
remaining = NONE
Outbáo cáo supply-watchtuỳ chọnrc 0 sạch, 2 có phát hiện; crt.sh lỗi → BỎ QUA
字段必需?含义
In源码目录(be、fe 或
.
)
是扫描目标;如果 repo 中有
trivy.yaml
,则使用它
In正在运行的 HOST / domain动态扫描时需要用于通过 curl/dig 进行真实验证
In品牌名称否用于
supply-watch.py
Out
security/trivy-report.json
+
security/trivy-report.html
是完整 report,仅作为 review artifact
Out按 target 汇总的 HIGH/CRITICAL 表 + 修复建议是升级依赖、使用非 root 的 USER、轮换 secret
Out动态扫描结果是每项假设:正确/错误,并附命令及真实 HTTP/DNS 状态码
Outre-scan 结果应用修复后需要
remaining = NONE
Outsupply-watch 报告可选rc 0 表示干净,2 表示存在发现;crt.sh 出错 → 跳过

Rules và capabilities

规则与能力

  • RULE-01 (MUST): Static (Trivy) + Động (checklist trên) là HAI lớp khác nhau — chạy CẢ HAI. Trivy bắt CVE/misconfig/secret-in-file; nó KHÔNG bắt auth bypass, public exposure, CORS/CSRF logic, lệch branch. Đừng coi report Trivy sạch = an toàn.
  • RULE-02 (MUST): Không tin giả định mặc định của dev — mọi "đã có login", "nội bộ nên an toàn", "chạy được rồi" phải kiểm chứng bằng request thật trước khi kết luận.
  • RULE-03 (MUST): Trivy không sửa mã khi quét — an toàn chạy bất kỳ lúc nào.
  • RULE-04 (MUST): Finding đã review & chấp nhận → ghi vào
    .trivyignore
    (1 ID/dòng + comment lý do + ngày), KHÔNG xoá khỏi report.
  • RULE-05 (MUST): Không commit
    security/*.json|html
    lên server deploy — chỉ là artifact review.
  • RULE-06 (MUST): Khi deploy bonbon-ai: chỉ push
    be
    và
    fe
    (2 submodule) lên server; tooling (trivy.yaml, security/, skill) không lên server.
  • RULE-07 (MUST): Mọi thay đổi fix phải qua build/verify trước khi commit (
    go build ./...
    ,
    pnpm i
    , …).
  • Capabilities: cài công cụ quét cục bộ nếu thiếu; quét static chỉ-đọc mã nguồn; gửi request HTTP/DNS thật tới host của chính dự án; sửa manifest/Dockerfile khi được áp fix; đọc CT log/DNS công khai (keyless).
  • RULE-01(必须):Static(Trivy)与动态扫描(上述清单)属于两个不同层级——两者都要运行。 Trivy 可发现 CVE/misconfig/文件中的 secret;它无法发现 auth bypass、public exposure、CORS/CSRF 逻辑问题或 branch 不一致。不要将干净的 Trivy report 等同于安全。
  • RULE-02(必须):不要相信开发者的默认假设——所有「已经有 login」、「内网所以安全」、「能运行就行了」的说法,都必须先通过真实请求验证,然后才能下结论。
  • RULE-03(必须):Trivy 扫描时不会修改代码——可随时安全运行。
  • RULE-04(必须):已经 review 并接受的 finding → 写入
    .trivyignore
    (每行一个 ID + 原因注释 + 日期),不要从 report 中删除。
  • RULE-05(必须):不要将
    security/*.json|html
    commit 到部署服务器——它们仅是 review artifact。
  • RULE-06(必须):部署 bonbon-ai 时,只 push
    be
    和
    fe
    (两个 submodule)到服务器;tooling(trivy.yaml、security/、skill)不上传服务器。
  • RULE-07(必须):所有修复变更都必须在 commit 前通过 build/verify(
    go build ./...
    、
    pnpm i
    等)。
  • 能力:如果缺少扫描工具,则在本地安装;以只读方式 static 扫描源码;向项目自身的 host 发送真实 HTTP/DNS request;在获准应用修复时修改 manifest/Dockerfile;读取公开的 CT log/DNS(keyless)。

Failure boundaries

失败边界

  • Không cài được Trivy → blocked, báo user.
  • Submodule có thay đổi chưa commit → chỉ đề xuất fix, không auto-bump.
  • Fix không build được (
    go build ./...
    ,
    pnpm i
    ) → failed, không commit.
  • Không có HOST để quét động → partial: chỉ static, nói rõ lớp động CHƯA chạy, không kết luận "an toàn".
  • Secret bị flag → xoay key ngay (không chỉ xoá khỏi file).
  • supply-watch không gọi được crt.sh → BỎ QUA, không phán sạch.
  • 无法安装 Trivy → blocked,通知用户。
  • Submodule 存在尚未提交的更改 → 仅建议修复,不自动升级依赖。
  • 修复后无法构建(
    go build ./...
    、
    pnpm i
    )→ failed,不得 commit。
  • 没有 HOST 可用于动态扫描 → partial:仅执行 static 扫描,明确说明动态层尚未运行,不得得出「安全」的结论。
  • Secret 被标记 → 立即轮换 key,不能只从文件中删除。
  • supply-watch 无法调用 crt.sh → 跳过,不得判定为干净。

HOW

如何执行

Main workflow

主工作流

StepTypeInputsActionOutputs/exitFailure/next
W01effectmáyBước 0 — Check + Install Trivy (BẮT BUỘC chạy trước)
trivy --version
in ra
cài lỗi → blocked
W02deterministicrepoBước 1 — Detect ngôn ngữ qua lockfile, bỏ thư mục build/vendorscope—
W03deterministicscopeBước 2 — Quét vuln + misconfig + secret, HIGH/CRITICAL trướcfindings—
W04deterministicfindingsBước 3 — Xuất report JSON + HTML vào
security/
2 file report—
W05judgmentfindingsBước 4 — Tóm tắt HIGH/CRITICAL theo target + đề xuất fixbảng + đề xuấtsubmodule bẩn → chỉ đề xuất
W06deterministictarget đã fixBước 5 — Re-scan xác nhận
remaining = NONE
còn → quay W05
W07effectHOST, diffQuét ĐỘNG: chạy checklist 8 giả định dev bằng request thậttừng giả định có bằng chứngkhông HOST → partial
W08deterministictên thương hiệuQuét RA NGOÀI bằng
supply-watch.py
(B03)
rc 0 hoặc 2crt.sh lỗi → BỎ QUA
Chi tiết từng bước (nguồn chân lý cho W01–W08):
步骤类型输入操作输出/退出状态失败/下一步
W01effect机器第 0 步——检查并安装 Trivy(必须先执行)输出
trivy --version
安装失败 → blocked
W02deterministicrepo第 1 步——通过 lockfile 检测语言,排除构建目录/vendorscope—
W03deterministicscope第 2 步——扫描 vuln + misconfig + secret,优先处理 HIGH/CRITICALfindings—
W04deterministicfindings第 3 步——将 JSON + HTML report 输出到
security/
2 个 report 文件—
W05judgmentfindings第 4 步——按 target 汇总 HIGH/CRITICAL + 修复建议表 + 建议submodule 存在未提交更改 → 仅建议
W06deterministic已修复的 target第 5 步——执行 re-scan 验证
remaining = NONE
仍有发现 → 返回 W05
W07effectHOST、diff动态扫描:通过真实 request 执行 8 项开发者假设清单每项假设均有证据无 HOST → partial
W08deterministic品牌名称使用
supply-watch.py
执行向外扫描(B03)
rc 0 或 2crt.sh 出错 → 跳过
以下各步骤的详细信息(W01–W08 的唯一事实来源):

Workflow

工作流

Bước 0 — Check + Install Trivy (BẮT BUỘC chạy trước)
第 0 步——检查并安装 Trivy(必须先执行)
bash
if ! command -v trivy >/dev/null 2>&1; then
  echo "Trivy chưa có → cài…"
  if [[ "$(uname)" == "Darwin" ]]; then
    brew install trivy
  else
    # Linux: dùng script chính thức Aqua (không cần root nếu set BINDIR)
    curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh \
      | sh -s -- -b /usr/local/bin
  fi
fi
trivy --version   # xác nhận; DB vuln tự cập nhật lần chạy đầu
bash
if ! command -v trivy >/dev/null 2>&1; then
  echo "Trivy chưa có → cài…"
  if [[ "$(uname)" == "Darwin" ]]; then
    brew install trivy
  else
    # Linux: dùng script chính thức Aqua (không cần root nếu set BINDIR)
    curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh \
      | sh -s -- -b /usr/local/bin
  fi
fi
trivy --version   # xác nhận; DB vuln tự cập nhật lần chạy đầu
Bước 1 — Detect ngôn ngữ (scope quét)
第 1 步——检测语言(扫描 scope)
Tìm lockfile để biết hệ sinh thái:
go.sum
/
go.mod
(Go),
package-lock.json
/
pnpm-lock.yaml
(Node),
requirements.txt
/
poetry.lock
(Python). Bỏ qua
node_modules
,
.next
,
.contentlayer
,
_archives
,
.git
.
查找 lockfile 以识别技术生态:
go.sum
/
go.mod
(Go)、
package-lock.json
/
pnpm-lock.yaml
(Node)、
requirements.txt
/
poetry.lock
(Python)。排除
node_modules
、
.next
、
.contentlayer
、
_archives
、
.git
。
Bước 2 — Quét (HIGH+CRITICAL trước cho nhanh)
第 2 步——扫描(优先 HIGH+CRITICAL 以提高速度)
bash
trivy fs <dir> \
  --scanners vuln,misconfig,secret \
  --severity HIGH,CRITICAL \
  --skip-dirs '**/node_modules' --skip-dirs '**/.next' \
  --skip-dirs '**/.contentlayer' --skip-dirs '_archives' \
  --no-progress
Repo bonbon-ai: quét riêng
be
và
fe
(mỗi cái là submodule). Ưu tiên
--config trivy.yaml
nếu repo đã có.
bash
trivy fs <dir> \
  --scanners vuln,misconfig,secret \
  --severity HIGH,CRITICAL \
  --skip-dirs '**/node_modules' --skip-dirs '**/.next' \
  --skip-dirs '**/.contentlayer' --skip-dirs '_archives' \
  --no-progress
对于 bonbon-ai repo:分别扫描
be
和
fe
(每一个都是 submodule)。如果 repo 已有配置,优先使用
--config trivy.yaml
。
Bước 3 — Xuất report đầy đủ
第 3 步——导出完整 report
bash
mkdir -p security
TPL=$(find $(brew --prefix trivy 2>/dev/null || echo /opt/homebrew) -name html.tpl 2>/dev/null | head -1)
trivy fs . <cờ skip-dirs như trên> --no-progress -f json     -o security/trivy-report.json
trivy fs . <cờ skip-dirs như trên> --no-progress -f template --template "@$TPL" -o security/trivy-report.html
bash
mkdir -p security
TPL=$(find $(brew --prefix trivy 2>/dev/null || echo /opt/homebrew) -name html.tpl 2>/dev/null | head -1)
trivy fs . <cờ skip-dirs như trên> --no-progress -f json     -o security/trivy-report.json
trivy fs . <cờ skip-dirs như trên> --no-progress -f template --template "@$TPL" -o security/trivy-report.html
Bước 4 — Tóm tắt & đề xuất fix
第 4 步——汇总并建议修复
Đếm HIGH/CRITICAL theo từng target, in bảng. Sau đó đề xuất (KHÔNG auto-bump hàng loạt nếu submodule đang có thay đổi chưa commit):
  • Dep bump dễ (direct dep, sửa thẳng manifest): vd
    python-multipart
    trong
    requirements.txt
    .
  • Dep indirect:
    go get <pkg>@<ver>
    rồi
    go build ./...
    verify. Lưu ý
    go get
    có thể nâng directive
    go
    ; nếu vượt base image trong Dockerfile thì bump luôn
    FROM golang:X-alpine
    cho khớp.
  • Misconfig DS-0002 (root user): thêm
    USER
    non-root vào Dockerfile (
    adduser -D
    alpine,
    useradd -m
    debian, hoặc
    USER node
    cho image node-alpine; nhớ
    chown
    thư mục ghi như volume/data).
  • Secret: nếu Trivy flag → xoay key ngay, không chỉ xoá khỏi file.
按每个 target 统计 HIGH/CRITICAL 并输出表。随后提出修复建议(如果 submodule 存在尚未提交的更改,不要批量自动升级依赖):
  • 容易升级的依赖(direct dep,可直接修改 manifest):例如
    requirements.txt
    中的
    python-multipart
    。
  • Indirect dep:执行
    go get <pkg>@<ver>
    ,然后运行
    go build ./...
    验证。注意,
    go get
    可能升级
    go
    directive;如果新版本超过 Dockerfile 中基础镜像所带的版本,则同步升级
    FROM golang:X-alpine
    以保持一致。
  • Misconfig DS-0002(root user):在 Dockerfile 中添加非 root 的
    USER
    (Alpine 使用
    adduser -D
    ,Debian 使用
    useradd -m
    ,node-alpine 镜像可使用
    USER node
    ;记得对 volume/data 等可写目录执行
    chown
    )。
  • Secret:如果 Trivy 标记出来,应立即轮换 key,不能只从文件中删除。
Bước 5 — Re-scan xác nhận
第 5 步——执行 re-scan 验证
Chạy lại Bước 2 trên target đã fix, xác nhận
remaining = NONE
.
对已修复的 target 重新执行第 2 步,确认
remaining = NONE
。

Quét RA NGOÀI — chuỗi cung ứng & thương hiệu (chân thứ ba, keyless)

向外扫描——供应链与品牌(第三方、keyless)

Hai phần trên đều nhìn VÀO TRONG dự án. Không gì nhìn RA NGOÀI: ai đang dựng domain hoặc package na ná tên bạn để lừa người dùng, hoặc để chèn một dependency giả vào lệnh cài của chính bạn.
bash
python3 fdk/tools/supply-watch.py <tên-thương-hiệu>            # sweep mặc định 7 TLD
python3 fdk/tools/supply-watch.py <tên> --tld com,dev --json   # cho CI
python3 fdk/tools/supply-watch.py --self-test
Sinh biến thể tất định, offline theo sáu kiểu — bỏ chữ, lặp chữ, đảo chữ, gõ nhầm phím kề (bàn phím QWERTY), chữ nhìn giống (
o
→
0
,
l
→
1
), thêm gạch nối — rồi hỏi DNS xem cái nào đang sống. Kèm CT monitor đọc Certificate Transparency (crt.sh) xem có chứng chỉ nào vừa được cấp cho domain na ná.
Không cần API key, không cần
.venv
. Mã thoát:
0
sạch ·
2
có phát hiện. Không gọi được crt.sh thì nó nói BỎ QUA, không phán là sạch.
Hấp thụ hẹp từ
7onez/cti-expert
(workflow 08). Cố ý chỉ lấy mẩu này: cti-expert là 121 op + 78 MCP tool để điều tra mối đe doạ bên ngoài, cần
.venv
+ API key + mạng outbound. Gộp nguyên khối là kéo phụ thuộc key/mạng vào một cổng đang keyless và chạy được offline.
上述两个部分都只检查项目内部,无法发现有人注册与你名称相近的 domain 或 package 来欺骗用户,或通过伪造 dependency 注入他人的安装命令。
bash
python3 fdk/tools/supply-watch.py <tên-thương-hiệu>            # sweep mặc định 7 TLD
python3 fdk/tools/supply-watch.py <tên> --tld com,dev --json   # cho CI
python3 fdk/tools/supply-watch.py --self-test
按六种方式生成确定性、离线变体——删除字符、重复字符、反转字符、模拟相邻键误按(QWERTY 键盘)、使用相似字符(
o
→
0
、
l
→
1
)、添加连字符——然后查询 DNS,判断哪些变体仍然存活。同时使用 CT monitor 读取 Certificate Transparency(crt.sh),检查近期是否有名称相近的 domain 获得证书。
不需要 API key,也不需要
.venv
。退出码:
0
表示干净,
2
表示存在发现。无法调用 crt.sh 时,它会显示跳过,不会判定为干净。
从
7onez/cti-expert
(workflow 08)中窄范围吸收。刻意仅提取此片段:cti-expert 包含 121 个 op + 78 个 MCP tool,用于外部威胁调查,需要
.venv
+ API key + outbound 网络。整块合并会把 key/网络依赖引入一个本应 keyless 且可离线运行的端口。

Quét ĐỘNG — kiểm chứng giả định của dev (bổ sung cho Trivy)

动态扫描——验证开发者的假设(Trivy 补充)

Nguyên tắc: Trivy (static) KHÔNG bắt được lỗi kiến trúc/logic/cấu hình runtime. Lỗ hổng nặng nhất thường nằm ở giả định mặc định của developer — phải kiểm chứng bằng request thật, không tin lời. "Chạy được" ≠ "an toàn".
Đúc kết từ sự cố 22/06/2026: API ETL payroll không có auth (auth chỉ ở tầng web, path
/etl
qua nginx đi vòng qua) → ai cũng
curl
lấy được lương + PII 3.637 NV; tưởng "nội bộ" nhưng có domain public
devtingting.coteccons.vn
(IP public) bắc cầu ra cả internet. Trivy không phát hiện — chỉ
curl
/
dig
thật mới ra.
原则:Trivy(static)无法发现架构/逻辑/runtime 配置问题。 最严重的漏洞通常隐藏在开发者的默认假设中——必须使用真实请求进行验证,不能相信口头说法。「能够运行」≠「安全」。
源自 2026/06/22 的事故:payroll ETL API 没有 auth(auth 只在 web 层,nginx 中的
/etl
路径绕过了它)→ 任何人都能通过
curl
获取工资数据 + 3,637 人的 PII;人们以为它属于「内网」,但它拥有 public domain
devtingting.coteccons.vn
(public IP),通过互联网形成桥接。Trivy 无法检测到该问题——只有实际执行
curl
/
dig
才能发现。
Checklist "ĐỪNG TIN — phải kiểm chứng" (dev assumption → thực tế → cách verify)
「不要相信——必须验证」清单(开发者假设 → 实际情况 → 验证方式)
  1. "API sau reverse proxy được bảo vệ vì web/UI có login." → SAI: auth thường chỉ ở tầng web; path proxy (
    /etl
    ,
    /api
    ...) browser gọi thẳng nên đi VÒNG qua login. → Verify:
    curl
    THẲNG từng route API không kèm cookie/token → phải
    401
    . Nếu
    200
    +data = lỗ hổng. Auth phải ở tầng API/proxy (vd nginx
    auth_request
    ), KHÔNG chỉ ở UI.
    bash
    for p in data/stats/all report/export sync/status; do
      curl -k -o /dev/null -w "$p -> %{http_code}\n" https://HOST/etl/$p; done   # mong đợi 401
  2. "Server nội bộ / IP private (192.168.x) nên ngoài không vào được." → SAI: một public domain /
    tailscale funnel
    / port-forward có thể bắc cầu vào. → Verify:
    dig +short <mọi subdomain khả dĩ>
    → có IP public không? Thử curl từ mạng ngoài. KHÔNG tin "nội bộ" — kiểm DNS thật.
  3. "Mở CORS là lỗ hổng / đóng CORS là đủ an toàn." → SAI HƯỚNG: CORS chỉ chặn browser ĐỌC cross-origin. KHÔNG chặn
    curl
    /script; KHÔNG chặn CSRF GHI (POST query-param / không-body = simple request → không preflight → server chạy bất kể CORS). Lỗ thật thường là no-auth + port mở. Đừng tốn công CORS khi cửa chính (auth) chưa khóa.
  4. "Config mặc định để nguyên là ổn." → Check biến default lọt prod:
    CORS_ORIGINS
    còn
    localhost:3000
    ? secret/flag còn giá trị mẫu?
    BIND_HOST
    vô tình
    0.0.0.0
    ?
    bash
    curl -k -D- -o /dev/null -H "Origin: http://localhost:3000" https://HOST/etl/health | grep -i access-control
  5. "Branch nào deploy cũng như nhau." → SAI: CI (Jenkins) clone branch X nhưng server chạy branch Y → lệch. Merge conflict có thể rớt nguyên block (vd
    networks:
    trong compose →
    undefined network
    , deploy fail). → Verify: branch CI clone == branch đang chạy?
    git diff <ci-branch> <running-branch> -- docker-compose.yml .env* deploy/
    .
  6. "paramiko/SSH kết nối được là xong." →
    Transport(...)
    /
    AutoAddPolicy
    KHÔNG verify host key → MITM đánh cắp pass + file. Verify: phải pin known_hosts +
    RejectPolicy
    .
  7. "Token/secret truyền sao cũng được." → Token trong URL
    ?token=
    → vào nginx/uvicorn access-log, Referer, history. Verify: secret đi qua header/cookie, KHÔNG qua query string.
  8. "
    SELECT *
    cho tiện."
    → Trả mọi cột gồm PII (CCCD/MST/BHXH/lương) +
    search
    toàn-cột làm oracle dò giá trị. Verify: whitelist cột trả về; search không quét cột nhạy cảm.
  1. 「API 位于 reverse proxy 之后,因为 web/UI 有 login,所以受到保护。」 → 错误:auth 通常只存在于 web 层;浏览器调用的 proxy path(如
    /etl
    、
    /api
    )可能绕过 login。 → 验证:使用不带 cookie/token 的
    curl
    直接请求每个 API route → 必须返回
    401
    。如果返回
    200
    + data,则存在漏洞。Auth 必须位于 API/proxy 层(例如 nginx
    auth_request
    ),不能只存在于 UI。
    bash
    for p in data/stats/all report/export sync/status; do
      curl -k -o /dev/null -w "$p -> %{http_code}\n" https://HOST/etl/$p; done   # mong đợi 401
  2. 「服务器属于内网 / 使用 private IP(192.168.x),所以外部无法访问。」 → 错误:public domain、
    tailscale funnel
    或 port-forward 都可能将服务桥接至外部。 → 验证:执行
    dig +short <所有可能的子域名>
    → 是否得到 public IP?从外部网络尝试 curl。不要相信「内网」的说法——必须检查真实 DNS。
  3. 「开放 CORS 就是漏洞 / 关闭 CORS 就足够安全。」 → 方向错误:CORS 只阻止 browser 读取 cross-origin 内容。它不阻止
    curl
    /script,也不阻止 CSRF 写入(采用 POST query-param / 无 body 的 simple request → 不触发 preflight → 无论 CORS 配置如何,server 都会执行)。真正的问题通常是 no-auth + 开放端口。在 auth 这道门尚未锁好时,不要浪费时间处理 CORS。
  4. 「保留默认 config 没问题。」 → 检查泄漏到生产环境的 default 变量:
    CORS_ORIGINS
    中是否仍包含
    localhost:3000
    ?secret/flag 是否仍使用示例值?
    BIND_HOST
    是否意外设置为
    0.0.0.0
    ?
    bash
    curl -k -D- -o /dev/null -H "Origin: http://localhost:3000" https://HOST/etl/health | grep -i access-control
  5. 「无论部署哪个 branch,结果都一样。」 → 错误:CI(Jenkins)clone branch X,但 server 运行 branch Y → 两者不一致。Merge conflict 甚至可能意外删除整个 block(例如 compose 中的
    networks:
    →
    undefined network
    ,导致 deploy 失败)。 → 验证:CI clone 的 branch 是否等于正在运行的 branch?执行
    git diff <ci-branch> <running-branch> -- docker-compose.yml .env* deploy/
    。
  6. 「paramiko/SSH 能够连接就足够了。」 →
    Transport(...)
    /
    AutoAddPolicy
    不会验证 host key → 可能遭遇 MITM,密码和文件被窃取。验证:必须 pin
    known_hosts
    并使用
    RejectPolicy
    。
  7. 「Token/secret 无论通过什么方式传输都可以。」 → URL 中的 token(
    ?token=
    )会进入 nginx/uvicorn access-log、Referer 和 history。验证:secret 应通过 header/cookie 传输,不能放在 query string 中。
  8. 「为了方便而使用
    SELECT *
    。」
    → 会返回所有列,包括 PII(CCCD/MST/BHXH/工资),而全列
    search
    还会成为探测数值的 oracle。验证:使用返回列的 whitelist;search 不得扫描敏感列。
Trigger-conditions — hành vi code nào BẮT BUỘC scan

触发条件——哪些代码行为必须 scan

Không chờ ai nhớ gọi skill — diff rơi vào bảng là nghĩa vụ scan kích hoạt (distill từ
WorldFlowAI/everything-claude-code
security-review):
Thay đổi vừa làmBắt buộcVì sao
Thêm/sửa auth, session, phân quyềnTrivy + quét độngToken để localStorage dính XSS, thiếu check role trước thao tác nhạy cảm — lớp lỗi authorization là thứ Trivy không thấy.
Nhận input người dùng (form, param, upload)Trivy + quét độngInput không validate bằng schema + file upload không giới hạn size/type/extension là cửa vào SQLi/XSS/RCE.
Đụng secret / credential / API keyTrivy (secret scan)Key hardcode trong source hoặc lọt git history — phải ở env var và platform secret,
.env
phải gitignore.
Mở API endpoint mớiTrivy + quét độngEndpoint mới mặc định THIẾU rate-limit + CSRF + check quyền; error message dễ lộ chi tiết nội bộ/stack trace.
Thanh toán / dữ liệu nhạy cảmTrivy + quét động + review tayPII/tiền không được vào log, error phải generic; một lỗ là compromise cả nền tảng — err on the side of caution.
Đưa app ra public domain / đổi reverse proxyQuét độngLỗ no-auth "nội bộ" biến thành internet-exposed đúng lúc đó (checklist giả định dev ở trên).
Không rơi vào bảng → scan theo nhịp release là đủ. Câu tự kiểm: "diff này có làm một trong 6 việc trên không?" — trả lời được dưới một phút. User nói "có lỗ hổng không", "an toàn chưa" → luôn là trigger.
不要等待别人记得调用 skill——只要 diff 命中下表,就自动触发 scan 义务(提炼自
WorldFlowAI/everything-claude-code
的 security-review):
刚完成的更改必须执行原因
添加或修改 auth、session、权限控制Trivy + 动态扫描存放在 localStorage 的 token 容易引发 XSS,敏感操作前缺少 role check——authorization 层面的错误正是 Trivy 无法发现的。
接收用户输入(form、param、upload)Trivy + 动态扫描Input 未通过 schema 验证,file upload 未限制 size/type/extension,可能成为 SQLi/XSS/RCE 的入口。
涉及 secret / credential / API keyTrivy(secret scan)Key 被硬编码进 source 或进入 git history——应放入 env var 和 platform secret,且
.env
必须加入 gitignore。
新增 API endpointTrivy + 动态扫描新 endpoint 默认缺少 rate-limit + CSRF + 权限检查;error message 也容易泄露内部细节/stack trace。
支付 / 敏感数据Trivy + 动态扫描 + 人工 reviewPII/资金不能写入 log,error 必须使用通用信息;一个错误就可能危及整个平台——应谨慎处理。
将 app 部署到 public domain / 修改 reverse proxy动态扫描no-auth 的「内网」服务可能恰好在此刻暴露到互联网(使用上述开发者假设清单检查)。
如果 diff 未命中该表,则按 release 节奏定期 scan 即可。自我检查问题:「这个 diff 是否涉及上述 6 件事之一?」——应当能在一分钟内回答。用户说「có lỗ hổng không」、「an toàn chưa」→ 始终构成 trigger。

Branches

分支

IDKindGuardHành viSkip / failureRejoin
B01conditional_requiredrepo bonbon-aiquét riêng
be
và
fe
(mỗi cái là submodule); deploy chỉ push 2 submodule đó
repo khác → quét
.
W04
B02conditional_requiredrepo đã có
trivy.yaml
ưu tiên
--config trivy.yaml
không có → cờ skip-dirs mặc địnhW04
B03user_optionaluser muốn soi chuỗi cung ứng / thương hiệu
supply-watch.py <tên>
sweep 7 TLD + CT monitor
không yêu cầu → skipkết thúc
B04conditional_requiredfinding đã review và chấp nhậnghi
.trivyignore
(1 ID/dòng + lý do + ngày), không xoá khỏi report
—W06
B05conditional_requiredTrivy flag secretxoay key ngay, không chỉ xoá khỏi file—W06
ID类型条件行为跳过/失败汇合点
B01conditional_requiredrepo 为 bonbon-ai分别扫描
be
和
fe
(每一个都是 submodule);deploy 只 push 这两个 submodule
其他 repo → 扫描
.
W04
B02conditional_requiredrepo 已有
trivy.yaml
优先使用
--config trivy.yaml
不存在 → 使用默认 skip-dirs 标志W04
B03user_optional用户希望检查供应链/品牌执行
supply-watch.py <tên>
,sweep 7 个 TLD + CT monitor
用户未要求 → 跳过结束
B04conditional_requiredfinding 已经 review 并被接受写入
.trivyignore
(每行一个 ID + 原因 + 日期),不从 report 中删除
—W06
B05conditional_requiredTrivy 标记出 secret立即轮换 key,不能只从文件中删除—W06

Validation và stopping

验证与停止条件

Tất định: rc/output của Trivy (re-scan
remaining = NONE
), mã HTTP thật của curl (route API không token phải
401
),
dig
thật,
git diff
branch, rc
supply-watch.py
. Fix chỉ commit sau build/verify xanh. Cần người: quyết chấp nhận finding vào
.trivyignore
, review tay luồng thanh toán/dữ liệu nhạy cảm. Dừng khi re-scan sạch và mọi giả định trong checklist đã có bằng chứng; không kết luận "an toàn" chỉ từ Trivy.
确定性验证包括:Trivy 的 rc/output(re-scan 时为
remaining = NONE
)、curl 的真实 HTTP 状态码(无 token 的 API route 必须返回
401
)、真实的
dig
结果、branch 间的
git diff
,以及
supply-watch.py
的 rc。修复只有在 build/verify 通过后才能 commit。需要人工介入的情况:决定是否将 finding 接受到
.trivyignore
,以及人工 review 支付/敏感数据流程。当 re-scan 干净且清单中的每项假设都有证据时停止;不能仅凭 Trivy 结果得出「安全」的结论。

Examples

示例

  • Positive: "quét bảo mật repo bonbon-ai" → Trivy đã có → quét riêng
    be
    ,
    fe
    → 2 HIGH:
    python-multipart
    trong
    requirements.txt
    + DS-0002 root user → bump dep + thêm
    USER node
    → build xanh → re-scan
    remaining = NONE
    ; quét động curl
    /etl/data/stats/all
    không token ra
    401
    .
  • Boundary/failure: Trivy sạch nhưng curl thẳng
    /etl/report/export
    không cookie trả
    200
    + dữ liệu lương → lỗ hổng auth-bypass, báo nặng dù report static sạch (RULE-01);
    dig +short
    subdomain ra IP public → "nội bộ" là sai.
  • Boundary:
    supply-watch.py acme
    khi crt.sh không phản hồi → in BỎ QUA cho CT monitor, không báo sạch.
  • 正向示例:「扫描 bonbon-ai repo 的安全性」→ 已安装 Trivy → 分别扫描
    be
    、
    fe
    → 发现 2 个 HIGH:
    requirements.txt
    中的
    python-multipart
    + DS-0002 root user → 升级依赖 + 添加
    USER node
    → build 通过 → re-scan 得到
    remaining = NONE
    ;动态扫描中,无 token 的 curl 请求
    /etl/data/stats/all
    返回
    401
    。
  • 边界/失败: Trivy 扫描干净,但直接 curl
    /etl/report/export
    时,无 cookie 的请求返回
    200
    + 工资数据 → 存在 auth-bypass 漏洞;即使 static report 干净,也必须按严重问题报告(RULE-01);
    dig +short
    查询子域名得到 public IP → 「内网」判断错误。
  • 边界: 执行
    supply-watch.py acme
    时 crt.sh 无响应 → CT monitor 显示「跳过」,不得报告为干净。

Origin

来源

  • Absorb 2026-07-17 (adapt_mode: dissolve, T-260717-02): bảng trigger-conditions distill từ
    WorldFlowAI/everything-claude-code
    (
    skills/security-review/SKILL.md
    — When to Activate + 10 nhóm checklist). Clone depth-1 trong scratchpad/, không vendor bytes.
  • 吸收 2026-07-17(adapt_mode: dissolve, T-260717-02): trigger-conditions 表提炼自
    WorldFlowAI/everything-claude-code
    (
    skills/security-review/SKILL.md
    ——When to Activate + 10 组 checklist)。在 scratchpad/ 中执行 depth-1 clone,不 vendor 字节。