zkmkarlsruhe/artwork-autopsy

GitHub: zkmkarlsruhe/artwork-autopsy

ZKM 开发的原生数字艺术品自动分析服务,通过确定性静态分析结合可选的 LLM 分析师,生成作品的身份识别、运行环境需求与复苏方案。

Stars: 0 | Forks: 0

# 艺术品解剖 [![ZKM](https://img.shields.io/badge/ZKM-Karlsruhe-blue)](https://zkm.de) [![ZKM 开源](https://img.shields.io/badge/ZKM-Open%20Source-blue)](https://github.com/zkmkarlsruhe) [![许可证:MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE) 一个自动化分析服务,它能切入未知、无文档的原生数字艺术品,弄清它是什么、运行它需要什么,以及如何让它重现生机。 ## 概述 `artwork-autopsy` 接收一件原生数字艺术品(zip、磁盘映像或散乱的文件包),并生成 一份具体且可操作的**如何让它重现生机**的提案——它是什么、里面有什么内容、 *入口点*在哪里、它需要哪种遗留 runtime/OS、它连接的网络主机,以及 该使用哪些工具来处理它。它会生成一份报告、一份复苏运行手册以及一组建议。 本项目在**卡尔斯鲁厄艺术与媒体中心(ZKM)**开发,用于原生数字艺术的保护—— 这些作品依赖于过时的操作系统、浏览器插件或多媒体引擎(Flash、 Director/Shockwave、早期的 Java–QuickTime、原生的 Win32/Mac 二进制文件)。它是 遗留 VM 工作台(`research-vm-controller` —— *已在规划路线图中,尚未发布*)前端的 接收/分流大脑,但它**完全独立**:即使没有任何此类基础设施,你也可以运行、测试并使用它。 ## 快速开始 **前置条件:**Docker + Docker Compose。一个**兼容 OpenAI 的 LLM endpoint**是*可选的* —— 如果没有配置,你将获得完整的确定性报告(见下文);如果配置了,你还会获得 AI 分析师, 因此请将其指向一个真正擅长工具调用的模型(LiteLLM 代理、OpenAI 或任何本地的 `/v1` 服务器)。 ``` # 获取代码 — 递归地 clone SUPERSET,而不仅仅是这个 repo。 # 该 compose stack 从一个 SIBLING submodule # (../wayback-mcp) 构建 side-car (wayback-mcp),因此 autopsy 需要其 siblings 存在。该 superproject # 会为你放置它们: git clone --recurse-submodules vmctl && cd vmctl/artwork-autopsy # 配置 seams cp .env.example .env # 按原样工作:默认 key `sk-nokey` 仅运行 deterministic-only(无 LLM,无网络调用)。 # 若要同时运行 AI analyst,请在 .env 中设置一个可达的 endpoint 和真实的 key: # AUTOPSY_LLM__BASE_URL=https://your-endpoint/v1 # AUTOPSY_LLM__API_KEY=sk-... # (capability→alias 名称 — analysis/fast、analysis/agent、… — 必须在该 endpoint 上存在。) # 启动 stack — 默认为 db (Postgres) + api + runner。 # (decompiler / RE side-cars 受 profile 限制:请为它们添加 `--profile re --profile sidecars`; # 如果没有它们,每个 deep-reader 将降级为带标记的 note — 这是预期行为。) docker compose up -d --build # 提交一个 born-digital work。本 repo 中提供了一个现成的示例: curl -F file=@examples/sample-netart.zip -F mode=intake http://localhost:8099/jobs # -> {"job_id":"job-…","status":"queued"} (或使用你自己的 zip / disc image / bundle) # 查看它并阅读 report # web UI: http://localhost:8099/ui/jobs/ (渲染后的 report 页面 + 实时进度) # 或 API: GET http://localhost:8099/jobs/ (status + verdict) # GET http://localhost:8099/jobs//artifacts (JSON: kb, runbook, suggestions) # (这些 JSON artifacts 包含与渲染后的 report 页面相同的 findings。) ``` **没有 LLM endpoint?**这是默认情况。使用 `sk-nokey` 时,Docker 作业会运行完整的确定性 核心(解包、格式识别、run-graph、入口点、死掉的 endpoint 标记)并快速生成完整报告 —— AI 分析师阶段会被干净利落地跳过(没有调用,没有超时)。设置真实的 endpoint 和 key 即可启用分析师。 **连 Docker 也没有 —— 本地静态分析流程:** ``` # 需要 Python >=3.13 和 poetry (https://python-poetry.org/docs/#installation) poetry install # add -E drive only for the vmctl-core drive integration poetry run autopsy analyze --no-llm examples/sample-netart.zip ``` 这将在本地运行解包 + 格式/依赖/runtime 检测 + run-graph,并打印出 结构化的事实 —— 与 agent 构建时使用的静态核心完全相同,但不包含 AI 分析师。 LLM endpoint、存储(本地磁盘或 S3/MinIO)以及 side-car 工具都是**可配置接口** (`.env` / `config.toml`)—— 有关所有配置开关及如何运行 反编译器 side-car,请参阅 [`CONTRIBUTING.md`](CONTRIBUTING.md)。状态(Postgres 作业存储 + `/state` 产物) 存在于**在 `up`/`down` 之间持久化的命名 Docker 卷中** —— 要全新启动,请运行 `docker compose down -v`。 ## 立场:访问优先,不拘小节 这关乎的是**重新展示,而非毕恭毕敬地保存**。我们使用任何工具,深入剖析 文件,并接受一定程度的损失,前提是这能让作品*运行并能够再次展出*。这是 所有真正让老旧交互式媒体保持活力的人(Internet Archive、Rhizome、demoscene、abandonware) 都在采用的、经过验证的主流做法。我们从那个世界保留了两条规则: 1. **绝不破坏原件。**原始文件包将原封不动地保存;我们所做的一切都是 派生的访问副本。 2. **标记我们的推测。**每一个自动化的发现都是容易出错的提案,都会被标记为推测, 供人类决定是否接受 —— 绝不静默应用。 ## 工作原理(pipeline) **确定性的静态分析流程为 run-graph 提供数据;agent 分析师会对其进行调查,直到作品** **被完全理解。**事实累积在图上;由 LLM 进行判断,它从不进行提取。 1. **接收** —— 文件到达(Web 上传 / API / Postgres 作业存储),按原样存储。 2. **静态核心**(无 LLM) —— 解包(支持分支感知),构建文件树,识别格式 (Siegfried/magika),提取 metadata,解析二进制文件,检测 + 分发 runtime 模块。 快速预览流程进行初步定位。规模上限机制可防止包含数千个文件的包发生爆炸式膨胀 (有上限且被记录,绝不静默截断)。输出:标记为 host/guest/network 的结构化事实包。 3. **Run-graph** —— 这些事实成为一等公民图:类型化的节点(entry/binary/runtime/data/ config/network)+ 边(imports/reads/contains/connects)。有针对性的**深度阅读**(基于 runtime 的 反编译器,通过 pyghidra-mcp 调用 Ghidra 作用于原生二进制节点)将恢复出的源码持久化到 磁盘上。发现的结果依附于节点 —— 每轮不会重复生成。 4. **分析师会话循环** —— 一名 pydantic-ai 调查员(专属的 **AGENT** 层级)以确定性的 线索为种子,利用导航 / 图 / 提取工具对艺术品本身进行测绘。它会一直运行 **直到解决或达成一致性**(默认没有步骤或 token 上限 —— 包含 300 个 endpoint 的作品会审查所有 300 个),仅受协作式取消及其自身一致性判断的限制; 死亡/未完成的会话会重试(≤ 3 次),并以部分报告作为种子重新启动。**network-scope** **门控**可防止它误入不透明的 runtime 内部,而**处于循环中的** 研究员可以在运行期间回答分析师的问题或提供指导 —— 正是这种循环检查引导它 绕过死胡同,走向真正的工作。已失效的后端会获得一份 **wayback prognosis**(捕获/从 存档中提供的提案)。 5. **综合 + 报告** —— 该图投影为 `IntakeReport` 以及三份工件: 结论、文件树、入口点、runtime/依赖情况、复苏运行手册、建议的 base-VM + 工具集。这是一个提案,绝不自动应用。 ## 两个任务,一个引擎 - **艺术品接收** —— 针对未知作品的上述 pipeline。 - **工具群扩充** —— 将相同的引擎指向已知遗留 runtime 工具的目录,以 自动填充它们的 metadata(模型提出建议 → 人类审查)。 ## 结构 - **独立或嵌入式。**作为独立服务运行;rvmc(或其他任何东西)只是一个 API 客户端。提供一个简单的 **Web UI** 供手动使用(在 fleet 模式下可禁用),并基于 同一个核心为 agent 提供 **REST API**。 - **异步** —— 一个带有子进程作业运行器的 **Postgres 作业存储**;每个作业都在 自己的子进程中独立运行,并带有心跳存活检测和实时进度事件。扩展方式 = 增加 runner 副本。 - **可插拔接口** —— LiteLLM endpoint(独立运行 *或* 作为 fleet 网关),对象存储 (S3/MinIO,可降级为本地磁盘),均可通过配置切换。 - **分层模型** —— 用于快速预览/分类定位的快速层级,以及专属的用于分析师调查员的 **agent** 层级,通过别名(`analysis/fast` · `analysis/think`)命名,绝不使用 原始模型 ID。 ## 状态 独立的基础框架、Postgres 作业编排器、确定性静态核心、run-graph、runtime 模块框架(包含 17 个模块)、各个 runtime 的深度阅读器以及 agent 分析师(支持 human-in-the-loop 聊天)均已构建完成。Web / net.art 组合模块以及对分析师进行语料库 A/B 验证的工作仍在进行中。有关已发布 / 进行中 / 待完善的内容,请参阅 [**路线图**](ROADMAP.md),并查看源自 git 的 [**时间轴**](docs/TIMELINE.md) 以了解具体功能的落地时间(`make timeline` 可从 `git log` 重新生成它)。 ## 贡献一个模块 系统每学会一个 runtime 就会变得更加敏锐。一个 **runtime 模块**就是贡献的单元 —— 在通常情况下,它仅仅是 **数据**:在 [`src/autopsy/runtime/runtime-catalog.yaml`](src/autopsy/runtime/runtime-catalog.yaml) 中添加一个条目,描述如何检测一个 runtime、它暗示了哪个 时代 → base-VM、有序的保护配方、重新运行它的引擎、决定其身份的保真度风险,以及它失效的服务器。你也可以选择添加一个 **深度阅读器** (`src/autopsy/reason/.py`)以及一个 **side-car Dockerfile**,以便真实的反编译器能够从该 runtime 的容器中恢复行为。 模型是 **polyrepo(多仓库)的,模块通过 PR 在仓库内部贡献** —— 添加文件,提交一个 pull request, 分发器就会自动处理。从这里开始: Bug 报告和新模块提案使用结构化的 issue 模板(不再有“它坏了”这种模糊描述) —— 打开一个 issue 即可查看它们。 ## 文档地图 | 文档 | 内容说明 | |---|---| | [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) | 系统一览 —— 一张 Mermaid 图表 + 如何阅读它 | | [`docs/DESIGN.md`](docs/DESIGN.md) | 完整计划:立场、静态↔AI pipeline、三份工件、构建计划 | | [`docs/STRUCTURAL_LOOP.md`](docs/STRUCTURAL_LOOP.md) | 由 run-graph 驱动的定向分析循环 | | [`docs/ENGINEERING.md`](docs/ENGINEERING.md) | 工程宪章(端口与适配器,import-ban) | | [`src/autopsy/runtime/runtime-catalog.yaml`](src/autopsy/runtime/runtime-catalog.yaml) | Runtime 模块数据(新 runtime 的存放处) | | [`docs/CONTRIBUTING-MODULES.md`](docs/CONTRIBUTING-MODULES.md) | 添加 runtime 模块 —— 分步指南、完整示例、模板 | | [`docs/design/`](docs/design/) | Runtime 模块、检测阶梯、工具库、分类器 + 指纹、agent 调查设计 | | [`ROADMAP.md`](ROADMAP.md) · [`CONTRIBUTING.md`](CONTRIBUTING.md) · [`docs/TIMELINE.md`](docs/TIMELINE.md) | 方向 · 如何提供帮助 · 构建历史 | ## 许可证 MIT —— 详见 [`LICENSE`](LICENSE)。© 2026 Marc Schütze @ ZKM | 卡尔斯鲁厄艺术与媒体中心。 这是一个 **ZKM 开源项目**,vmctl 家族的一部分,由 Marc Schütze 作为首席研究员领导。
标签:Docker, 安全防御评估, 数字艺术保护, 数字遗产, 版权保护, 自动化分析, 请求拦截, 跨站脚本, 逆向工具