Z-CMS のための安全な Plugin Marketplace を構築する
Marketplace を software supply-chain system として設計する
Marketplace は ZIP download page ではない
Plugin marketplace は executable code を production system に配布します。そのため、誰が package を作成したか、改変されていないか、どの permission を要求するか、どの version に vulnerability があるか、bad update からどう recovery するかを説明できなければなりません。
Threat model
主な threat は typosquatting package、compromised publisher account、upload・storage・delivery 中の package modification、目的と無関係な permission、悪意ある transitive dependency、cross-tenant access、unauthorized data transfer です。
Signed package と immutable release
各 release は checksum と digital signature を持ちます。CMS は install 前に checksum、marketplace signature、publisher identity を verify します。公開済み version は上書きせず、修正は新 version として publish し、reproducibility と auditability を保ちます。
Developer builds plugin
↓
Generate checksum
↓
Sign package
↓
Marketplace verifies
↓
CMS verifies before installPublisher identity と namespace ownership
Marketplace は community publisher、verified publisher、verified organization、official package を区別します。@organization/plugin-name 形式の namespace は偽装を減らします。Publish 権限は Owner、Maintainer、Publisher、Security Reviewer などの role で管理します。
Permission manifest と runtime enforcement
Administrator は plugin がどの data を read、update、external transfer できるかを install 前に確認できる必要があります。Update で新 permission が追加された場合、auto-update を停止して approval を要求します。
Permission は install 時だけでなく runtime bridge でも enforce します。users:read を持たない plugin は users API を呼び出せません。
{
"permissions": [
"content:read",
"content:update",
"http:domain:api.example.com"
]
}Multi-tenant isolation
Plugin のすべての API call には Core が発行した tenant context が含まれます。Plugin は tenantId を任意に指定できません。Database、cache、storage、queue、search は tenant scope を enforce します。
Security scanning pipeline
Pipeline には manifest validation、dependency vulnerability scan、static analysis、secret scanning、malware analysis、sensitive permission に対する manual review を含めます。eval()、child_process、process.env、obfuscated code、unrestricted network access などは review 対象です。
Security advisory、revocation、rollback
Marketplace は affected version、severity、patched version を含む advisory を発行します。必要に応じて package を revoke し、新規 install を block、既存 instance に警告します。Versioned bundle により bad update から迅速に rollback できます。
Audit log と data transparency
Install、approval、activation、permission change、update は audit log に記録します。Plugin が external domain に data を送信する場合、domain、data type、purpose を明示し、administrator が判断できるようにします。
結論
安全な marketplace には publisher identity、package signing、immutable release、runtime permission、security scanning、multi-tenant isolation、advisory、revocation、audit log、rollback が必要です。すべての plugin の完全な安全を保証するのではなく、risk を減らし control と transparency を高めることが目的です。
Key takeaways
- Security boundary は plugin の善意ではなく Core 側で enforce する必要があります。
- Lifecycle、permission、tenant context、observability は同じ platform contract の一部です。
- 優れた developer experience は、安全な runtime と supply chain の設計によって持続可能になります。
GitHub: https://github.com/zscontributor/z-cms
Website: https://z-cms.org