Files
hepu/docs/handover/02_SEC-Z-01_敏感信息扫描报告.md
T
aomin a7605ef8b8 chore(repo): 导入 M-Z 业务底座 V1.9 基线并建立仓库规范
按周工交付的 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),不做归一化以免整树摘要失效。
2026-11-13 17:32:37 +08:00

5.2 KiB
Raw Blame History

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 必须给的一句)

结论:不轮换,但登记为"待确认项",由仇总/陈工判断是否升级。

理由(如实写,不美化):

  1. 该口令是 评审机本地 MySQL 演示库 的 root 口令(库名 aomin_dev),不是生产凭据,也不是任何对外服务的入口;
  2. 该库仅监听 127.0.0.1:3306,未对公网开放;
  3. 但:它已经进过 6 个历史包,若这些包曾被外发(群聊、邮件、他人机器),则等于该口令已离开本机;
  4. 因此本件的表述是:本地场景不需要轮换;一旦确认历史包曾外发,立即轮换并重跑 155 条(重跑约 13 分钟,成本可控)。

不写"已轮换"——因为确实没换,换了就要重跑全部证据,那是另一件事,不能混在这次清理里糊过去。


扫描与复算脚本、结果均可在本机重现;如需基线比对,见 03_Z-02_清理后哈希与构建说明.md。