Repository navigation
Releases
v2.16.0-rc2
What's Changed
Exciting New Features ๐
- Update artifact_accessory to add source column to identify accessory by @stonezdj in #23144
- feat: replace redis with valkey as cache backend by @chlins in #23157
- Full Multi-Architecture Enablement for Harbor (amd64 + arm64) by @ranimandepudi in #22311
- Add ListReferrers API to registry client and update parseScopes by @stonezdj in #23170
- Proxy the referrer API to upstream registry with paging and local merge by @stonezdj in #23237
- feat(ui): support advanced proxy cache configurations in UI by @stonezdj in #23536
- feat(backend): implement proxy cache repository filter API by @stonezdj in #23527
- Custom project roles โ frontend UI by @maxgraustenzel-create in #23970
- feat(task): aggregate execution error messages and surface task failure details by @stonezdj in #24028
Enhancement ๐
- Fix Last Pull time on parent/child artifacts and on creation by @BojanZelic in #22402
- fix(proxy): preserve URL path prefix during registry auth discovery by @mco69 in #22989
- Add UI option to enable proxy cache referrer API by @stonezdj in #23151
- ci: add API schema drift check for v2.0 swagger spec by @infracore in #23089
- refactor(task): use Redis SET with SPOP for outdate execution status โฆ by @chlins in #23183
- test(cosign): disable tlog for signing checks by @chlins in #23279
- perf(replication): filter event policies in query by @chlins in #23283
- fix: enable chunked blob upload for Azure ACR replication by @xrkolovos in #23016
- feat(audit): add member create/update/delete audit events by @Mauraza in #23228
- fix: add registry component to proxy configuration support by @Kibakus in #23437
- fix: set MaxIdleConnsPerHost on internal HTTP transports by @chlins in #23591
- Add proxy cache hit/miss metrics by @Jason-Lee3 in #23578
- fix: implement signature inheritance for OCI index children by @Aloui-Ikram in #23540
- fix(api): return 404 when listing artifacts of a non-existing repository by @tpoxa in #17618
Component updates โฌ๏ธ
- fix the git action publish permission issue by @wy65701436 in #22840
- fix: Update Verify Remote Cert tooltip for registry endpoints by @dee077 in #22812
- fix: wrong operation response name for UpdateRepository by @liubin in #22851
- fix(session): use correct maxlifetime in SessionRegenerate by @chlins in #22873
- chore(go): ignore frontend portal directory using Go 1.25 by @Iam-Karan-Suresh in #22702
- fix: check error first before other checks by @liubin in #22884
- fix: bump Trivy to v0.69.2 following supply chain incident by @Aloui-Ikram in #22896
- Remove payload from config audit log by @stonezdj in #22913
- fix codecov issue by @wy65701436 in #22922
- fix(portal): UI Statistics display are not aligned by @mmoreiradj in #22042
- Bump trivy to 0.69.3 & adapter to v0.35.1-rc.1 on main by @MinerYang in #22932
- fix(security): reject bearer tokens issued before project creation by @Vad1mo in #22900
- add the 2.14.1 sql into main by @wy65701436 in #22947
- Bump trivy-adapter v0.35.1 GA on main by @MinerYang in #22966
- fix: proxy cache serve local on remote not found by @AYDEV-FR in #22153
- fix(replication): add missing AWS regions to ECR adapter endpoint list by @nicknikolakakis in #22941
- add docker check before running 'make gen_apis' by @yaten2302 in #22907
- fix db scheme migration issue by @wy65701436 in #22998
- fix(about-dialog): format version span indentation by @chlins in #23012
- build(deps): migrate model-spec to modelpack org by @chlins in #23021
- Add User-Agent to all request by @stonezdj in #23030
- Call /v2/auth/token api to get bearer token for dockerhub adapter by @stonezdj in #23088
- fix(deps): Bump go-jose/go-jose/v4 to v4.1.4 to fix DoS vulnerability by @bupd in #23090
- feat(session): prevent background polling from renewing session TTL by @chlins in #22980
- Fix issue related to scanner API by @stonezdj in #23061
- fix(dao): use context-aware methods for database operations in MetaDAO by @mxab in #23074
- feat(gc): use human-readable sizes in GC log messages by @chlins in #23123
- fix(gc): redact redis_url_reg from GC extra attrs by @chlins in #23134
- fix(scan): use created time from annotations in accessory art by @chlins in #23113
- fix: add nil guard in auditext manager Create function by @ipsitapp8 in #23107
- perf(blob): fix full table scan in blob unassociation check during GC by @paragdudeja in #22994
- fix(exporter): add Docker HEALTHCHECK by @intojhanurag in #22778
- Fix the issue distribution instance edit without credential can not save by @stonezdj in #23165
- ci: disable exporter cache in API tests by @chlins in #23177
- refactor(config): centralize registry HTTP client timeout by @chlins in #23154
- fix(i18n): localize max upstream connection placeholder by @bupd in #23197
- ใfix issue 22865ใTCR provider adaptor can't parse intertional secret ID by @pikehuang in #22869
- FIX: Disallow Empty
robot_name_prefixto prevent OIDC CLI login from being blocked by @falconlee236 in #22556 - Fix spelling error in comments by @rakshityadav1868 in #23217
- fix(build): default PIP_INDEX_URL to https://pypi.org/simple by @Vad1mo in #23227
- fix: correct max_upstream_conn validation and disabled bindings by @Tusharjamdade in #22681
- feat: Add gosec linter by @bupd in #22668
- bump Go version from 1.25.7 to 1.26.3 by @stonezdj in #23235
- fix: lang file sync by @bupd in #23002
- Rebuild goharbor/photon image before create new harbor base images by @jUDASmILE in #23248
- fix(ui): use selected tag for pull command copy by @bupd in #23240
- fix: duplicated ๏ฟฝy\ in beego ORM TableName comments by @vip892766gma in #23234
- bump pg to v18 by @wy65701436 in #23184
- remove install net-tools from db dockerfile as photon removed it by @jUDASmILE in #23266
- build(registry): bump source tag to rc.2 by @chlins in #23269
- update ECR adapter to allow for ecr-public to be mirored by @goshlanguage in #22351
- fix(cosign): ignore tlog during verification by @chlins in #23284
- fix: Bump repository update_time on tag and artifact changes by @Aloui-Ikram in #23225
- fix(security): validate blob-mount source project and reject tokens missing iat by @Vad1mo in #23270
- build(registry): update source tag to rc.4 by @chlins in #23300
- fix: build valkey from source to support arm64 by @ranimandepudi in #23282
- Upgrade harbor go.mod OSS packages by @stonezdj in #23314
- fix(ecr): use amazonaws.com.cn domain for AWS China region endpoints by @amaanx86 in #23326
- fix: publish goharbor/photon:5.0 as a multi-arch manifest (#23324) by @Vad1mo in #23334
- skip spectral image when creating multi-arch manifests by @wy65701436 in #23340
- exclude helper images...
v2.16.0-rc1
What's Changed
Exciting New Features ๐
- Update artifact_accessory to add source column to identify accessory by @stonezdj in #23144
- feat: replace redis with valkey as cache backend by @chlins in #23157
- Full Multi-Architecture Enablement for Harbor (amd64 + arm64) by @ranimandepudi in #22311
- Add ListReferrers API to registry client and update parseScopes by @stonezdj in #23170
- Proxy the referrer API to upstream registry with paging and local merge by @stonezdj in #23237
- feat(ui): support advanced proxy cache configurations in UI by @stonezdj in #23536
- feat(backend): implement proxy cache repository filter API by @stonezdj in #23527
- test: add api and ui integration tests for proxy cache repository filter by @fiona-xie in #23744
- Custom project roles โ frontend UI by @maxgraustenzel-create in #23970
- feat(task): aggregate execution error messages and surface task failure details by @stonezdj in #24028
Enhancement ๐
- Fix Last Pull time on parent/child artifacts and on creation by @BojanZelic in #22402
- fix(proxy): preserve URL path prefix during registry auth discovery by @mco69 in #22989
- Add UI option to enable proxy cache referrer API by @stonezdj in #23151
- ci: add API schema drift check for v2.0 swagger spec by @infracore in #23089
- refactor(task): use Redis SET with SPOP for outdate execution status โฆ by @chlins in #23183
- test(cosign): disable tlog for signing checks by @chlins in #23279
- perf(replication): filter event policies in query by @chlins in #23283
- fix: enable chunked blob upload for Azure ACR replication by @xrkolovos in #23016
- feat(audit): add member create/update/delete audit events by @Mauraza in #23228
- fix: add registry component to proxy configuration support by @Kibakus in #23437
- fix: set MaxIdleConnsPerHost on internal HTTP transports by @chlins in #23591
- Add proxy cache hit/miss metrics by @Jason-Lee3 in #23578
- fix: implement signature inheritance for OCI index children by @Aloui-Ikram in #23540
- fix(api): return 404 when listing artifacts of a non-existing repository by @tpoxa in #17618
Component updates โฌ๏ธ
- fix the git action publish permission issue by @wy65701436 in #22840
- fix: Update Verify Remote Cert tooltip for registry endpoints by @dee077 in #22812
- fix: wrong operation response name for UpdateRepository by @liubin in #22851
- fix(session): use correct maxlifetime in SessionRegenerate by @chlins in #22873
- chore(go): ignore frontend portal directory using Go 1.25 by @Iam-Karan-Suresh in #22702
- fix: check error first before other checks by @liubin in #22884
- fix: bump Trivy to v0.69.2 following supply chain incident by @Aloui-Ikram in #22896
- Remove payload from config audit log by @stonezdj in #22913
- fix codecov issue by @wy65701436 in #22922
- fix(portal): UI Statistics display are not aligned by @mmoreiradj in #22042
- Bump trivy to 0.69.3 & adapter to v0.35.1-rc.1 on main by @MinerYang in #22932
- fix(security): reject bearer tokens issued before project creation by @Vad1mo in #22900
- add the 2.14.1 sql into main by @wy65701436 in #22947
- Bump trivy-adapter v0.35.1 GA on main by @MinerYang in #22966
- fix: proxy cache serve local on remote not found by @AYDEV-FR in #22153
- fix(replication): add missing AWS regions to ECR adapter endpoint list by @nicknikolakakis in #22941
- add docker check before running 'make gen_apis' by @yaten2302 in #22907
- fix db scheme migration issue by @wy65701436 in #22998
- fix(about-dialog): format version span indentation by @chlins in #23012
- build(deps): migrate model-spec to modelpack org by @chlins in #23021
- Add User-Agent to all request by @stonezdj in #23030
- Call /v2/auth/token api to get bearer token for dockerhub adapter by @stonezdj in #23088
- fix(deps): Bump go-jose/go-jose/v4 to v4.1.4 to fix DoS vulnerability by @bupd in #23090
- feat(session): prevent background polling from renewing session TTL by @chlins in #22980
- Fix issue related to scanner API by @stonezdj in #23061
- fix(dao): use context-aware methods for database operations in MetaDAO by @mxab in #23074
- feat(gc): use human-readable sizes in GC log messages by @chlins in #23123
- fix(gc): redact redis_url_reg from GC extra attrs by @chlins in #23134
- fix(scan): use created time from annotations in accessory art by @chlins in #23113
- fix: add nil guard in auditext manager Create function by @ipsitapp8 in #23107
- perf(blob): fix full table scan in blob unassociation check during GC by @paragdudeja in #22994
- fix(exporter): add Docker HEALTHCHECK by @intojhanurag in #22778
- Fix the issue distribution instance edit without credential can not save by @stonezdj in #23165
- ci: disable exporter cache in API tests by @chlins in #23177
- refactor(config): centralize registry HTTP client timeout by @chlins in #23154
- fix(i18n): localize max upstream connection placeholder by @bupd in #23197
- ใfix issue 22865ใTCR provider adaptor can't parse intertional secret ID by @pikehuang in #22869
- FIX: Disallow Empty
robot_name_prefixto prevent OIDC CLI login from being blocked by @falconlee236 in #22556 - Fix spelling error in comments by @rakshityadav1868 in #23217
- fix(build): default PIP_INDEX_URL to https://pypi.org/simple by @Vad1mo in #23227
- fix: correct max_upstream_conn validation and disabled bindings by @Tusharjamdade in #22681
- feat: Add gosec linter by @bupd in #22668
- bump Go version from 1.25.7 to 1.26.3 by @stonezdj in #23235
- fix: lang file sync by @bupd in #23002
- Rebuild goharbor/photon image before create new harbor base images by @jUDASmILE in #23248
- fix(ui): use selected tag for pull command copy by @bupd in #23240
- fix: duplicated ๏ฟฝy\ in beego ORM TableName comments by @vip892766gma in #23234
- bump pg to v18 by @wy65701436 in #23184
- remove install net-tools from db dockerfile as photon removed it by @jUDASmILE in #23266
- build(registry): bump source tag to rc.2 by @chlins in #23269
- update ECR adapter to allow for ecr-public to be mirored by @goshlanguage in #22351
- fix(cosign): ignore tlog during verification by @chlins in #23284
- fix: Bump repository update_time on tag and artifact changes by @Aloui-Ikram in #23225
- fix(security): validate blob-mount source project and reject tokens missing iat by @Vad1mo in #23270
- build(registry): update source tag to rc.4 by @chlins in #23300
- fix: build valkey from source to support arm64 by @ranimandepudi in #23282
- Upgrade harbor go.mod OSS packages by @stonezdj in #23314
- fix(ecr): use amazonaws.com.cn domain for AWS China region endpoints by @amaanx86 in #23326
- fix: publish goharbor/photon:5.0 as a multi-arch manifest (#23324) by @Vad1mo in #23334
- skip...
v2.14.6
What's Changed
Component updates โฌ๏ธ
- bump base version for v2.14.6 by @wy65701436 in #24115
- Release 2.14 bump go trivy distribution by @wy65701436 in #24122
- fix(webhook): allow private network access by default (#24082) by @wy65701436 in #24129
- fix(prepare): expose the legacy signer pull switch in harbor.yml (#24โฆ by @wy65701436 in #24130
- Cherry pick upload location origin 2.14 (#24114) by @wy65701436 in #24131
- fix(contenttrust): allow legacy signer pull by default to avoid regreโฆ by @wy65701436 in #24132
- (cherry-pick) support configurable PIP_INDEX_URL for swagger client build and make openapi-generator-cli download URL configurable by @stonezdj in #24150
- [release-2.14] fix(cnai-parser): enforce actual byte limit to prevent decompression (#23497) by @Vad1mo in #24143
- [release-2.14] fix: avoid panic in user audit event resolver on nil event data (#23461) by @Vad1mo in #24152
- chore(deps): upgrade Go dependencies to fix High and Critical CVEs by @stonezdj in #24190
- bump: bump Go to 1.26.10 for release-2.14.0 by @stonezdj in #24199
Full Changelog: v2.14.5...v2.14.6
v2.14.6-rc2
What's Changed
Component updates โฌ๏ธ
- bump base version for v2.14.6 by @wy65701436 in #24115
- Release 2.14 bump go trivy distribution by @wy65701436 in #24122
- fix(webhook): allow private network access by default (#24082) by @wy65701436 in #24129
- fix(prepare): expose the legacy signer pull switch in harbor.yml (#24โฆ by @wy65701436 in #24130
- Cherry pick upload location origin 2.14 (#24114) by @wy65701436 in #24131
- fix(contenttrust): allow legacy signer pull by default to avoid regreโฆ by @wy65701436 in #24132
- (cherry-pick) support configurable PIP_INDEX_URL for swagger client build and make openapi-generator-cli download URL configurable by @stonezdj in #24150
- [release-2.14] fix(cnai-parser): enforce actual byte limit to prevent decompression (#23497) by @Vad1mo in #24143
- [release-2.14] fix: avoid panic in user audit event resolver on nil event data (#23461) by @Vad1mo in #24152
- chore(deps): upgrade Go dependencies to fix High and Critical CVEs by @stonezdj in #24190
- bump: bump Go to 1.26.10 for release-2.14.0 by @stonezdj in #24199
Full Changelog: v2.14.5...v2.14.6-rc2
v2.14.6-rc1
What's Changed
Component updates โฌ๏ธ
- bump base version for v2.14.6 by @wy65701436 in #24115
- Release 2.14 bump go trivy distribution by @wy65701436 in #24122
- fix(webhook): allow private network access by default (#24082) by @wy65701436 in #24129
- fix(prepare): expose the legacy signer pull switch in harbor.yml (#24โฆ by @wy65701436 in #24130
- Cherry pick upload location origin 2.14 (#24114) by @wy65701436 in #24131
- fix(contenttrust): allow legacy signer pull by default to avoid regreโฆ by @wy65701436 in #24132
Full Changelog: v2.14.5...v2.14.6-rc1
v2.15.4
What's Changed
Component updates โฌ๏ธ
- fix(webhook): allow private network access by default by @Vad1mo in #24082
- fix(contenttrust): allow legacy signer pull by default to avoid regreโฆ by @wy65701436 in #24086
- fix(prepare): expose the legacy signer pull switch in harbor.yml by @bupd in #24101
- Cherry pick upload location origin 2.15 by @wy65701436 in #24114
Bump Component Version ๐ค
- Bump trivy(0.75.0) and trivy adapter(0.39.1-rc2) by @stonezdj in #24080
- bump v2.15.4 release by @wy65701436 in #24087
Other Changes
Full Changelog: v2.15.3...v2.15.4
v2.15.4-rc1
What's Changed
Component updates โฌ๏ธ
- fix(webhook): allow private network access by default by @Vad1mo in #24082
- fix(contenttrust): allow legacy signer pull by default to avoid regreโฆ by @wy65701436 in #24086
- fix(prepare): expose the legacy signer pull switch in harbor.yml by @bupd in #24101
- Cherry pick upload location origin 2.15 by @wy65701436 in #24114
Bump Component Version ๐ค
- Bump trivy(0.75.0) and trivy adapter(0.39.1-rc2) by @stonezdj in #24080
- bump v2.15.4 release by @wy65701436 in #24087
Full Changelog: v2.15.3...v2.15.4-rc1
v2.15.3
Warning
Breaking change: webhooks to internal addresses are blocked by default
The fix for GHSA-2phj-cp9f-qq6w blocks webhook and Slack delivery to private, loopback, link-local and other non-public addresses. That includes hostnames that resolve to them, such as *.svc.cluster.local. After you upgrade, existing webhooks to internal endpoints fail to deliver, and new ones are rejected.
To allow them again, set the opt-out on both core and jobservice:
harbor.yml:network.allow_private_network_access: true, then./prepareand restart- Helm: add
{name: HARBOR_ALLOW_PRIVATE_NETWORK_ACCESS, value: "true"}to bothcore.extraEnvVarsandjobservice.extraEnvVars
This disables the protection entirely. Only use it if you trust all project admins, and block 169.254.169.254 at the network level.
Warning
Breaking change: signing unsigned images fails when content trust is enforced
The fix for GHSA-wrw5-gmvj-gf23 removes the User-Agent based exemption that let cosign and notation pull unsigned images. In projects that only allow signed images, cosign sign and notation sign on a new, unsigned image now fail with 412 Precondition Failed. Images that already have a signature are not affected.
To allow signing clients again, set CONTENT_TRUST_LEGACY_SIGNER_PULL_ENABLED=true on core. The value must be exactly true.
- Helm: add it to
core.extraEnvVars harbor.ymlinstalls: there is noharbor.ymloption. Add it tocommon/config/core/envand restart. Re-running./prepareoverwrites that file.
The exemption still trusts the client's User-Agent, but only for users or robots with push permission on the project. Projects that block vulnerable images have no opt-out: a signing client can no longer pull an image that the vulnerability policy blocks.
Warning
Known Issue: Push Replication Fails for Specific Registries such as AWS ECR (GHSA-wjpm-hv5w-gxr6 Regression)
The security fix for GHSA-wjpm-hv5w-gxr6 strictly validated upload Location headers against the statically configured registry endpoint (c.url). Because the AWS ECR adapter configures the API control-plane endpoint (https://api.ecr..amazonaws.com) while requests are rewritten to the data-plane host (.dkr.ecr..amazonaws.com), ECR's response Location header is rejected as a cross-origin target.
Workaround / Resolution:
A fix has been provided in PR #24113 and will be released in the upcoming patch release.
If your environment depends on push replication, we recommend postponing the upgrade until the next patch release or applying the patch directly.
What's Changed
Security Advisories ๐
- (high): Path traversal vulnerability in distribution endpoints GHSA-qj39-pjf2-wmrc in
a82c5528f - (high): A system robot with user:update makes itself a system administrator GHSA-w5fq-xrhj-j7g2 in
8896be0ae - (high): Robot "cover all projects" scope collapses into a global wildcard, conferring the deliberately-ungrantable robot:update โ enabling cross-project robot takeover with owner lockout GHSA-xq2m-cj8w-56v5 in
7331b58d5 - (high): External auth-proxy identity named admin inherits Registry system-administrator authorization GHSA-xvh7-74g6-29xw in
13e5a1b97 - (medium): Immutable tag rule matcher only evaluates first repository/tag selector, allowing multi-selector rules to be bypassed GHSA-27f2-qg57-2gwg in
08c58f3c7 - (medium): SSRF in webhook delivery allows ProjectAdmin to reach internal services and cloud metadata endpoints GHSA-2phj-cp9f-qq6w in
fb476e10c - (medium): Scanner bearer authorization request disables TLS verification and reads the full response body GHSA-884q-mjcg-86x4 in
eb1a6fb64 - (medium): Webhook error responses can cause unbounded decompression in Jobservice GHSA-jw3v-7jvc-pfmx in
fb476e10c - (medium): scanner_registration.access_cred is missing filter:"false", giving a project admin a blind oracle over the scanner credential GHSA-vwvv-675v-p6rr in
d2e2312f5 - (medium): Registry chunk upload reuses unvalidated Location headers GHSA-wjpm-hv5w-gxr6 in
401e73429 - (medium): Vulnerability & Content-Trust pull policies bypassable via attacker-controlled
User-Agentheader GHSA-wrw5-gmvj-gf23 in9d255ebe1 - (medium): SSRF and credential disclosure via attacker-controlled pagination Link header in the registry replication client GHSA-xgp2-5vxg-rgh2 in
a01e0c6c5 - (low): Security middleware continues after AuthMode lookup failure GHSA-3x7c-wf86-mjx6 in
bfd319a92
Component updates โฌ๏ธ
- (cherry-pick) fix: avoid panic in user audit event resolver on nil event data (#23461) by @Aloui-Ikram in #23501
- (cherry-pick) fix: Constrain /registries/ping to the saved URL for existing registries (#23463) by @Aloui-Ikram in #23502
- (cherry-pick) Add a size limit for manifest uploads by @Aloui-Ikram in #23503
- cherry-pick: fix(ui): use dark login background in dark mode by @bupd in #23539
- ci: remove third-party docker action by @stonezdj in #23693
- (cherry-pick) neutralize CSV formula in scan export by @stonezdj in #23696
- (cherry-pick): prevent proxy-cache poisoning via robot-name prefix by @stonezdj in #23695
- (cherry-pick) Exclude replication from dockerhub in github action by @stonezdj in #23715
- (cherry-pick) fix: convert setup_timestamp, status_revision, and revision columns to bigint to avoid Y2K38 overflow (#23711) by @stonezdj in #23719
- (cherry-pick) add size limit for audit log payload by @stonezdj in #23758
- (cherry-pick) Refine utils function IsLocalPath by @stonezdj in #23757
- [Backport] test(api): enhance stability of test_copy_disability in tag immutability by @fiona-xie in #23775
- (cherry-pick): query robot account to validate proxy session and fix UT by @stonezdj in #23780
- [cherry-pick]fix: correct grammar and typos in user-facing error messages by @wy65701436 in #23822
- [cherry pick] Remove hardcoded credentials and prevernt passwords in logs by @jUDASmILE in #23865
- make hostname comparisons case-insensitive by @stonezdj in #23833
- [cherry pick] improve HTTP client request logging and credential strโฆ by @jUDASmILE in #23876
- [cherry pick]refactor: sanitize connection details in logs and enhance error messaโฆ by @jUDASmILE in #23886
- (cherry-pick) make endpoint handling and validation case-insensitive by @stonezdj in #23887
- [cherry pick] cherry pick 23974 changes to release-2.15.0 branch by @jUDASmILE in #23982
- [CHERRY-PICK] fix(gc): do not count blobs missing from storage as freed space by @velmoga in #23980
Bump C...
v2.14.5
Warning
Breaking change: webhooks to internal addresses are blocked by default
The fix for GHSA-2phj-cp9f-qq6w blocks webhook and Slack delivery to private, loopback, link-local and other non-public addresses. That includes hostnames that resolve to them, such as *.svc.cluster.local. After you upgrade, existing webhooks to internal endpoints fail to deliver, and new ones are rejected.
To allow them again, set the opt-out on both core and jobservice:
harbor.yml:network.allow_private_network_access: true, then./prepareand restart- Helm: add
{name: HARBOR_ALLOW_PRIVATE_NETWORK_ACCESS, value: "true"}to bothcore.extraEnvVarsandjobservice.extraEnvVars
This disables the protection entirely. Only use it if you trust all project admins, and block 169.254.169.254 at the network level.
Warning
Breaking change: signing unsigned images fails when content trust is enforced
The fix for GHSA-wrw5-gmvj-gf23 removes the User-Agent based exemption that let cosign and notation pull unsigned images. In projects that only allow signed images, cosign sign and notation sign on a new, unsigned image now fail with 412 Precondition Failed. Images that already have a signature are not affected.
To allow signing clients again, set CONTENT_TRUST_LEGACY_SIGNER_PULL_ENABLED=true on core. The value must be exactly true.
- Helm: add it to
core.extraEnvVars harbor.ymlinstalls: there is noharbor.ymloption. Add it tocommon/config/core/envand restart. Re-running./prepareoverwrites that file.
The exemption still trusts the client's User-Agent, but only for users or robots with push permission on the project. Projects that block vulnerable images have no opt-out: a signing client can no longer pull an image that the vulnerability policy blocks.
Warning
Known Issue: Push Replication Fails for Specific Registries such as AWS ECR (GHSA-wjpm-hv5w-gxr6 Regression)
The security fix for GHSA-wjpm-hv5w-gxr6 strictly validated upload Location headers against the statically configured registry endpoint (c.url). Because the AWS ECR adapter configures the API control-plane endpoint (https://api.ecr..amazonaws.com) while requests are rewritten to the data-plane host (.dkr.ecr..amazonaws.com), ECR's response Location header is rejected as a cross-origin target.
Workaround / Resolution:
A fix has been provided in PR #24113 and will be released in the upcoming patch release.
If your environment depends on push replication, we recommend postponing the upgrade until the next patch release or applying the patch directly.
What's Changed
Security Advisories ๐
- (high): Path traversal vulnerability in distribution endpoints GHSA-qj39-pjf2-wmrc in
a82c5528f - (high): A system robot with user:update makes itself a system administrator GHSA-w5fq-xrhj-j7g2 in
8896be0ae - (high): Robot "cover all projects" scope collapses into a global wildcard, conferring the deliberately-ungrantable robot:update โ enabling cross-project robot takeover with owner lockout GHSA-xq2m-cj8w-56v5 in
7331b58d5 - (high): External auth-proxy identity named admin inherits Registry system-administrator authorization GHSA-xvh7-74g6-29xw in
13e5a1b97 - (medium): Immutable tag rule matcher only evaluates first repository/tag selector, allowing multi-selector rules to be bypassed GHSA-27f2-qg57-2gwg in
08c58f3c7 - (medium): SSRF in webhook delivery allows ProjectAdmin to reach internal services and cloud metadata endpoints GHSA-2phj-cp9f-qq6w in
fb476e10c - (medium): Scanner bearer authorization request disables TLS verification and reads the full response body GHSA-884q-mjcg-86x4 in
eb1a6fb64 - (medium): Webhook error responses can cause unbounded decompression in Jobservice GHSA-jw3v-7jvc-pfmx in
fb476e10c - (medium): scanner_registration.access_cred is missing filter:"false", giving a project admin a blind oracle over the scanner credential GHSA-vwvv-675v-p6rr in
d2e2312f5 - (medium): Registry chunk upload reuses unvalidated Location headers GHSA-wjpm-hv5w-gxr6 in
401e73429 - (medium): Vulnerability & Content-Trust pull policies bypassable via attacker-controlled
User-Agentheader GHSA-wrw5-gmvj-gf23 in9d255ebe1 - (medium): SSRF and credential disclosure via attacker-controlled pagination Link header in the registry replication client GHSA-xgp2-5vxg-rgh2 in
a01e0c6c5 - (low): Security middleware continues after AuthMode lookup failure GHSA-3x7c-wf86-mjx6 in
bfd319a92
Component updates โฌ๏ธ
- [CHERRY-PICK] Make openapi-generator-cli download URL configurable (#23186) by @chlins in #23222
- [cherry-pick] Rebuild goharbor/photon image before create new harbor base images by @jUDASmILE in #23252
- [cherry-pick]remove install net-tools from db dockerfile as photon removed it by @jUDASmILE in #23268
- [CHERRY-PICK] test(cosign): disable tlog for signing checks by @chlins in #23281
- [CHERRY-PICK] fix(cosign): ignore tlog during verification by @chlins in #23285
Other Changes
- [cherry-pick] support configurable PIP_INDEX_URL for swagger client build by @stonezdj in #23243
- fix: pin redis 7.2.11 instead of 7.2.6 in the redis base image by @bupd in #24065
- fix: stop release-2.14 builds from overwriting goharbor/photon:5.0 by @bupd in #24063
Full Changelog: v2.14.4...v2.14.5
v2.13.6
Warning
Breaking change: webhooks to internal addresses are blocked by default
The fix for GHSA-2phj-cp9f-qq6w blocks webhook and Slack delivery to private, loopback, link-local and other non-public addresses. That includes hostnames that resolve to them, such as *.svc.cluster.local. After you upgrade, existing webhooks to internal endpoints fail to deliver, and new ones are rejected.
To allow them again, set the opt-out on both core and jobservice:
harbor.yml:network.allow_private_network_access: true, then./prepareand restart- Helm: add
{name: HARBOR_ALLOW_PRIVATE_NETWORK_ACCESS, value: "true"}to bothcore.extraEnvVarsandjobservice.extraEnvVars
This disables the protection entirely. Only use it if you trust all project admins, and block 169.254.169.254 at the network level.
Warning
Breaking change: signing unsigned images fails when content trust is enforced
The fix for GHSA-wrw5-gmvj-gf23 removes the User-Agent based exemption that let cosign and notation pull unsigned images. In projects that only allow signed images, cosign sign and notation sign on a new, unsigned image now fail with 412 Precondition Failed. Images that already have a signature are not affected.
To allow signing clients again, set CONTENT_TRUST_LEGACY_SIGNER_PULL_ENABLED=true on core. The value must be exactly true.
- Helm: add it to
core.extraEnvVars harbor.ymlinstalls: there is noharbor.ymloption. Add it tocommon/config/core/envand restart. Re-running./prepareoverwrites that file.
The exemption still trusts the client's User-Agent, but only for users or robots with push permission on the project. Projects that block vulnerable images have no opt-out: a signing client can no longer pull an image that the vulnerability policy blocks.
Warning
Known Issue: Push Replication Fails for Specific Registries such as AWS ECR (GHSA-wjpm-hv5w-gxr6 Regression)
The security fix for GHSA-wjpm-hv5w-gxr6 strictly validated upload Location headers against the statically configured registry endpoint (c.url). Because the AWS ECR adapter configures the API control-plane endpoint (https://api.ecr..amazonaws.com) while requests are rewritten to the data-plane host (.dkr.ecr..amazonaws.com), ECR's response Location header is rejected as a cross-origin target.
Workaround / Resolution:
A fix has been provided in PR #24113 and will be released in the upcoming patch release.
If your environment depends on push replication, we recommend postponing the upgrade until the next patch release or applying the patch directly.
What's Changed
Security Advisories ๐
- (high): Path traversal vulnerability in distribution endpoints GHSA-qj39-pjf2-wmrc in
a82c5528f - (high): A system robot with user:update makes itself a system administrator GHSA-w5fq-xrhj-j7g2 in
8896be0ae - (high): Robot "cover all projects" scope collapses into a global wildcard, conferring the deliberately-ungrantable robot:update โ enabling cross-project robot takeover with owner lockout GHSA-xq2m-cj8w-56v5 in
7331b58d5 - (high): External auth-proxy identity named admin inherits Registry system-administrator authorization GHSA-xvh7-74g6-29xw in
13e5a1b97 - (medium): Immutable tag rule matcher only evaluates first repository/tag selector, allowing multi-selector rules to be bypassed GHSA-27f2-qg57-2gwg in
08c58f3c7 - (medium): SSRF in webhook delivery allows ProjectAdmin to reach internal services and cloud metadata endpoints GHSA-2phj-cp9f-qq6w in
fb476e10c - (medium): Scanner bearer authorization request disables TLS verification and reads the full response body GHSA-884q-mjcg-86x4 in
eb1a6fb64 - (medium): Webhook error responses can cause unbounded decompression in Jobservice GHSA-jw3v-7jvc-pfmx in
fb476e10c - (medium): scanner_registration.access_cred is missing filter:"false", giving a project admin a blind oracle over the scanner credential GHSA-vwvv-675v-p6rr in
d2e2312f5 - (medium): Registry chunk upload reuses unvalidated Location headers GHSA-wjpm-hv5w-gxr6 in
401e73429 - (medium): Vulnerability & Content-Trust pull policies bypassable via attacker-controlled
User-Agentheader GHSA-wrw5-gmvj-gf23 in9d255ebe1 - (medium): SSRF and credential disclosure via attacker-controlled pagination Link header in the registry replication client GHSA-xgp2-5vxg-rgh2 in
a01e0c6c5 - (low): Security middleware continues after AuthMode lookup failure GHSA-3x7c-wf86-mjx6 in
bfd319a92
Other Changes
Full Changelog: v2.13.5...v2.13.6