orca-sec-scans
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseSkill: 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 ); 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).
.trivyignore
- 目的: 一套 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(接受后写入 );不将 report commit 到部署服务器;不开展 cti-expert 那种大范围外部威胁调查(仅采用 supply-watch keyless 片段)。
.trivyignore
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 NONEgiả định dev → request thật (curl/dig/git diff) → xác nhận hoặc lỗ hổngtên thương hiệu → biến thể tất định → DNS sống + CT log是否已有 Trivy? → scope(lockfile) → static 扫描 HIGH/CRITICAL → JSON+HTML 报告 → 汇总 + 修复建议 → re-scan NONE开发者假设 → 真实请求(curl/dig/git diff)→ 确认或发现漏洞品牌名称 → 确定性变体 → 存活 DNS + CT logInput và output contract
输入与输出约定
| Field | Required? | Ý nghĩa | |
|---|---|---|---|
| In | thư mục mã nguồn (be, fe hoặc | có | target quét; |
| In | HOST / domain đang chạy | cho quét động | để curl/dig kiểm chứng thật |
| In | tên thương hiệu | không | cho |
| Out | | có | report đầy đủ, chỉ là artifact review |
| Out | bảng HIGH/CRITICAL theo target + đề xuất fix | có | bump deps, USER non-root, xoay secret |
| Out | kết quả quét động | có | từng giả định: đúng/sai kèm lệnh + mã HTTP/DNS thật |
| Out | kết quả re-scan | khi có fix | |
| Out | báo cáo supply-watch | tuỳ chọn | rc 0 sạch, 2 có phát hiện; crt.sh lỗi → BỎ QUA |
| 字段 | 必需? | 含义 | |
|---|---|---|---|
| In | 源码目录(be、fe 或 | 是 | 扫描目标;如果 repo 中有 |
| In | 正在运行的 HOST / domain | 动态扫描时需要 | 用于通过 curl/dig 进行真实验证 |
| In | 品牌名称 | 否 | 用于 |
| Out | | 是 | 完整 report,仅作为 review artifact |
| Out | 按 target 汇总的 HIGH/CRITICAL 表 + 修复建议 | 是 | 升级依赖、使用非 root 的 USER、轮换 secret |
| Out | 动态扫描结果 | 是 | 每项假设:正确/错误,并附命令及真实 HTTP/DNS 状态码 |
| Out | re-scan 结果 | 应用修复后需要 | |
| Out | supply-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 (1 ID/dòng + comment lý do + ngày), KHÔNG xoá khỏi report.
.trivyignore - RULE-05 (MUST): Không commit lên server deploy — chỉ là artifact review.
security/*.json|html - RULE-06 (MUST): Khi deploy bonbon-ai: chỉ push và
be(2 submodule) lên server; tooling (trivy.yaml, security/, skill) không lên server.fe - 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 → 写入 (每行一个 ID + 原因注释 + 日期),不要从 report 中删除。
.trivyignore - RULE-05(必须):不要将 commit 到部署服务器——它们仅是 review artifact。
security/*.json|html - RULE-06(必须):部署 bonbon-ai 时,只 push 和
be(两个 submodule)到服务器;tooling(trivy.yaml、security/、skill)不上传服务器。fe - 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 ./...) → failed, không commit.pnpm i - 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 ./...)→ failed,不得 commit。pnpm i - 没有 HOST 可用于动态扫描 → partial:仅执行 static 扫描,明确说明动态层尚未运行,不得得出「安全」的结论。
- Secret 被标记 → 立即轮换 key,不能只从文件中删除。
- supply-watch 无法调用 crt.sh → 跳过,不得判定为干净。
HOW
如何执行
Main workflow
主工作流
| Step | Type | Inputs | Action | Outputs/exit | Failure/next |
|---|---|---|---|---|---|
| W01 | effect | máy | Bước 0 — Check + Install Trivy (BẮT BUỘC chạy trước) | | cài lỗi → blocked |
| W02 | deterministic | repo | Bước 1 — Detect ngôn ngữ qua lockfile, bỏ thư mục build/vendor | scope | — |
| W03 | deterministic | scope | Bước 2 — Quét vuln + misconfig + secret, HIGH/CRITICAL trước | findings | — |
| W04 | deterministic | findings | Bước 3 — Xuất report JSON + HTML vào | 2 file report | — |
| W05 | judgment | findings | Bước 4 — Tóm tắt HIGH/CRITICAL theo target + đề xuất fix | bảng + đề xuất | submodule bẩn → chỉ đề xuất |
| W06 | deterministic | target đã fix | Bước 5 — Re-scan xác nhận | | còn → quay W05 |
| W07 | effect | HOST, diff | Quét ĐỘNG: chạy checklist 8 giả định dev bằng request thật | từng giả định có bằng chứng | không HOST → partial |
| W08 | deterministic | tên thương hiệu | Quét RA NGOÀI bằng | rc 0 hoặc 2 | crt.sh lỗi → BỎ QUA |
Chi tiết từng bước (nguồn chân lý cho W01–W08):
| 步骤 | 类型 | 输入 | 操作 | 输出/退出状态 | 失败/下一步 |
|---|---|---|---|---|---|
| W01 | effect | 机器 | 第 0 步——检查并安装 Trivy(必须先执行) | 输出 | 安装失败 → blocked |
| W02 | deterministic | repo | 第 1 步——通过 lockfile 检测语言,排除构建目录/vendor | scope | — |
| W03 | deterministic | scope | 第 2 步——扫描 vuln + misconfig + secret,优先处理 HIGH/CRITICAL | findings | — |
| W04 | deterministic | findings | 第 3 步——将 JSON + HTML report 输出到 | 2 个 report 文件 | — |
| W05 | judgment | findings | 第 4 步——按 target 汇总 HIGH/CRITICAL + 修复建议 | 表 + 建议 | submodule 存在未提交更改 → 仅建议 |
| W06 | deterministic | 已修复的 target | 第 5 步——执行 re-scan 验证 | | 仍有发现 → 返回 W05 |
| W07 | effect | HOST、diff | 动态扫描:通过真实 request 执行 8 项开发者假设清单 | 每项假设均有证据 | 无 HOST → partial |
| W08 | deterministic | 品牌名称 | 使用 | rc 0 或 2 | crt.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 đầubash
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 đầuBước 1 — Detect ngôn ngữ (scope quét)
第 1 步——检测语言(扫描 scope)
Tìm lockfile để biết hệ sinh thái: / (Go), / (Node), / (Python). Bỏ qua , , , , .
go.sumgo.modpackage-lock.jsonpnpm-lock.yamlrequirements.txtpoetry.locknode_modules.next.contentlayer_archives.git查找 lockfile 以识别技术生态:/(Go)、/(Node)、/(Python)。排除 、、、、。
go.sumgo.modpackage-lock.jsonpnpm-lock.yamlrequirements.txtpoetry.locknode_modules.next.contentlayer_archives.gitBướ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-progressRepo bonbon-ai: quét riêng và (mỗi cái là submodule). Ưu tiên nếu repo đã có.
befe--config trivy.yamlbash
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:分别扫描 和 (每一个都是 submodule)。如果 repo 已有配置,优先使用 。
befe--config trivy.yamlBướ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.htmlbash
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.htmlBướ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 trong
python-multipart.requirements.txt - Dep indirect: rồi
go get <pkg>@<ver>verify. Lưu ýgo build ./...có thể nâng directivego get; nếu vượt base image trong Dockerfile thì bump luôngocho khớp.FROM golang:X-alpine - Misconfig DS-0002 (root user): thêm non-root vào Dockerfile (
USERalpine,adduser -Ddebian, hoặcuseradd -mcho image node-alpine; nhớUSER nodethư mục ghi như volume/data).chown - 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 getdirective;如果新版本超过 Dockerfile 中基础镜像所带的版本,则同步升级go以保持一致。FROM golang:X-alpine - Misconfig DS-0002(root user):在 Dockerfile 中添加非 root 的 (Alpine 使用
USER,Debian 使用adduser -D,node-alpine 镜像可使用useradd -m;记得对 volume/data 等可写目录执行USER node)。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 = NONEQué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-testSinh 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 (→, →), 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á.
o0l1Không cần API key, không cần . Mã thoát: sạch · 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.
.venv02Hấp thụ hẹp từ(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ần7onez/cti-expert+ 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..venv
上述两个部分都只检查项目内部,无法发现有人注册与你名称相近的 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 键盘)、使用相似字符(→、→)、添加连字符——然后查询 DNS,判断哪些变体仍然存活。同时使用 CT monitor 读取 Certificate Transparency(crt.sh),检查近期是否有名称相近的 domain 获得证书。
o0l1不需要 API key,也不需要 。退出码: 表示干净, 表示存在发现。无法调用 crt.sh 时,它会显示跳过,不会判定为干净。
.venv02从(workflow 08)中窄范围吸收。刻意仅提取此片段:cti-expert 包含 121 个 op + 78 个 MCP tool,用于外部威胁调查,需要7onez/cti-expert+ API key + outbound 网络。整块合并会把 key/网络依赖引入一个本应 keyless 且可离线运行的端口。.venv
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 qua nginx đi vòng qua) → ai cũng lấy được lương + PII 3.637 NV; tưởng "nội bộ" nhưng có domain public (IP public) bắc cầu ra cả internet. Trivy không phát hiện — chỉ / thật mới ra.
/etlcurldevtingting.coteccons.vncurldig原则:Trivy(static)无法发现架构/逻辑/runtime 配置问题。 最严重的漏洞通常隐藏在开发者的默认假设中——必须使用真实请求进行验证,不能相信口头说法。「能够运行」≠「安全」。
源自 2026/06/22 的事故:payroll ETL API 没有 auth(auth 只在 web 层,nginx 中的 路径绕过了它)→ 任何人都能通过 获取工资数据 + 3,637 人的 PII;人们以为它属于「内网」,但它拥有 public domain (public IP),通过互联网形成桥接。Trivy 无法检测到该问题——只有实际执行 / 才能发现。
/etlcurldevtingting.coteccons.vncurldigChecklist "ĐỪNG TIN — phải kiểm chứng" (dev assumption → thực tế → cách verify)
「不要相信——必须验证」清单(开发者假设 → 实际情况 → 验证方式)
-
"API sau reverse proxy được bảo vệ vì web/UI có login." → SAI: auth thường chỉ ở tầng web; path proxy (,
/etl...) browser gọi thẳng nên đi VÒNG qua login. → Verify:/apiTHẲNG từng route API không kèm cookie/token → phảicurl. Nếu401+data = lỗ hổng. Auth phải ở tầng API/proxy (vd nginx200), KHÔNG chỉ ở UI.auth_requestbashfor 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 -
"Server nội bộ / IP private (192.168.x) nên ngoài không vào được." → SAI: một public domain // port-forward có thể bắc cầu vào. → Verify:
tailscale funnel→ có IP public không? Thử curl từ mạng ngoài. KHÔNG tin "nội bộ" — kiểm DNS thật.dig +short <mọi subdomain khả dĩ> -
"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/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.
curl -
"Config mặc định để nguyên là ổn." → Check biến default lọt prod:còn
CORS_ORIGINS? secret/flag còn giá trị mẫu?localhost:3000vô tìnhBIND_HOST?0.0.0.0bashcurl -k -D- -o /dev/null -H "Origin: http://localhost:3000" https://HOST/etl/health | grep -i access-control -
"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 (vdtrong compose →
networks:, deploy fail). → Verify: branch CI clone == branch đang chạy?undefined network.git diff <ci-branch> <running-branch> -- docker-compose.yml .env* deploy/ -
"paramiko/SSH kết nối được là xong." →/
Transport(...)KHÔNG verify host key → MITM đánh cắp pass + file. Verify: phải pin known_hosts +AutoAddPolicy.RejectPolicy -
"Token/secret truyền sao cũng được." → Token trong URL→ vào nginx/uvicorn access-log, Referer, history. Verify: secret đi qua header/cookie, KHÔNG qua query string.
?token= -
"cho tiện." → Trả mọi cột gồm PII (CCCD/MST/BHXH/lương) +
SELECT *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.search
-
「API 位于 reverse proxy 之后,因为 web/UI 有 login,所以受到保护。」 → 错误:auth 通常只存在于 web 层;浏览器调用的 proxy path(如、
/etl)可能绕过 login。 → 验证:使用不带 cookie/token 的/api直接请求每个 API route → 必须返回curl。如果返回401+ data,则存在漏洞。Auth 必须位于 API/proxy 层(例如 nginx200),不能只存在于 UI。auth_requestbashfor 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 -
「服务器属于内网 / 使用 private IP(192.168.x),所以外部无法访问。」 → 错误:public domain、或 port-forward 都可能将服务桥接至外部。 → 验证:执行
tailscale funnel→ 是否得到 public IP?从外部网络尝试 curl。不要相信「内网」的说法——必须检查真实 DNS。dig +short <所有可能的子域名> -
「开放 CORS 就是漏洞 / 关闭 CORS 就足够安全。」 → 方向错误:CORS 只阻止 browser 读取 cross-origin 内容。它不阻止/script,也不阻止 CSRF 写入(采用 POST query-param / 无 body 的 simple request → 不触发 preflight → 无论 CORS 配置如何,server 都会执行)。真正的问题通常是 no-auth + 开放端口。在 auth 这道门尚未锁好时,不要浪费时间处理 CORS。
curl -
「保留默认 config 没问题。」 → 检查泄漏到生产环境的 default 变量:中是否仍包含
CORS_ORIGINS?secret/flag 是否仍使用示例值?localhost:3000是否意外设置为BIND_HOST?0.0.0.0bashcurl -k -D- -o /dev/null -H "Origin: http://localhost:3000" https://HOST/etl/health | grep -i access-control -
「无论部署哪个 branch,结果都一样。」 → 错误:CI(Jenkins)clone branch X,但 server 运行 branch Y → 两者不一致。Merge conflict 甚至可能意外删除整个 block(例如 compose 中的→
networks:,导致 deploy 失败)。 → 验证:CI clone 的 branch 是否等于正在运行的 branch?执行undefined network。git diff <ci-branch> <running-branch> -- docker-compose.yml .env* deploy/ -
「paramiko/SSH 能够连接就足够了。」 →/
Transport(...)不会验证 host key → 可能遭遇 MITM,密码和文件被窃取。验证:必须 pinAutoAddPolicy并使用known_hosts。RejectPolicy -
「Token/secret 无论通过什么方式传输都可以。」 → URL 中的 token()会进入 nginx/uvicorn access-log、Referer 和 history。验证:secret 应通过 header/cookie 传输,不能放在 query string 中。
?token= -
「为了方便而使用。」 → 会返回所有列,包括 PII(CCCD/MST/BHXH/工资),而全列
SELECT *还会成为探测数值的 oracle。验证:使用返回列的 whitelist;search 不得扫描敏感列。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ừ security-review):
WorldFlowAI/everything-claude-code| Thay đổi vừa làm | Bắt buộc | Vì sao |
|---|---|---|
| Thêm/sửa auth, session, phân quyền | Trivy + quét động | Token để 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 động | Input 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 key | Trivy (secret scan) | Key hardcode trong source hoặc lọt git history — phải ở env var và platform secret, |
| Mở API endpoint mới | Trivy + quét động | Endpoint 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ảm | Trivy + quét động + review tay | PII/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 proxy | Quét động | Lỗ 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 义务(提炼自 的 security-review):
WorldFlowAI/everything-claude-code| 刚完成的更改 | 必须执行 | 原因 |
|---|---|---|
| 添加或修改 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 key | Trivy(secret scan) | Key 被硬编码进 source 或进入 git history——应放入 env var 和 platform secret,且 |
| 新增 API endpoint | Trivy + 动态扫描 | 新 endpoint 默认缺少 rate-limit + CSRF + 权限检查;error message 也容易泄露内部细节/stack trace。 |
| 支付 / 敏感数据 | Trivy + 动态扫描 + 人工 review | PII/资金不能写入 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
分支
| ID | Kind | Guard | Hành vi | Skip / failure | Rejoin |
|---|---|---|---|---|---|
| B01 | conditional_required | repo bonbon-ai | quét riêng | repo khác → quét | W04 |
| B02 | conditional_required | repo đã có | ưu tiên | không có → cờ skip-dirs mặc định | W04 |
| B03 | user_optional | user muốn soi chuỗi cung ứng / thương hiệu | | không yêu cầu → skip | kết thúc |
| B04 | conditional_required | finding đã review và chấp nhận | ghi | — | W06 |
| B05 | conditional_required | Trivy flag secret | xoay key ngay, không chỉ xoá khỏi file | — | W06 |
| ID | 类型 | 条件 | 行为 | 跳过/失败 | 汇合点 |
|---|---|---|---|---|---|
| B01 | conditional_required | repo 为 bonbon-ai | 分别扫描 | 其他 repo → 扫描 | W04 |
| B02 | conditional_required | repo 已有 | 优先使用 | 不存在 → 使用默认 skip-dirs 标志 | W04 |
| B03 | user_optional | 用户希望检查供应链/品牌 | 执行 | 用户未要求 → 跳过 | 结束 |
| B04 | conditional_required | finding 已经 review 并被接受 | 写入 | — | W06 |
| B05 | conditional_required | Trivy 标记出 secret | 立即轮换 key,不能只从文件中删除 | — | W06 |
Validation và stopping
验证与停止条件
Tất định: rc/output của Trivy (re-scan ), mã HTTP thật của curl (route API không token phải ), thật, branch, rc . Fix chỉ commit sau build/verify xanh. Cần người: quyết chấp nhận finding vào , 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.
remaining = NONE401diggit diffsupply-watch.py.trivyignore确定性验证包括:Trivy 的 rc/output(re-scan 时为 )、curl 的真实 HTTP 状态码(无 token 的 API route 必须返回 )、真实的 结果、branch 间的 ,以及 的 rc。修复只有在 build/verify 通过后才能 commit。需要人工介入的情况:决定是否将 finding 接受到 ,以及人工 review 支付/敏感数据流程。当 re-scan 干净且清单中的每项假设都有证据时停止;不能仅凭 Trivy 结果得出「安全」的结论。
remaining = NONE401diggit diffsupply-watch.py.trivyignoreExamples
示例
- Positive: "quét bảo mật repo bonbon-ai" → Trivy đã có → quét riêng ,
be→ 2 HIGH:fetrongpython-multipart+ DS-0002 root user → bump dep + thêmrequirements.txt→ build xanh → re-scanUSER node; quét động curlremaining = NONEkhông token ra/etl/data/stats/all.401 - Boundary/failure: Trivy sạch nhưng curl thẳng không cookie trả
/etl/report/export+ dữ liệu lương → lỗ hổng auth-bypass, báo nặng dù report static sạch (RULE-01);200subdomain ra IP public → "nội bộ" là sai.dig +short - Boundary: khi crt.sh không phản hồi → in BỎ QUA cho CT monitor, không báo sạch.
supply-watch.py acme
- 正向示例:「扫描 bonbon-ai repo 的安全性」→ 已安装 Trivy → 分别扫描 、
be→ 发现 2 个 HIGH:fe中的requirements.txt+ DS-0002 root user → 升级依赖 + 添加python-multipart→ build 通过 → re-scan 得到USER node;动态扫描中,无 token 的 curl 请求remaining = NONE返回/etl/data/stats/all。401 - 边界/失败: Trivy 扫描干净,但直接 curl 时,无 cookie 的请求返回
/etl/report/export+ 工资数据 → 存在 auth-bypass 漏洞;即使 static report 干净,也必须按严重问题报告(RULE-01);200查询子域名得到 public IP → 「内网」判断错误。dig +short - 边界: 执行 时 crt.sh 无响应 → CT monitor 显示「跳过」,不得报告为干净。
supply-watch.py acme
Origin
来源
- Absorb 2026-07-17 (adapt_mode: dissolve, T-260717-02): bảng trigger-conditions distill từ (
WorldFlowAI/everything-claude-code— When to Activate + 10 nhóm checklist). Clone depth-1 trong scratchpad/, không vendor bytes.skills/security-review/SKILL.md
- 吸收 2026-07-17(adapt_mode: dissolve, T-260717-02): trigger-conditions 表提炼自 (
WorldFlowAI/everything-claude-code——When to Activate + 10 组 checklist)。在 scratchpad/ 中执行 depth-1 clone,不 vendor 字节。skills/security-review/SKILL.md