CVE-2026-102827

Updated on 29 Sep 2026

Severity

8.1 High severity

Overview

About vulnerability

simple-git’s blockUnsafeOperationsPlugin blocks dangerous git options (–upload-pack/–receive-pack/–exec/…) unless the consumer opts in via unsafe:{allowUnsafePack:true}. Detection (@simple-git/argv-parser detectVulnerableFlags) matches the parsed flag NAME against literal-spelling patterns: /–(upload|receive)-pack/ (requires the literal ‘-pack’) and the string ‘–exec’. But git accepts unambiguous prefix abbreviations of long options, and expandToken (token-expander.ts) returns the LITERAL token as flag.name (it uses the spec only for needsNext, never to canonicalize). So git push --receive-p=&lt;cmd&gt; parses with flag.name=’–receive-p’, which /–(upload|receive)-pack/ does NOT match, yet git expands –receive-p -> –receive-pack and runs <cmd> (on a local/file remote, locally). The clone side is robust (its ‘–u’ substring rule catches every –upload* abbreviation); the push –receive-* and –exe* abbreviations have no equivalent rule and slip through.

Proof of concept (latest: simple-git 3.36.0, @simple-git/argv-parser 1.1.1, default unsafe plugin ON): Gate vulnerabilityCheck: ‘push –receive-pack=touch…’ -> BLOCKED; ‘push –receive-pa=touch…’ and ‘push –receive-p=touch…’ -> BYPASS (empty vulns); ‘–exec=’ BLOCKED, ‘–exe=’ BYPASS. End-to-end via simpleGit().push(): CONTROL git.push([’../bare’,‘HEAD:refs/heads/c’,’–receive-pack=touch /tmp/pwned_ctrl;’]) -> throws GitPluginError ‘Use of –upload-pack or –receive-pack is not permitted…’; no command runs. BYPASS git.push([’../bare’,‘HEAD:refs/heads/e2e’,’–receive-p=touch /tmp/pwned_e2e;’]) -> NO GitPluginError; /tmp/pwned_e2e CREATED (git executed the injected command); only a later GitError surfaces. Direct git confirms git push ../bare --receive-p='touch X;' HEAD:refs/heads/m and --exe='touch Y;' both execute on a local/path remote.

Impact: any app relying on simple-git’s default unsafe-operations protection while passing attacker-influenced options/args into a git push (local/file remote, or attacker-influenced receive-pack target) can be made to execute arbitrary commands – the exact protection CVE-2026-28291 provided, defeated by an abbreviated spelling. Same class/impact as GHSA-jcxm-m3jx-f287, on the push path.

Remediation: canonicalize git option abbreviations before matching (resolve to the canonical long name via the per-task flag spec in expandToken), or match on the option stem/prefix down to the shortest unambiguous form for push receive-pack/exec (mirroring the clone-side ‘–u’ approach). Also audit –template and -c/config-write detection for the same abbreviation gap.

Credit: anir0y (independent security research).

Details

Affected product:
Node.js , Vue , aegir , ai-sdk-harness-cline , braintrust-sdk-javascript , cline , cline-llms , cline-sdk , cline-shared , create-strapi , create-strapi-app , create-zephyr-apps , datadog-ci , devtools , git-js , libp2p-interfaces-compliance-tests , mastra-braintrust , netlify-cms-proxy-server , nuxt , nuxt-devtools-ui-kit , nuxt-docs , nuxt-kit , nuxt-nitro-server , nuxt-rspack-builder , nuxt-schema , nuxt-vite-builder , nuxt-vite-server , nuxt-webpack-builder , parcel , parcel-bundler-default , parcel-events , parcel-feature-flags , parcel-markdown-ansi , parcel-namer-default , parcel-optimizer-css , parcel-optimizer-html , parcel-optimizer-image , parcel-optimizer-swc , parcel-packager-css , parcel-packager-html , parcel-packager-js , parcel-reporter-dev-server , parcel-runtime-browser-hmr , parcel-runtime-js , parcel-runtime-rsc , parcel-runtime-service-worker , parcel-rust , parcel-rust-linux-arm64-gnu , parcel-rust-linux-arm64-musl , parcel-rust-linux-x64-gnu , parcel-transformer-babel , parcel-transformer-css , parcel-transformer-html , parcel-transformer-json , parcel-transformer-node , parcel-transformer-postcss , parcel-transformer-posthtml , parcel-transformer-svg , parcel-utils , powersync-nuxt , rollup-plugin-zephyr , sentry-nuxt , strapi , strapi-admin , strapi-cloud-cli , strapi-content-manager , strapi-content-releases , strapi-content-type-builder , strapi-core , strapi-data-transfer , strapi-database , strapi-email , strapi-generators , strapi-i18n , strapi-logger , strapi-openapi , strapi-permissions , strapi-plugin-cloud , strapi-plugin-color-picker , strapi-plugin-documentation , strapi-plugin-graphql , strapi-plugin-sentry , strapi-plugin-users-permissions , strapi-provider-email-mailgun , strapi-provider-email-nodemailer , strapi-provider-email-sendgrid , strapi-provider-upload-aws-s3 , strapi-provider-upload-cloudinary , strapi-provider-upload-local , strapi-review-workflows , strapi-strapi , strapi-types , strapi-typescript-utils , strapi-upgrade , strapi-upload , strapi-utils , tobilu-qmd , virmator , virmator-init , virmator-publish , vite-plugin-tanstack-start-zephyr , vite-plugin-vinext-zephyr , vite-plugin-zephyr , with-zephyr , wordpress-env , yeoman-generator , zephyr-agent , zephyr-astro-integration , zephyr-edge-contract , zephyr-metro-plugin , zephyr-modernjs-plugin , zephyr-native-cache , zephyr-nuxt-module , zephyr-packages , zephyr-repack-plugin , zephyr-rolldown-plugin , zephyr-rsbuild-plugin , zephyr-rspack-plugin , zephyr-rspress-plugin , zephyr-tap-runtime , zephyr-webpack-plugin , zephyr-xpack-internal
Affected packages:
simple-git @ 3.36.0 (+1332 more)

Fixes