Research · Detection

GitHub Enterprise Server CVE-2026-3854: push-option RCE triage for self-hosted source platforms

Last reviewed:

GitHub Enterprise Server CVE-2026-3854 turns repository push access into possible server compromise. Patch GHES, review push logs, and check CI trust paths.

Why this one matters

GitHub Enterprise Server CVE-2026-3854 is the strongest remaining library topic from the recent feed because it sits on a trust boundary most organisations do not treat as an internet edge: the self-hosted source-code platform. GitHub's advisory describes a remote code execution flaw in GitHub Enterprise Server caused by improper neutralisation of special elements in user-controlled git push option values. The attacker needs push access to a repository, but that is a low bar in many environments. Contractors, service accounts, automation users and internal developers often have push rights somewhere.

The bug is classified as CWE-77, Improper Neutralization of Special Elements used in a Command. During a push operation, user-supplied push option values were included in internal service headers. The internal header format used a delimiter that could also appear in user input. A crafted push option could inject extra metadata fields, which could then affect how downstream services handled the push.

That turns a routine developer action into a server-side execution path. A vulnerable GHES instance is not only a repository store. It is usually attached to CI/CD runners, package publication, deployment credentials, pull request checks, branch protection, webhooks, OAuth apps and audit exports. Compromise of the platform can affect code integrity and release trust even before an attacker touches production infrastructure.

What changed in the signal

A13E's 29 April intel brief flagged CVE-2026-3854 as a high-priority source-code platform issue. Later feed review kept cPanel and LiteLLM at the top because both had active exploitation reporting, and those topics already have a13e research pages. CVE-2026-3854 remains the next useful research post because it is different from routine patch triage. It asks whether a self-hosted development platform should be handled like an exposed administration plane.

The public record also changed in a way operators need to notice. GitHub's advisory and NVD both describe the same vulnerable push-option path, but the fixed-version wording differs across updates. GitHub's advisory lists fixes at 3.14.24, 3.15.19, 3.16.15, 3.17.12, 3.18.6 and 3.19.3, while NVD's current description lists later patch releases: 3.14.25, 3.15.20, 3.16.16, 3.17.13, 3.18.7 and 3.19.4. Treat the later versions as the safer operational target unless your vendor support channel gives a branch-specific exception.

GitHub reports no exploitation beyond the researchers' testing on GitHub-hosted services. That is reassuring for GitHub.com users, but it does not settle the risk for privately run GHES appliances. A GHES owner has to answer a separate question: was the instance patched, reachable, and logging enough detail to rule out hostile use of the push path?

Attack-plane analysis

This maps best to ATT&CK T1190, Exploit Public-Facing Application. The affected surface is the network-exposed Git service and its server-side push processing path. The attacker does not need an administrator account, but they do need an authenticated identity with push rights to at least one repository. In a large company, that can include a low-value test repository, an abandoned team project, or a machine user created for automation years ago.

That access requirement changes the investigation. Do not look only for unauthenticated internet scanning. Look for odd authenticated pushes, strange push option usage, pushes from accounts that should not use command-line Git directly, and pushes from source networks outside the normal developer or build environment. If GHES is reachable through SSH and HTTPS, check both paths. The useful record may sit in GHES audit logs, Git service logs, SSH logs, reverse-proxy records, identity-provider sign-in logs and CI webhook trails.

A portable CloudSigma rule is not embedded here. The public signal is strong enough for a triage guide, but a single Sigma rule would be too environment-specific. GHES logging differs by version, topology and whether operators export audit events to a SIEM. A detection that only matches the word push-option would miss quiet variants and may alert on legitimate tooling. A detection that matches every push from low-privilege users would drown the SOC. For now, the safer library guidance is to patch and hunt from local GHES logs rather than publish a weak generic rule.

Patch and exposure checklist

Start with the appliance inventory. Find every GitHub Enterprise Server instance, including disaster-recovery nodes, staging appliances, lab copies, acquisition remnants and appliances managed by separate development teams. Source platforms are easy to miss because they are owned by engineering rather than central infrastructure.

Record the exact GHES version for each instance. Do not stop at the major branch. The fixed build is a patch-level boundary, and the public fixed-version wording changed between advisory surfaces. If you can move to 3.14.25, 3.15.20, 3.16.16, 3.17.13, 3.18.7, 3.19.4 or later on the relevant branch, do that. Where a support constraint forces use of the earlier fixed builds listed in the GitHub advisory, document the exception and the vendor evidence.

Check network exposure. GHES often begins as an internal-only service and later gains VPN, contractor, partner or internet-facing access for convenience. If SSH or HTTPS Git endpoints are reachable from broad networks, narrow them while patching. The risk is not only anonymous scanning. A valid low-privilege account can be enough.

Review push access sprawl. List accounts with push rights across public, internal, archived and test repositories. Prioritise dormant users, stale service accounts, contractors whose projects ended, personal access tokens with broad repository scope and automation identities that can push to throwaway repositories. The exploit path does not require a high-value repository if server-side processing can be reached through a low-value one.

What to investigate after patching

Patching closes the known path. It does not prove the appliance was clean before the update.

Search for unusual push-option activity first. Git push options are legitimate, but many organisations barely use them. If your environment has no standard workflow that sends push options, any non-empty push option value deserves a closer look. If push options are used by automation, build a baseline from known CI systems and developer tooling before treating every hit as hostile.

Look for push events that do not match normal behaviour. Useful pivots include pushes from new IP ranges, unusual SSH keys, first-time activity by old accounts, pushes into repositories with little history, repeated failed pushes followed by a successful one, and pushes followed by unexpected CI jobs. Tie GHES events to identity-provider logs. If an account pushed from a geography or device posture that differs from its normal pattern, investigate the account as well as the appliance.

Then check downstream trust paths. A GHES compromise can matter even if source code was not obviously changed. Review webhooks, deploy keys, GitHub Apps, Actions or runner integrations, package publishing tokens, branch protection changes, repository visibility changes and new administrators. If GHES feeds an external CI system, compare job creation, runner commands and secrets access around the suspect window.

Preserve logs before rotating everything. Appliance logs, SSH records, proxy logs and identity-provider exports can age out quickly. Take a snapshot or export the relevant period, then rotate high-risk credentials. If you rotate first and lose evidence, you may remove the only useful trace of how far the event went.

Recommended actions

  1. Inventory all GHES appliances, including non-production and acquisition-owned instances.
  2. Upgrade to the latest fixed release available for your branch, using the newer NVD fixed-version list as the safer target where possible.
  3. Restrict SSH and HTTPS Git access to trusted networks while patching and during the first investigation pass.
  4. Review repository push permissions for dormant users, contractors, broad service accounts and low-value repositories that still reach the same server-side push path.
  5. Search GHES, SSH, proxy and identity logs for unusual push-option use and authenticated pushes from unfamiliar networks.
  6. Check CI, webhook, deploy-key and package-publishing paths for changes after suspicious pushes.
  7. Preserve evidence before broad token rotation, then rotate credentials tied to affected repositories or integrations.

The short version: treat GHES as production infrastructure, not a developer convenience. If an attacker can turn one repository push into code execution on the source platform, the blast radius includes code, build pipelines and the trust people place in every release that follows.

01 Covered ATT&CK techniques