按周工交付的 SEC-Z-01 清理后源码建立 M-Z 主干,并按 Git 仓库惯例重排目录。 - aomin-gateway/ 后端工程 87 文件,原样保留,路径与构建命令未变 - demo/ 演示前端与设备模拟器 9 文件(原 02_前端与设备端),非正式三端 - docs/handover/ 交付与安全清理材料 6 份,内容未改 - docs/contract/ J-00 规格、OpenAPI、内部五接口、状态机、Mock 样例 - docs/reference/ 指纹与校验清单,含 84 个源码文件的 sha256 清单 目录重排只动位置不动内容:源码树 84 文件哈希与交付一致,逐文件自校验通过; 12 条 Flyway 迁移与交付包内镜像逐字节一致。 未纳入:迁移镜像目录(与工程内一套重复,改留指纹)、target/、证据 raw、 应急恢复脚本、评审用虚构台账数据。 安全:SEC-Z-01 15 处明文已清零,导入前重新扫描无新增命中,本仓库无历史污染。 行尾按交付字节原样保存(.gitattributes 设 * -text),不做归一化以免整树摘要失效。
5.2 KiB
5.2 KiB
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 压缩过,第一遍按字节扫全部返回"否",是错的。必须解开逐成员扫。
二、复算方法(陈工可原样执行)
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 必须给的一句)
结论:不轮换,但登记为"待确认项",由仇总/陈工判断是否升级。
理由(如实写,不美化):
- 该口令是 评审机本地 MySQL 演示库 的
root口令(库名aomin_dev),不是生产凭据,也不是任何对外服务的入口; - 该库仅监听
127.0.0.1:3306,未对公网开放; - 但:它已经进过 6 个历史包,若这些包曾被外发(群聊、邮件、他人机器),则等于该口令已离开本机;
- 因此本件的表述是:本地场景不需要轮换;一旦确认历史包曾外发,立即轮换并重跑 155 条(重跑约 13 分钟,成本可控)。
不写"已轮换"——因为确实没换,换了就要重跑全部证据,那是另一件事,不能混在这次清理里糊过去。
扫描与复算脚本、结果均可在本机重现;如需基线比对,见 03_Z-02_清理后哈希与构建说明.md。