Files
hepu/docs/handover/02_SEC-Z-01_敏感信息扫描报告.md
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

114 lines
5.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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`。*