Skip to main content
Vulnerability Database/CVE-2025-54585

CVE-2025-54585: Finos GitProxy Auth Bypass Vulnerability

CVE-2025-54585 is an authentication bypass flaw in Finos GitProxy that lets attackers circumvent approval controls during branch creation. This post explains its impact, affected versions, and mitigation steps.

Published:

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.

typescript
// 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
typescript
// 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 Attacks

Detection 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.
bash
# 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.

Experience the Most Advanced Cybersecurity Platform

See how the world’s most intelligent, autonomous cybersecurity platform can protect your organization today and into the future.