Self-hosted App Store 供应链审查 · 更新 2026-07-05

App Store Supply Chain Review:Catalog Trust、Manifests、Lifecycle Hooks、Image Digests、Provenance、Permissions、Backup Hooks、Updates 与 Recovery

面向 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 accessRepo owner、reviewers、release process
App sourceListing 是否指向可检查 upstream?Opaque binary/image 无 source mappingSource repo 与 release tag
Manifest声明了哪些 ports、mounts、env、dependencies、permissions?Broad host mounts 或 hidden dependenciesManifest diff 与 policy review
Lifecycle hooksInstall/start/update/stop/uninstall 跑什么?Shell hook 下载或修改 host stateHook source 与 test log
Artifact identity实际运行哪个 image/package?Mutable latest tag,无 digest recordDigest、release ID、registry path
ProvenanceBuild origin 能否验证?Artifact 无法对应 reviewed source/buildProvenance/attestation record
Permissions获得哪些 host/data/network/secrets access?Daemon socket、root、broad mounts、unrelated secretsPrivilege/mount inventory
Updates谁能发布,如何 promotion?Mutable upstream 自动更新,无 reviewUpdate owner、policy、staged test
Backup hooksConfig、DB、app data 是否一致 backup?Archive 缺少 restore 所需 stateRestore drill result
RemovalUninstall 是否留下 privileged state?Orphan users/services/tokens/mounts/rulesPost-uninstall audit
Compromise recoveryTrust 如何 revoke 并 clean restore?唯一方案是重装同一 untrusted appBlocklist/revoke path 与 clean restore

App Store Trust 准备度评分卡

先用一个代表性 app 评估 catalog trust model。

控制项0 分1 分2 分Owner 问题
Publisher identityUnknownKnown repo ownerVerified maintainer/review path + incident contact谁能发布 trusted update?
Artifact pinninglatest tagVersion tagDigest/immutable release + provenance同一 version 能否 silent change?
Manifest reviewBlind installManual glancePolicy review ports/mounts/env/capabilities/depsApp 获得什么 privilege?
Lifecycle scriptsUnknownScripts visibleHooks reviewed/tested/bounded/diffed什么 code 在 app process 外执行?
Update governanceAutomatic upstream trustManual approvalStaged promotion + change review + recoveryBad update 能扩散多远?
Backup integrationNoneFiles copiedApp-consistent backup + clean restore testedHost loss 后能否 rebuild?
Vulnerability responseNo ownerMonitor upstreamAdvisory intake + patch SLA + disable path + notice谁响应 compromised dependency?
Removal/recoveryDelete container onlyManual cleanupUninstall audit + clean-room recoveryRemoval 后还留下什么 trusted state?

45 分钟 App Store Supply Chain Review

用一个代表性 app 评估 catalog trust model。

0–5 分钟:map publishers

识别 catalog owner、package maintainer、upstream、image publisher、registry。

成功标准每条 artifact/update path 都有 named trust actor。

5–15 分钟:inspect manifest/hooks

Review ports、mounts、env、capabilities、deps、downloads、lifecycle scripts。

成功标准没有 hidden privilege 或 opaque execution path。

15–20 分钟:resolve artifact identity

记录 version、registry、digest/immutable release;检查 provenance/SBOM/signature。

成功标准Reviewed artifact 可 exact identify。

20–30 分钟:disposable install/update

观察 new services、files、users、network calls 与 privilege changes。

成功标准Runtime behavior 与 reviewed packaging intent 一致。

30–40 分钟:backup/restore/uninstall

运行 supported backup、clean restore、uninstall,并检查 leftovers。

成功标准Recovery works 且 privileged residue 已知。

40–45 分钟:rehearse compromise

Disable update path、stop app、preserve evidence、rotate sample secret、选择 trusted recovery artifact。

成功标准Response 不依赖 compromised path。

App Catalog Review Flow

  1. 识别 catalog 与 app publisher ownership,分开 platform maintainer、catalog maintainer、app packager、upstream developer、image publisher 与 registry operator。
  2. 阅读 manifest 与所有 lifecycle hooks/packaging scripts,记录 ports、host mounts、volumes、env、secret refs、capabilities、devices、dependencies 与 external downloads。
  3. 解析 runtime artifact。Reviewed deployment 优先 immutable digest 或 fixed release,并记录通过 review 的 exact artifact。
  4. 检查 provenance、SBOM、signatures 或 attestations 是否存在,以及 deployment path 是否真的 verify,而不只是展示 badge。
  5. 在 disposable host/VM 安装,观察 filesystem writes、users/services、network destinations、image pulls、privileges、install/update 与 uninstall leftovers。
  6. 测试 update governance:promotion 前 diff manifest、hooks、image digest 与 privileges,避免 mutable tag 直接变成 production update。
  7. 用平台真实 hooks 或 app docs 测 backup/restore,验证 config、DB、identity、uploads/media 与 version compatibility。
  8. 定义 compromise response:disable listing/update、stop app、preserve logs/artifacts、revoke credentials、替换 trusted artifacts、clean restore,并按需通知 users。

场景表

场景主要审查目标停止条件
CasaOS community appCompose/manifest source、image registry、mounts、ports、update ownerMutable image + broad host access + unclear maintainer
Umbrel appManifest、dependencies、lifecycle hooksHook 下载/执行 unreviewed content 或 update silent privilege change
YunoHost packaged appInstall/upgrade/backup/restore/remove scripts 与 maintenanceBackup/restore 缺失或 scripts unpredictable host mutation
Nextcloud app ecosystemPublisher、compatibility、permissions、update channel、data migrationUpdate 无 rollback/restore path
Containerized media appImage digest、volumes、users、media mounts、provider secretsApp 需要 entire storage tree write 或 daemon socket
Community app-store forkStore owner、review、upstream sync、credential ownershipFork 暗示 official 或无 patch/advisory process
Emergency zero-dayDisable update/install、isolate app、rotate secrets、verify clean artifact继续从 suspected publisher path auto-update

供应链风险

Catalog trust transitivity

用户信任 platform 后,可能无意识地把信任扩展给每个 package maintainer、image publisher 与 update path。

Mutable image tags

Version/latest tag 之后可能指向不同 bytes;reviewed deployments 应在可行时记录 immutable digest。

Lifecycle hook privilege

Install/update hooks 可在 normal app runtime 外执行 privileged host mutation。

Broad mount inheritance

方便的 app template 可能给 app 整个 host directories、Docker socket、backup 或 unrelated app data 的写权限。

Auto-update blast radius

Publisher account compromise 或 bad package 在 catalog change/mutable tag 自动 promotion 时会快速扩散。

Backup-hook theater

Packaging 里有 backup command 不代表 DB、config、uploads 与 identity 能一致 restore。

Abandoned package

Upstream 健康不代表 stale package 安全;manifest、image 或 upgrade script 可能无人维护。

Uninstall residue

删除 visible app 可能留下 users、services、scheduled tasks、tokens、firewall rules、mounts 或 helper state。

供应链审查模式

Publisher map

把 platform、catalog、packager、upstream、image publisher、registry 作为独立 trust actors 记录。

Manifest diff gate

Update promotion 前 review mounts、ports、env、capabilities、hooks、image source 与 dependencies 的变化。

Digest evidence

记录 tested image digest 或 immutable release artifact,即使 user-facing config 保留 version tag。

Disposable install test

在 disposable host 完成 install、update、backup、restore、uninstall,并记录 created state/network behavior。

Privilege budget

Root、host networking、daemon sockets、devices、broad mounts、unrelated secrets 都作为 exception,需要 written justification。

Catalog incident switch

保留 disable 单 app install/update 的 path,不影响 unrelated entries,也不删除 forensic evidence。

FAQ

面向 self-hosted catalog operators/users 的简短回答。

Official catalog 自动安全吗?

不自动。Official review 可降低风险,但仍需理解谁 packaging、运行什么 artifact、拿到什么 privilege,以及 update/recovery 如何工作。

为什么 container image 要记录 digest?

Digest 标识 exact image bytes,而 tag 可以移动;digest evidence 能证明 review/deploy 的具体 artifact。

Manifest 只是 metadata 吗?

通常不是。Manifest 可定义 ports、mounts、dependencies、env、image source 与 lifecycle behavior,是 security boundary 的一部分。

每次 update review 什么?

Manifest changes、lifecycle scripts、image source/digest、new privileges、data migration、backup compatibility 与 maintainer/repo changes。

App store 最大风险是什么?

Trust transitivity:用户信任 platform 后,把 trust 自动扩展给每个 packager、publisher 与 update path。

Package compromise 后 recovery 目标是什么?

Stop distribution、isolate instances、preserve evidence、rotate secrets、用 clean trusted artifacts/data restore,然后 deliberate reopen updates。

相关雷达

Self-hosted Apps & Local Infrastructure 雷达

相关 RepoDaily briefs

Sources

  1. Umbrel App Framework
  2. YunoHost Packaging Apps
  3. YunoHost App Packaging Documentation
  4. CasaOS App Store repository
  5. Docker Pull by Digest
  6. Docker Build Best Practices
  7. Docker Provenance Policy
  8. Docker Image Signatures
  9. RepoDaily Home Server Backup & Recovery Checklist
  10. RepoDaily Reverse Proxy & Public Exposure Checklist

Feedback

这页是否帮助你做出决定?

匿名反馈只用于判断内容是否真正有用。

报告过期或缺失的证据