CVE-2025-54585 Overview
CVE-2025-54585 is an authorization bypass vulnerability in Finos GitProxy, an application that mediates between developers and Git remote endpoints to enforce push policies. In versions 1.19.1 and below, attackers can abuse how GitProxy handles new branch creation to bypass approval of prior commits on the parent branch. The flaw impacts any organization relying on GitProxy to enforce change-approval policy and block unapproved commits. Exploitation requires only regular push access, no elevated privileges, and no additional user interaction, though an administrator or designated approver must approve the push to the newly created child branch. The vulnerability is classified under CWE-285: Improper Authorization and is fixed in version 1.19.2.
Critical Impact
Unapproved commits on a parent branch can be smuggled into a repository by creating a child branch and obtaining approval only for the child push, bypassing GitProxy's policy enforcement.
Affected Products
- Finos GitProxy versions 1.19.1 and earlier
- Deployments relying on GitProxy's canUserApproveRejectPush approval workflow
- Any downstream repositories protected by GitProxy policy enforcement
Discovery Timeline
- 2025-07-30 - CVE-2025-54585 published to the National Vulnerability Database (NVD)
- 2026-06-17 - Last updated in NVD database
Technical Details for CVE-2025-54585
Vulnerability Analysis
GitProxy intercepts git push operations and routes them through a chain of checks before forwarding commits to the upstream Git remote. The push-processing chain in src/proxy/chain.ts sequences steps for commit message validation, author checks, permission enforcement, and approval waiting. In vulnerable versions, the chain did not inspect commits that were implicitly carried along when a new branch was created from a parent branch containing unapproved history. An attacker with regular push access could create a new branch whose tip includes previously unapproved commits, submit the branch for approval, and have the approver inadvertently sanction the hidden ancestry. Because approval was evaluated against the pushed ref rather than the full set of newly reachable commits, the policy boundary was bypassed [CWE-285].
Root Cause
The root cause is missing validation of hidden commits introduced by branch creation. The pre-patch push chain ordered checkIfWaitingAuth before the server had fully resolved which commits were new to the remote, and it lacked a dedicated step to enumerate commits that became reachable through the push. Approvers therefore saw and sanctioned the child-branch push without visibility into prior unapproved parent commits now attached to it.
Attack Vector
An authenticated user with push rights creates a branch that includes unapproved commits on its history, pushes it through GitProxy, and waits for an approver with canUserApproveRejectPush to sign off on the child-branch push. Approval of the child push effectively lands the ancestor commits upstream without their own review.
// Patch excerpt: src/proxy/chain.ts — reordered push chain and new checks
proc.push.checkCommitMessages,
proc.push.checkAuthorEmails,
proc.push.checkUserPushPermission,
- proc.push.checkIfWaitingAuth,
proc.push.pullRemote,
proc.push.writePack,
+ proc.push.checkHiddenCommits,
+ proc.push.checkIfWaitingAuth,
+ proc.push.getMissingData,
proc.push.preReceive,
proc.push.getDiff,
// run before clear remote
// Source: https://github.com/finos/git-proxy/commit/a620a2f33c39c78e01783a274580bf822af3cc3a
// Patch excerpt: src/proxy/actions/Action.ts — new field to track pack index files
attestation?: string;
lastStep?: Step;
proxyGitPath?: string;
+ newIdxFiles?: string[];
/**
* Create an action.
// Source: https://github.com/finos/git-proxy/commit/f99fe42082eab0970e4cd0acdc3421a527a7e531
The fix inserts checkHiddenCommits and getMissingData into the chain after writePack, so GitProxy enumerates commits newly reachable through the push before evaluating approval state. The added newIdxFiles field on the Action object tracks the pack index files written during the push, enabling accurate discovery of hidden ancestors.
Detect Identity Attacks the Moment Authentication Fails
Singularity™ Identity surfaces credential misuse, lateral movement, and privilege escalation in real time, so you can contain the breach before it spreads.
Stop Identity AttacksDetection Methods for CVE-2025-54585
Indicators of Compromise
- Approved child-branch pushes whose history contains commits that were never individually approved on their parent branch.
- GitProxy audit records showing branch-creation events immediately preceding approval of unexpected commit ranges.
- Divergence between the approved commit SHA list and the set of SHAs introduced into the upstream repository.
Detection Strategies
- Reconcile GitProxy approval logs against upstream Git history: for each approved push, compute the set of newly reachable commits and compare to the approved commit range.
- Alert when a branch-creation push includes ancestor commits authored by a different user than the pusher or approver.
- Flag approvals performed by users holding canUserApproveRejectPush on branches created within minutes of their first appearance.
Monitoring Recommendations
- Enable verbose logging in GitProxy and forward push and approval events to a centralized log platform.
- Monitor the deployed GitProxy version and alert on any instance running 1.19.1 or earlier.
- Track approval-to-push latency and approver identity to detect anomalous rubber-stamping of branch-creation pushes.
How to Mitigate CVE-2025-54585
Immediate Actions Required
- Upgrade GitProxy to version 1.19.2 or later across all deployments.
- Audit recently approved pushes for hidden commits introduced via branch creation and revert or re-review as needed.
- Restrict the set of users assigned canUserApproveRejectPush and require approvers to inspect full commit ranges before approving.
Patch Information
The fix is available in GitProxy v1.19.2. Key changes are implemented in commits a620a2f and f99fe42, which add checkHiddenCommits and getMissingData steps to the push chain and track new pack index files via newIdxFiles. Additional technical context is documented in GitHub Security Advisory GHSA-39p2-8hq9-fwj6.
Workarounds
- If upgrading is not immediately possible, require approvers to manually inspect the full commit graph of any branch-creation push before approving.
- Temporarily disable new-branch creation through GitProxy and require all branches to be created upstream by trusted operators.
- Narrow approver assignments and enforce two-person approval for pushes that create new branches.
# Upgrade GitProxy to the patched release
npm install -g @finos/git-proxy@1.19.2
# Verify the installed version
git-proxy --version
# Restart the GitProxy service after upgrade
systemctl restart git-proxy
Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

