Repository navigation
v2.2.0
GitProxy v2.2.0 is a breaking release that patches five high-severity vulnerabilities. We strongly recommend upgrading existing deployments. For organizations using 2.0 and 2.1, we will provide non-breaking patches for all vulnerabilities except the push identity issue.
Upgrading to 2.2.0 should be straightforward: see the guide below for more details.
Vulnerability Fixes
Pusher identity fix
The largest, breaking change is how GitProxy determines the pusher's identity. Previously, it was obtained from the committer line of the pushed objects, which can be controlled by an attacker. In other words, a user could attribute a push to a colleague and then approve it themselves GHSA-m42c-5wg4-978p. Now, identity is resolved only from the authenticated session (or token). GitProxy will reject pushes whose identity cannot be established.
The guide below shows typical error messages along with the recommended fix.
SSH public key authentication fix
SSH public key authentication now verifies the client's signature. Previously, any key matching an entry in the user table was accepted without proof that the client actually held the private key GHSA-h37f-qp8m-g68c. This affected the first shipped versions of SSH, 2.1.0 and 2.1.1. The fix will also be backported to 2.1.2.
Commit replay approval bypass fix
Approvals are now bound to the repository, ref and contents they were granted for. An approval obtained in one repository can no longer be replayed to push the same commit range to another repository or branch GHSA-pm2x-94mw-m64f.
Arbitrary directory deletion fix
Ref updates are now validated as 40-character hex object IDs, and checkout paths are limited to the .remote directory. This prevents a path traversal vulnerability where users with push access could recursively delete directories the proxy could write to, including the .data database GHSA-293g-m6p5-4fqq.
Enforce limits on PACK decompression and contents, prevent memory exhaustion
PACK and pkt-line parsing enforces limits on decompressed size, object count and pkt-line count, so highly compressed or oversized pushes can no longer exhaust memory and CPU GHSA-w285-c89q-mg53.
Upgrading and troubleshooting
Configure your SCM provider
If you don't use a predefined SCM provider (GitHub, GitLab, Codeberg, Gitea), you must first add your provider's name, type and host to the scmProviders array in your proxy configuration (proxy.config.json).
Set your SCM username to the proxy URL
When pushing, you should make sure that the remote also has your SCM username attached. Check by running the following:
git remote -vThis will return something like this:
local http://<proxy-url>:<port>/<repo-git-url> (fetch)
local http://<proxy-url>:<port>/<repo-git-url> (push)
If your username is missing, you can edit it by running the following command:
git remote set-url local http://<username>@<proxy-url>:<port>/<repo-git-url>If this isn't set correctly, you'll get an error like this on git push:
remote: Invalid username or token. Password authentication is not supported for Git operations.
Connect your SCM username to GitProxy
If you haven't done this already you'll get the following error on git push:
remote: running resolveUserFromToken...
remote: Push blocked: github account 'jescalada' is not linked to a git-proxy user. Link it from your profile or ask an administrator.
In order to set it up, just open the Settings tab in your GitProxy profile (/dashboard/profile), and link your SCM account to the relevant provider:
Other issues?
If you encounter any other issues, feel free to open a discussion or mention it in our bi-weekly community calls.
Applicable fixes will be soon backported to 2.0.2 and 2.1.2. Many thanks to OSTIF @suidpit, and to @cla7aye15I4nd, for finding and reporting these issues.
What's Changed
🚀 Features
- feat(ui): add "Created" sort axis to repository list @andypols (#1700)
- feat: backfill repo dateCreated/lastModified via migration @andypols (#1681)
- feat: Refreshed UI @andypols (#1507)
- feat(db): add dateCreated and lastModified to Repo @sankalpsthakur (#1656)
- feat: DB Migrations @andypols (#1661)
🐛 Bug Fixes
- fix: ci failures @jescalada (#1759)
- fix: broken UI build path @jescalada (#1703)
🧰 Maintenance
- chore: bump git-proxy to 2.2.0 @github-actions[bot] (#1765)
- chore: fix unused @finos/git-proxy import in package-lock.json @jescalada (#1764)
- chore(deps): bump the github-actions group across 1 directory with 10 updates @dependabot[bot] (#1743)
- chore(deps): bump concurrently from 9.2.4 to 10.0.5 @dependabot[bot] (#1717)
- test: fix failing parsePush test on object ids @jescalada (#1746)
- chore(deps): bump the npm-non-major group across 2 directories with 18 updates @dependabot[bot] (#1742)
- chore(deps): bump agent-base from 7.1.4 to 9.0.0 @dependabot[bot] (#1718)
- chore(deps-dev): bump c8 from 11.0.0 to 12.0.0 @dependabot[bot] (#1715)
- refactor(config): drive deprecation warnings from config.schema.json @amitvijapur (#1708)
- chore: clean up root-level directory @jescalada (#1712)
- docs: add Technical Charter and restructure governance documentation @kriswest (#1664)
- chore(deps): bump the npm-non-major group across 1 directory with 4 updates @dependabot[bot] (#1714)
- chore(deps): bump https-proxy-agent from 7.0.6 to 9.1.0 @dependabot[bot] (#1620)
- chore(deps-dev): bump vite-tsconfig-paths from 5.1.4 to 6.1.1 @dependabot[bot] (#1614)
- chore: add npm version to engines, pin npm to 11 in CI @jescalada (#1710)
- chore(deps): bump the github-actions group across 1 directory with 9 updates @dependabot[bot] (#1707)
- chore(deps): bump the npm-non-major group across 2 directories with 17 updates @dependabot[bot] (#1706)
- chore: remove nyc @jescalada (#1696)
- ci: add Grype CVE scanning workflow, clean up vulnerable deps @coopernetes (#1605)
- chore(deps): bump vitest to v4 and fix tests @jescalada (#1564)
- chore: bump typescript to 6.0.3 and typescript-eslint to 8.61.1 @jescalada (#1602)
- chore(deps): bump the github-actions group across 1 directory with 8 updates @dependabot[bot] (#1679)
Full Changelog: v2.1.1...v2.2.0