0–5 分钟:map publishers
识别 catalog owner、package maintainer、upstream、image publisher、registry。
成功标准每条 artifact/update path 都有 named trust actor。
Self-hosted App Store 供应链审查 · 更新 2026-07-05
面向 self-hosted app catalogs、community stores、container images、package manifests、install scripts、update channels 与 recovery paths 的供应链审查。
Self-hosted app store 本质上是一条 software supply chain。一个可见 catalog entry 背后可能隐藏 repository ownership、container image tags、lifecycle hooks、install scripts、host mounts、secrets、update behavior、backup hooks 与 rollback constraints。
这份 Review 把 CasaOS、Umbrel、YunoHost、Nextcloud-style app ecosystem 与 containerized apps 当成 trust chain,而不是 convenience layer。核心问题是:谁发布 app、真正运行什么 artifact、安装/更新执行了什么、拿到什么 privilege、如何 backup,以及 package/maintainer account compromise 后如何 recovery。
RepoDaily 判断
不要因为 app 出现在熟悉 catalog 里就直接批准。Review publisher identity、source repo、manifest/lifecycle scripts、exact image/package source、digest/provenance evidence、host mounts、ports、secrets、update path、backup/restore hooks 与 emergency removal/recovery。Community catalog 很有价值,但 catalog inclusion 不能替代 artifact verification 与 operational ownership。
| 供应链层 | 审查问题 | 失败信号 | 证据 |
|---|---|---|---|
| Catalog ownership | 谁控制 listing/review? | Anonymous fork 或 stale maintainer 有 broad publish access | Repo owner、reviewers、release process |
| App source | Listing 是否指向可检查 upstream? | Opaque binary/image 无 source mapping | Source repo 与 release tag |
| Manifest | 声明了哪些 ports、mounts、env、dependencies、permissions? | Broad host mounts 或 hidden dependencies | Manifest diff 与 policy review |
| Lifecycle hooks | Install/start/update/stop/uninstall 跑什么? | Shell hook 下载或修改 host state | Hook source 与 test log |
| Artifact identity | 实际运行哪个 image/package? | Mutable latest tag,无 digest record | Digest、release ID、registry path |
| Provenance | Build origin 能否验证? | Artifact 无法对应 reviewed source/build | Provenance/attestation record |
| Permissions | 获得哪些 host/data/network/secrets access? | Daemon socket、root、broad mounts、unrelated secrets | Privilege/mount inventory |
| Updates | 谁能发布,如何 promotion? | Mutable upstream 自动更新,无 review | Update owner、policy、staged test |
| Backup hooks | Config、DB、app data 是否一致 backup? | Archive 缺少 restore 所需 state | Restore drill result |
| Removal | Uninstall 是否留下 privileged state? | Orphan users/services/tokens/mounts/rules | Post-uninstall audit |
| Compromise recovery | Trust 如何 revoke 并 clean restore? | 唯一方案是重装同一 untrusted app | Blocklist/revoke path 与 clean restore |
先用一个代表性 app 评估 catalog trust model。
| 控制项 | 0 分 | 1 分 | 2 分 | Owner 问题 |
|---|---|---|---|---|
| Publisher identity | Unknown | Known repo owner | Verified maintainer/review path + incident contact | 谁能发布 trusted update? |
| Artifact pinning | latest tag | Version tag | Digest/immutable release + provenance | 同一 version 能否 silent change? |
| Manifest review | Blind install | Manual glance | Policy review ports/mounts/env/capabilities/deps | App 获得什么 privilege? |
| Lifecycle scripts | Unknown | Scripts visible | Hooks reviewed/tested/bounded/diffed | 什么 code 在 app process 外执行? |
| Update governance | Automatic upstream trust | Manual approval | Staged promotion + change review + recovery | Bad update 能扩散多远? |
| Backup integration | None | Files copied | App-consistent backup + clean restore tested | Host loss 后能否 rebuild? |
| Vulnerability response | No owner | Monitor upstream | Advisory intake + patch SLA + disable path + notice | 谁响应 compromised dependency? |
| Removal/recovery | Delete container only | Manual cleanup | Uninstall audit + clean-room recovery | Removal 后还留下什么 trusted state? |
用一个代表性 app 评估 catalog trust model。
识别 catalog owner、package maintainer、upstream、image publisher、registry。
成功标准每条 artifact/update path 都有 named trust actor。
Review ports、mounts、env、capabilities、deps、downloads、lifecycle scripts。
成功标准没有 hidden privilege 或 opaque execution path。
记录 version、registry、digest/immutable release;检查 provenance/SBOM/signature。
成功标准Reviewed artifact 可 exact identify。
观察 new services、files、users、network calls 与 privilege changes。
成功标准Runtime behavior 与 reviewed packaging intent 一致。
运行 supported backup、clean restore、uninstall,并检查 leftovers。
成功标准Recovery works 且 privileged residue 已知。
Disable update path、stop app、preserve evidence、rotate sample secret、选择 trusted recovery artifact。
成功标准Response 不依赖 compromised path。
| 场景 | 主要审查目标 | 停止条件 |
|---|---|---|
| CasaOS community app | Compose/manifest source、image registry、mounts、ports、update owner | Mutable image + broad host access + unclear maintainer |
| Umbrel app | Manifest、dependencies、lifecycle hooks | Hook 下载/执行 unreviewed content 或 update silent privilege change |
| YunoHost packaged app | Install/upgrade/backup/restore/remove scripts 与 maintenance | Backup/restore 缺失或 scripts unpredictable host mutation |
| Nextcloud app ecosystem | Publisher、compatibility、permissions、update channel、data migration | Update 无 rollback/restore path |
| Containerized media app | Image digest、volumes、users、media mounts、provider secrets | App 需要 entire storage tree write 或 daemon socket |
| Community app-store fork | Store owner、review、upstream sync、credential ownership | Fork 暗示 official 或无 patch/advisory process |
| Emergency zero-day | Disable update/install、isolate app、rotate secrets、verify clean artifact | 继续从 suspected publisher path auto-update |
用户信任 platform 后,可能无意识地把信任扩展给每个 package maintainer、image publisher 与 update path。
Version/latest tag 之后可能指向不同 bytes;reviewed deployments 应在可行时记录 immutable digest。
Install/update hooks 可在 normal app runtime 外执行 privileged host mutation。
方便的 app template 可能给 app 整个 host directories、Docker socket、backup 或 unrelated app data 的写权限。
Publisher account compromise 或 bad package 在 catalog change/mutable tag 自动 promotion 时会快速扩散。
Packaging 里有 backup command 不代表 DB、config、uploads 与 identity 能一致 restore。
Upstream 健康不代表 stale package 安全;manifest、image 或 upgrade script 可能无人维护。
删除 visible app 可能留下 users、services、scheduled tasks、tokens、firewall rules、mounts 或 helper state。
把 platform、catalog、packager、upstream、image publisher、registry 作为独立 trust actors 记录。
Update promotion 前 review mounts、ports、env、capabilities、hooks、image source 与 dependencies 的变化。
记录 tested image digest 或 immutable release artifact,即使 user-facing config 保留 version tag。
在 disposable host 完成 install、update、backup、restore、uninstall,并记录 created state/network behavior。
Root、host networking、daemon sockets、devices、broad mounts、unrelated secrets 都作为 exception,需要 written justification。
保留 disable 单 app install/update 的 path,不影响 unrelated entries,也不删除 forensic evidence。
面向 self-hosted catalog operators/users 的简短回答。
不自动。Official review 可降低风险,但仍需理解谁 packaging、运行什么 artifact、拿到什么 privilege,以及 update/recovery 如何工作。
Digest 标识 exact image bytes,而 tag 可以移动;digest evidence 能证明 review/deploy 的具体 artifact。
通常不是。Manifest 可定义 ports、mounts、dependencies、env、image source 与 lifecycle behavior,是 security boundary 的一部分。
Manifest changes、lifecycle scripts、image source/digest、new privileges、data migration、backup compatibility 与 maintainer/repo changes。
Trust transitivity:用户信任 platform 后,把 trust 自动扩展给每个 packager、publisher 与 update path。
Stop distribution、isolate instances、preserve evidence、rotate secrets、用 clean trusted artifacts/data restore,然后 deliberate reopen updates。
Feedback
匿名反馈只用于判断内容是否真正有用。