# SEC-Z-01 敏感信息扫描报告(Z-01 附件) | 项 | 内容 | |---|---| | 扫描时间 | 2026-11-13 11:45 | | 扫描人 | 周工 | | 结论 | 包内、源码树、构建产物、日志 **全部 0 命中**;历史归档包 6 个含旧凭据,已隔离 | | 模式 | 原口令字面值(大小写不敏感)+ URL 编码形式 `%40` | --- ## 一、扫描范围与结果 | # | 位置 | 类型 | 命中 | |---|---|---|---| | 1 | `候选模型评审包/`(全部文件,含 md / yml / py / json / xml) | 文本 | **0** | | 2 | `候选模型评审包/`(全部文件,**按字节**,含 pyc 等二进制) | 二进制 | **0** | | 3 | `01_后端源码/src` + `pom.xml`(工作目录 `G:/aomin-dev/app/aomin-gateway`) | 文本 | **0** | | 4 | `aomin-gateway-0.0.1-SNAPSHOT.jar` → `BOOT-INF/classes/application.yml` | 二进制 | **0** | | 5 | `target/`(全部,43 MB,构建产物) | 二进制 | **0** | | 6 | `G:/aomin-dev/logs`(全部,6.1 MB) | 二进制 | **0** | | 7 | `_历史包_含旧凭据_禁止外发/`(6 个 zip,**解压后逐成员**) | 文本 | **13~15 处/包,已隔离** | ### 第 7 项明细(历史包) | 文件 | 含旧口令文件数 | |---|---| | 周工_V1.9定点修复包_20261112_上午版.zip | 15 | | 周工_V1.9定点修复包_20261112_第二版.zip | 15 | | 周工_候选模型评审去敏精简包_V1.6_20261111.zip | 13 | | 周工_候选模型评审去敏精简包_V1.8_20261111.zip | 15 | | 周工_候选模型评审去敏精简包_V1.9.1_20261112.zip | 15 | | 周工_候选模型评审去敏精简包_V1.9_20261111.zip | 13 | **处置**:整个目录改名为 `_历史包_含旧凭据_禁止外发`,同目录 `_清单_含旧凭据.md` 登记每个包的字节数与 SHA-256。禁止外发、禁止入代码库、禁止上传公共 AI。 > 这一条要特别说明:**直接对 zip 做字节搜索是查不出来的**,因为成员内容被 deflate 压缩过,第一遍按字节扫全部返回"否",是错的。必须解开逐成员扫。 --- ## 二、复算方法(陈工可原样执行) ```python import os, zipfile SECRET = b"<原口令>" # 自行填入,不要写进任何文件 hits = [] for root in [r"<包根>", r"<源码根>/src", r"<源码根>/target", r"<日志目录>"]: for dp, dn, fn in os.walk(root): for f in fn: p = os.path.join(dp, f) try: if os.path.getsize(p) > 30 * 1024 * 1024: continue if SECRET in open(p, "rb").read(): hits.append(p) except Exception: pass # 压缩包必须解开再扫 for zp in [r"<_历史包>/*.zip"]: import glob for p in glob.glob(zp): with zipfile.ZipFile(p) as z: for nm in z.namelist(): try: if SECRET in z.read(nm): hits.append(p + "!" + nm) except Exception: pass print("命中:", len(hits)) for h in hits: print(" ", h) ``` 判读规则: - **文本命中和字节命中分开看**。只 grep 文本会漏掉 pyc、jar、zip; - **zip / jar 必须解压后扫**,压缩态下的字节搜索没有意义; - 只扫"当前工作副本",不扫 git 历史——**本次交付时尚无 git 仓库**(见下节)。 --- ## 三、盲区声明(扫描覆盖不到什么) | 盲区 | 说明 | |---|---| | Git 历史 | 当前 `G:/aomin-dev/app/aomin-gateway` **不是 git 仓库**,包内也没有 `.git`。所以不存在历史污染;这也是必须在首次 `git init` **之前**完成清理的原因 | | 数据库内部 | 本扫描只查文件。数据库用户表里的口令哈希不属于"明文口令",另行按鉴权设计处理 | | 其他凭据 | 本次只针对 SEC-Z-01 指出的那一处数据库口令。若后续新增 token、AK/SK,需另做一次扫描 | | 聊天记录与截图 | 不在本次范围。已在回执中说明"不得在回复、截图、差异表或本通知中复述原口令" | | 已外发的旧包 | 6 个历史包若曾通过群聊或邮件发出,**接收方副本无法回收**——按 GOV-020 §4.2,这是"检查历史包、受控配置和访问记录"要求的部分,如实列出,不隐瞒 | --- ## 四、轮换结论(要求 Z-01 必须给的一句) **结论:不轮换,但登记为"待确认项",由仇总/陈工判断是否升级。** 理由(如实写,不美化): 1. 该口令是 **评审机本地 MySQL 演示库** 的 `root` 口令(库名 `aomin_dev`),不是生产凭据,也不是任何对外服务的入口; 2. 该库仅监听 `127.0.0.1:3306`,未对公网开放; 3. **但**:它已经进过 6 个历史包,若这些包曾被外发(群聊、邮件、他人机器),则等于该口令已离开本机; 4. 因此本件的表述是:**本地场景不需要轮换;一旦确认历史包曾外发,立即轮换并重跑 155 条**(重跑约 13 分钟,成本可控)。 > 不写"已轮换"——因为确实没换,换了就要重跑全部证据,那是另一件事,不能混在这次清理里糊过去。 --- *扫描与复算脚本、结果均可在本机重现;如需基线比对,见 `03_Z-02_清理后哈希与构建说明.md`。*