Developer platform

Review rules

Every rule of the market review worker, exported from the review engine code.

m3.1 · 100 rules

How the outcome is decided

  • Any enforced reject: the version goes back to “changes requested”; fix it and resubmit (at most 10 scans per version). A reject in the validating phase skips the scanning phase.
  • Any enforced quarantine: human review.
  • Evaluation rules are only recorded in the report (with the outcome they would have had) and do not affect the result; record-only rules are notices or summaries.
  • The operator can allow-list or block-list file hashes: findings on allow-listed files drop to record-only (except the block rule and scanner faults); block-listed files are rejected (package.blocked_file).

When a human reviewer is required

With no reject finding, any one of these sends the version to human review; otherwise it is approved directly:

  • first_version: The first version (no reviewed version yet)
  • permission_change: Permissions differ from the last reviewed version
  • privileged: Privileged kinds: engine_module, module, provider
  • probation: The seller is within probation (market default 90 days, adjustable by the operator)
  • quarantine: Any enforced quarantine finding (scanner faults included)
  • scan_failed: Three scan attempts in a row errored

Manifest and version (metadata)

Rule IDSeverityOutcomeModeDescription
metadata.description_missingLowRecord onlyEnforcedThe manifest has no zh-CN description (notice only)
metadata.identity_mismatchHighRejectEnforcedThe manifest id or version differs from the uploaded version
metadata.license_missingLowRecord onlyEnforcedThe plugin declares no SPDX licence (notice only)
metadata.manifest_invalidHighRejectEnforcedThe manifest is not a valid marketplace.cdnca.io/v1 Plugin document
metadata.manifest_packagesHighRejectEvaluation (recorded only)The manifest spec.packages does not list exactly the uploaded packages and digests
metadata.name_missingMediumRejectEnforcedThe manifest has no zh-CN name
metadata.no_packagesHighRejectEnforcedAn external_https version has no platform package
metadata.platform_invalidMediumRejectEnforcedA platform name is malformed or repeated
metadata.publisher_missingMediumRejectEnforcedThe manifest has no publisher id or name
metadata.scanner_errorMediumQuarantine (human review)EnforcedThe check itself failed (scanner fault); the version goes to human review
metadata.skippedInfoRecord onlyEnforcedA prerequisite did not complete, so this check did not run
metadata.version_invalidHighRejectEnforcedThe version is not canonical SemVer
metadata.version_not_monotonicHighRejectEnforcedA reviewed version with the same or a higher number exists

Entrypoint and data packages (entrypoint)

Rule IDSeverityOutcomeModeDescription
entrypoint.content_mismatchCriticalRejectEnforcedThe uploaded data file does not match the signed spec.entrypoint.sha256
entrypoint.data_pack_permissionsHighRejectEnforcedA rule_pack declares exactly security.rule_packs.provide, a theme exactly platform.themes.provide
entrypoint.data_pack_versionHighRejectEnforcedA data package version is plain major.minor.patch (no pre-release)
entrypoint.packages_presentHighRejectEnforcedA rule_pack / theme version carries executable packages
entrypoint.provides_invalidHighRejectEnforcedspec.provides is malformed, repeated, or declared by a data package / ui_page
entrypoint.provides_official_onlyCriticalRejectEnforcedThis provider kind is official only (third-party CDN adapters are not open)
entrypoint.scanner_errorMediumQuarantine (human review)EnforcedThe check itself failed (scanner fault); the version goes to human review
entrypoint.skippedInfoRecord onlyEnforcedA prerequisite did not complete, so this check did not run
entrypoint.type_invalidHighRejectEnforcedspec.entrypoint.type is not external_https, rule_pack, theme or ui_page, or does not match the plugin kind

Permissions (permissions)

Rule IDSeverityOutcomeModeDescription
permissions.expandedMediumRecord onlyEnforcedPermissions grew since the last reviewed version: human review required
permissions.first_versionInfoRecord onlyEnforcedFirst version of the plugin: human review required
permissions.invalid_nameHighRejectEnforcedA permission name is malformed or repeated, or there are more than 64
permissions.manifest_mismatchHighRejectEnforcedStored permissions differ from the manifest
permissions.privilegedInfoRecord onlyEnforcedPrivileged kind (module, engine_module, provider): human review required
permissions.reducedInfoRecord onlyEnforcedPermissions shrank since the last reviewed version: human review required
permissions.scanner_errorMediumQuarantine (human review)EnforcedThe check itself failed (scanner fault); the version goes to human review
permissions.skippedInfoRecord onlyEnforcedA prerequisite did not complete, so this check did not run

Rule packs (rulepack)

Rule IDSeverityOutcomeModeDescription
rulepack.budget_exceededHighRejectEnforcedThe rule pack exceeds the rule count, regex or per-request cost budget
rulepack.compile_failedHighRejectEnforcedThe rule pack does not compile (cdnca.rule-pack/v1)
rulepack.gate_failedHighRejectEnforcedFails the publication gate: does not resolve alone, or a modsecurity pack’s CRS rule numbers cannot be computed
rulepack.layer_invalidHighRejectEnforcedA market rule pack must be a developer-layer pack in the publisher namespace (dev/<publisher>/<name>)
rulepack.not_canonicalMediumRejectEnforcedThe rule pack file is not the compiler’s canonical bytes
rulepack.scanner_errorMediumQuarantine (human review)EnforcedThe check itself failed (scanner fault); the version goes to human review
rulepack.skippedInfoRecord onlyEnforcedA prerequisite did not complete, so this check did not run
rulepack.summaryInfoRecord onlyEnforcedWhat the rule pack contains (display only)
rulepack.version_mismatchHighRejectEnforcedThe rule pack version differs from the plugin version

Themes (theme)

Rule IDSeverityOutcomeModeDescription
theme.admin_scopeCriticalRejectEnforcedA third-party theme declares the administrator console (applies_to admin, admin tokens or an admin selector); only the official publisher io.cdnca may
theme.console_invalidHighRejectEnforcedThe console_theme of a website theme package is not a valid cdnca.theme/v1 package
theme.id_mismatchHighRejectEnforcedA market theme id must be market.<plugin id>
theme.invalidHighRejectEnforcedNot a valid cdnca.theme/v1 package (tokens, slots, templates, external references)
theme.scanner_errorMediumQuarantine (human review)EnforcedThe check itself failed (scanner fault); the version goes to human review
theme.site_invalidHighRejectEnforcedNot a valid cdnca.site-theme/v1 or v2 website theme package (page bundle paths and forbidden content, auth style, content schema, applies_to)
theme.skippedInfoRecord onlyEnforcedA prerequisite did not complete, so this check did not run
theme.summaryInfoRecord onlyEnforcedWhat the theme renders (display only)
theme.version_mismatchHighRejectEnforcedThe theme version differs from the plugin version

Page plugins (ui_page)

Rule IDSeverityOutcomeModeDescription
ui_page.artifacts_presentHighRejectEnforcedA ui_page version carries no package or data file (its pages live on your origin)
ui_page.declaration_invalidHighRejectEnforcedThe ui_page declaration is malformed (origin, pages, mounts, menu parents, titles, gates)
ui_page.origin_unverifiedCriticalRejectEnforcedA page origin or api_base_url is not one you verified on the market
ui_page.permission_missingHighRejectEnforcedA ui_page plugin must declare platform.ui_pages.provide
ui_page.scanner_errorMediumQuarantine (human review)EnforcedThe check itself failed (scanner fault); the version goes to human review
ui_page.skippedInfoRecord onlyEnforcedA prerequisite did not complete, so this check did not run
ui_page.summaryInfoRecord onlyEnforcedWhere the pages are mounted (display only)

Platform packages (package)

Rule IDSeverityOutcomeModeDescription
package.blocked_fileCriticalRejectEnforcedA file hash is on the platform block list
package.corruptHighRejectEnforcedThe archive is corrupt
package.digest_mismatchCriticalRejectEnforcedA stored package does not match its declared SHA-256 or size
package.duplicate_entryHighRejectEnforcedContains duplicate entry names
package.limits_exceededHighRejectEnforcedOver the entry count or unpacked size limits
package.path_traversalCriticalRejectEnforcedAn entry name escapes the package root
package.scanner_errorMediumQuarantine (human review)EnforcedThe check itself failed (scanner fault); the version goes to human review
package.setuidHighQuarantine (human review)EnforcedAn entry has the setuid or setgid bit
package.skippedInfoRecord onlyEnforcedA prerequisite did not complete, so this check did not run
package.special_fileHighRejectEnforcedContains a device, pipe or socket
package.symlinkHighRejectEnforcedContains a symbolic or hard link
package.unknown_formatHighRejectEnforcedA package is not zip, tar.gz or tar
package.unsupported_entryMediumRejectEnforcedUnsupported archive entry type
package.zip_bombCriticalRejectEnforcedIt expands far beyond its compressed size (zip bomb)

Leaked secrets (secrets)

Rule IDSeverityOutcomeModeDescription
secrets.alibaba_access_keyHighRejectEnforcedAlibaba Cloud AccessKey ID
secrets.aws_access_keyCriticalRejectEnforcedAWS access key ID
secrets.gcp_api_keyHighRejectEnforcedGoogle API key
secrets.generic_api_keyMediumQuarantine (human review)Evaluation (recorded only)Generic credential assignment (api_key, secret, token, password and so on)
secrets.github_fine_grained_patCriticalRejectEnforcedGitHub fine-grained token
secrets.github_tokenCriticalRejectEnforcedGitHub token
secrets.gitlab_patCriticalRejectEnforcedGitLab personal access token
secrets.jwtMediumQuarantine (human review)Evaluation (recorded only)JSON Web Token
secrets.private_keyCriticalRejectEnforcedA private key is embedded in the package
secrets.scanner_errorMediumQuarantine (human review)EnforcedThe check itself failed (scanner fault); the version goes to human review
secrets.skippedInfoRecord onlyEnforcedA prerequisite did not complete, so this check did not run
secrets.slack_tokenHighRejectEnforcedSlack token
secrets.slack_webhookHighRejectEnforcedSlack webhook URL
secrets.stripe_secret_keyHighRejectEnforcedStripe secret key
secrets.tencent_secret_idHighRejectEnforcedTencent Cloud SecretId

Dependencies (dependencies)

Rule IDSeverityOutcomeModeDescription
dependencies.inventoryInfoRecord onlyEnforcedThird-party components found (display only)
dependencies.maliciousCriticalRejectEnforcedA dependency is a known malicious package
dependencies.not_configuredInfoRecord onlyEnforcedThe OSV offline database is not configured; dependency scan skipped (notice only)
dependencies.scanner_errorMediumQuarantine (human review)EnforcedThe check itself failed (scanner fault); the version goes to human review
dependencies.skippedInfoRecord onlyEnforcedA prerequisite did not complete, so this check did not run
dependencies.vulnerableLowRecord onlyEnforcedA dependency has a known vulnerability (notice only)
dependencies.vulnerable_highHighQuarantine (human review)Evaluation (recorded only)A dependency has a high or critical vulnerability

Malware scan (malware)

Rule IDSeverityOutcomeModeDescription
malware.detectedCriticalRejectEnforcedclamd detected malware
malware.not_configuredInfoRecord onlyEnforcedclamd is not configured; virus scan skipped (notice only)
malware.scanner_errorMediumQuarantine (human review)EnforcedThe check itself failed (scanner fault); the version goes to human review
malware.skippedInfoRecord onlyEnforcedA prerequisite did not complete, so this check did not run

Version diff (diff)

Rule IDSeverityOutcomeModeDescription
diff.binary_changedLowRecord onlyEnforcedAn executable was added or changed (notice only)
diff.first_versionInfoRecord onlyEnforcedNo earlier reviewed version to compare with (display only)
diff.scanner_errorMediumQuarantine (human review)EnforcedThe check itself failed (scanner fault); the version goes to human review
diff.skippedInfoRecord onlyEnforcedA prerequisite did not complete, so this check did not run
diff.summaryInfoRecord onlyEnforcedChanges since the last reviewed version (display only)