Skip to content

Matched advisory candidates (shard 24) - #1610

Open
BrewTestBot wants to merge 1 commit into
mainfrom
matched-advisories-24
Open

BrewTestBot wants to merge 1 commit into
mainfrom
matched-advisories-24

Conversation

@BrewTestBot

@BrewTestBot BrewTestBot commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

Automated candidates via brew advisory-match --formula-list (planned workers) --new-history, sharded by formula (SHA-256 bucket 24). See CONTRIBUTING.md for the review checklist.

Partial daily run: successful buckets only; the older standing PR may overlap.

Run and review artifacts: https://github.com/Homebrew/advisory-database/actions/runs/40657111712

@coderabbitai

coderabbitai Bot commented Oct 24, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

📝 Summary

Summary by CodeRabbit

  • Advisory Updates
    • Updated affected-version and upstream evidence details across existing advisories for Paramiko, SQLAlchemy, GitPython and git-annex.
    • Added advisories for CVE-2026-112940 affecting Homebrew hf and rapid-mlx, with affected versions, impacts, conditions and workarounds.
    • Added fdroidserver advisories covering multiple GitPython security issues, with affected versions and supporting references.
    • Added advisories for rapid-mlx covering issues in pypdf and the MCP Python SDK, including affected versions, impacts and upstream fixes.
    • Added a vpn-slice advisory for excessive CPU use in dnspython DNS name decompression.

The pull request updates existing fdroidserver and git-annex advisory metadata. It changes one fdroidserver affected range to fixed and adds advisories for reported issues affecting fdroidserver, hf, rapid-mlx and vpn-slice.

Changes: Existing fdroidserver advisory updates

Layer / File(s) Summary
Paramiko, SQLAlchemy and GitPython metadata
advisories/BREW-fdroidserver-CVE-*.json
Existing advisories update affected-resource versions, matching upstream evidence and modified timestamps. Most changes update GitPython from 3.2.0 to 3.2.1; Paramiko and SQLAlchemy records also receive version updates.
Fixed affected range
advisories/BREW-fdroidserver-CVE-2026-114145.json
The advisory records Homebrew version 2.4.5_7 as fixed and updates the GitPython resource and evidence to 3.2.1.

Existing git-annex advisory updates

Layer / File(s) Summary
Hackage version evidence
advisories/BREW-git-annex-*.json
The evidence records update from git-annex 10.20261020 to 10.20261026, with matching package keys and modified timestamps.

New security advisories

Layer / File(s) Summary
fdroidserver GitPython advisories
advisories/BREW-fdroidserver-CVE-2026-11085*.json, advisories/BREW-fdroidserver-CVE-2026-11086*.json
Six new advisories describe reported GitPython issues, affected fdroidserver versions, impact conditions, evidence and references.
filelock advisories
advisories/BREW-hf-CVE-2026-112940.json, advisories/BREW-rapid-mlx-CVE-2026-112940.json
The records describe CVE-2026-112940, affected versions, conditional lock and file effects, workarounds, upstream fix data and references.
rapid-mlx pypdf and MCP advisories
advisories/BREW-rapid-mlx-CVE-2026-113786.json, advisories/BREW-rapid-mlx-CVE-2026-115*.json, advisories/BREW-rapid-mlx-CVE-2026-116*.json
The advisories describe reported pypdf and MCP issues, affected versions, upstream fixes, severity data and references.
vpn-slice dnspython advisory
advisories/BREW-vpn-slice-CVE-2026-114605.json
The advisory records the affected package range, dnspython evidence and fix version, and reported CPU use from crafted DNS messages.

Priority: Normal

Merge Risk: Moderate · up to 0faf3

Some new fdroidserver advisories flag Homebrew builds that bundle GitPython versions outside the upstream affected range, which could produce false vulnerability alerts for older versions. One severity vector may also describe a file-disclosure issue as an integrity issue. Correct the lower bounds, and confirm or correct the CVSS vector, before merging.

Pre-merge checks: Passed 4
Check name Status Explanation
Title check Passed The title clearly identifies the main change: matched advisory candidates generated for shard 24.
Description check Passed The description explains that the pull request contains automated advisory candidates generated by the matching command, identifies the shard, and provides review context and artefacts.
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@BrewTestBot
BrewTestBot force-pushed the matched-advisories-24 branch 4 times, most recently from 6233c59 to ef85490 Compare October 27, 2026 21:37

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1


Review info
Run configuration
Commits

Reviewing files that changed from the base of the PR and between 6233c59 and ef85490.

Files selected for processing: 60
  • advisories/BREW-fdroidserver-CVE-2008-0299.json
  • advisories/BREW-fdroidserver-CVE-2012-0805.json
  • advisories/BREW-fdroidserver-CVE-2018-1000805.json
  • advisories/BREW-fdroidserver-CVE-2018-7750.json
  • advisories/BREW-fdroidserver-CVE-2019-7164.json
  • advisories/BREW-fdroidserver-CVE-2019-7548.json
  • advisories/BREW-fdroidserver-CVE-2022-24302.json
  • advisories/BREW-fdroidserver-CVE-2022-24439.json
  • advisories/BREW-fdroidserver-CVE-2023-40267.json
  • advisories/BREW-fdroidserver-CVE-2023-40590.json
  • advisories/BREW-fdroidserver-CVE-2023-41040.json
  • advisories/BREW-fdroidserver-CVE-2023-48795.json
  • advisories/BREW-fdroidserver-CVE-2024-22190.json
  • advisories/BREW-fdroidserver-CVE-2026-100689.json
  • advisories/BREW-fdroidserver-CVE-2026-110855.json
  • advisories/BREW-fdroidserver-CVE-2026-110856.json
  • advisories/BREW-fdroidserver-CVE-2026-110857.json
  • advisories/BREW-fdroidserver-CVE-2026-110858.json
  • advisories/BREW-fdroidserver-CVE-2026-110859.json
  • advisories/BREW-fdroidserver-CVE-2026-110860.json
  • advisories/BREW-fdroidserver-CVE-2026-114145.json
  • advisories/BREW-fdroidserver-CVE-2026-42215.json
  • advisories/BREW-fdroidserver-CVE-2026-42284.json
  • advisories/BREW-fdroidserver-CVE-2026-44243.json
  • advisories/BREW-fdroidserver-CVE-2026-44244.json
  • advisories/BREW-fdroidserver-CVE-2026-44405.json
  • advisories/BREW-fdroidserver-CVE-2026-67322.json
  • advisories/BREW-fdroidserver-CVE-2026-67323.json
  • advisories/BREW-fdroidserver-CVE-2026-67324.json
  • advisories/BREW-fdroidserver-CVE-2026-67325.json
  • advisories/BREW-fdroidserver-CVE-2026-67326.json
  • advisories/BREW-fdroidserver-CVE-2026-69097.json
  • advisories/BREW-fdroidserver-CVE-2026-73619.json
  • advisories/BREW-fdroidserver-CVE-2026-73620.json
  • advisories/BREW-fdroidserver-CVE-2026-73621.json
  • advisories/BREW-fdroidserver-CVE-2026-73622.json
  • advisories/BREW-fdroidserver-CVE-2026-73623.json
  • advisories/BREW-fdroidserver-CVE-2026-73624.json
  • advisories/BREW-fdroidserver-CVE-2026-73625.json
  • advisories/BREW-fdroidserver-CVE-2026-76217.json
  • advisories/BREW-fdroidserver-CVE-2026-76218.json
  • advisories/BREW-fdroidserver-CVE-2026-76219.json
  • advisories/BREW-fdroidserver-CVE-2026-76220.json
  • advisories/BREW-fdroidserver-CVE-2026-76221.json
  • advisories/BREW-fdroidserver-CVE-2026-76222.json
  • advisories/BREW-fdroidserver-CVE-2026-78675.json
  • advisories/BREW-fdroidserver-CVE-2026-78676.json
  • advisories/BREW-fdroidserver-CVE-2026-78677.json
  • advisories/BREW-fdroidserver-CVE-2026-78678.json
  • advisories/BREW-fdroidserver-CVE-2026-78679.json
  • advisories/BREW-fdroidserver-CVE-2026-87817.json
  • advisories/BREW-fdroidserver-CVE-2026-87819.json
  • advisories/BREW-git-annex-CVE-2014-6274.json
  • advisories/BREW-git-annex-CVE-2017-12976.json
  • advisories/BREW-git-annex-CVE-2018-10857.json
  • advisories/BREW-git-annex-CVE-2018-10859.json
  • advisories/BREW-git-annex-HSEC-2023-0012.json
  • advisories/BREW-hf-CVE-2026-112940.json
  • advisories/BREW-rapid-mlx-CVE-2026-112940.json
  • advisories/BREW-vpn-slice-CVE-2026-114605.json
Files skipped from review as they are similar to previous changes: 47

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.

"type": "ECOSYSTEM",
"events": [
{
"introduced": "0.7.0"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Major · Data Integrity & Integration · Quick win

Supported by static analysis

Script executed:

sed -n '1,80p' advisories/BREW-fdroidserver-CVE-2026-110860.json
sed -n '15,40p' advisories/BREW-fdroidserver-CVE-2026-110859.json
grep -n -i 'introduced\|affected range\|resource' CONTRIBUTING.md | head -40

Repository: Homebrew/advisory-database

Length of output: 25630


Script executed:

set -o pipefail
printf '%s\n' '--- relevant CONTRIBUTING guidance ---'
nl -ba CONTRIBUTING.md | sed -n '24,68p;94,112p'
printf '%s\n' '--- sibling fdroidserver advisory boundaries and metadata ---'
for f in advisories/BREW-fdroidserver-CVE-2026-11085{5,6,7,8,9}.json advisories/BREW-fdroidserver-CVE-2026-110860.json; do
  echo "### $f"
  python3 - "$f" <<'PY'
import json, pathlib, sys
p = pathlib.Path(sys.argv[1])
d = json.loads(p.read_text())
a = d["affected"][0]
print("upstream:", d.get("upstream"))
print("range:", a["ranges"])
print("ecosystem_specific:", a.get("ecosystem_specific"))
print("database_specific:", d.get("database_specific"))
PY
done
printf '%s\n' '--- candidate matcher and ingest references ---'
rg -n -F --glob '*.{rb,py,ts,js}' -e 'introduced' -e 'new-history' -e 'range_state' -e 'resource_purl' -e 'formula history' -e 'history' . | head -240
printf '%s\n' '--- relevant repository files ---'
rg --files | rg '(^|/)(brew|ingest|match|advis|formula|history|CONTRIBUTING)' | head -240

Repository: Homebrew/advisory-database

Length of output: 41594


Script executed:

pwd; nl -ba CONTRIBUTING.md | sed -n '30,65p'; for f in advisories/BREW-fdroidserver-CVE-2026-11085{5,6,7,8,9}.json advisories/BREW-fdroidserver-CVE-2026-110860.json; do echo "### $f"; grep -n -E '"introduced"|"fixed"|"upstream_fixed_in"|"resource_purl"|"subject_version"|"range_state"' "$f"; done

Repository: Homebrew/advisory-database

Length of output: 7385


Script executed:

set -o pipefail
printf '%s\n' '--- boundary fixtures and comments ---'
nl -ba spec/advisory_records_spec.rb | sed -n '430,525p'
printf '%s\n' '--- override boundary fixtures ---'
nl -ba spec/overrides_spec.rb | sed -n '190,365p'
printf '%s\n' '--- advisory rederive implementation ---'
nl -ba lib/advisory_rederive.rb | sed -n '1,180p'
printf '%s\n' '--- reviewed advisory and history-related files ---'
git diff --stat f5f213fd71f52ab1b30a810cf36d42680fb494fe ef85490540c42485094ea475bcc741c88ee53a87 -- advisories/BREW-fdroidserver-CVE-2026-110860.json
git ls-tree -r --name-only ef85490540c42485094ea475bcc741c88ee53a87 | rg -i 'fdroid|formula|history|matched|brew'

Repository: Homebrew/advisory-database

Length of output: 45680


Web query:

Homebrew brew advisory-match introduced boundary formula history upstream affected range resource

Result:

<source_evidence>
<source kind="search">
<title>Homebrew Documentation: Advisory Matching</title>
<location>https://docs.brew.sh/Advisory-Matching</location>
<excerpt>citeturn0search0 [wordlim: 200] Crawled: 2 weeks ago; `brew advisory-match` prepares candidate records for the Homebrew advisory database. ... Before running this mode, protect hand-reviewed Homebrew boundaries with `preserve_homebrew_ranges: true` under the formula and advisory in `overrides.yml`.
Image: Homebrew Documentation logo

# Homebrew Documentation

# Advisory Matching

`brew advisory-match` prepares candidate records for the Homebrew advisory database. It is an authoring tool, not the installed-package scanner provided by `brew vulns`. Candidates still need human review before publication.

## Range accuracy and coverage

With history enabled, a candidate with a comparable current state and no reviewed range must have an affected interval that can be established from formula history. This applies even when the current formula is known to be affected: knowing today’s state does not establish when the affected range began. An `introduced: &quot;0&quot;` boundary asserts that every earlier version is affected; it is not a marker for an unknown introduction.

Automatic matching deliberately favours range accuracy over coverage. Unreadable or uncomparable history and disjoint affected intervals can prevent a new record from being emitted. The command warns and counts these as history-unavailable skips instead of inventing a boundary. This includes a historical subject whose prerelease suffix changes its `SEMVER` range state compared with its release version. A skip does not mean the formula is unaffected, so an ingest run can omit a currently affected formula and is not evidence of complete vulnerability coverage. Reviewers must establish the ranges and matching provenance together from upstream evidence and formula build history, then contribute the record manually.

For a new record, a `pkg_version` shared by affected and unaffected builds is conservatively included in the affected interval, because the advisory cannot distinguish those builds by version. This can happen when a resource changes without a formula revision bump. For the same reason, a fix that shares its `pkg_version` with affected builds is recorded at the next version with only fixed builds, and a range stays unchanged while the current version also has an affected build. A distinct unaffected version inside the interval still requires review. Existing-range reconciliation and reintroduction checks retain their stricter rules for mixed builds, so reconciliation reports a record whose `introduced` version has mixed builds as an unrepresentable interval and leaves it unchanged.

Current-version prerelease ambiguity produces an uncomparable review lead with no `range_state`, reduced confidence and `database_specific.review_reason: &quot;prerelease_boundary&quot;`. Ingest drops these leads and lists their IDs by reason in its run summary. An explicit `range_state` override for the formula and advisory resolves the current-state ambiguity; an `upstream_fixed_in` override alone does not. Without a reviewed state override, existing reviewed records stay unchanged.

A reviewed state override does not establish historical boundaries. When its state disagrees with comparable upstream evidence, or the upstream evidence cannot be checked, a new range needs manual review. Existing reviewed ranges are preserved rather than replaced with guessed introductions; range transitions and changed provenance still require their own checks.

## History options

`--new-history` requires `--output` and reuses existing reviewed ranges where possible; a successful replay does not independently verify those boundaries. `--json` without `--output` has no existing reviewed records to reuse, so history checks still apply to new comparable candidates. `--no-history` explicitly uses unverified zero/current-version boundaries for new ranges and cannot be combined with `--new-history`. It is an unchecked authoring mode, not a way to validate a skipped candidate.

## Reconciling existing ranges

`--reconcile-history --output advisories --overrides data/overrides.yml` explicitly revisits existing `source: matched`, bump-fixed records with one terminal interval. It requires complete formula history and matching provenance, with the same result on the latest supported macOS and Linux for both ARM and Intel. These simulations check declared formula and resource versions; they do not rebuild historical bottles or verify installation steps. It can narrow an affected interval or delete a record proven never affected; it preserves other fields and updates `modified` only for a range change. Generated records, patch fixes and open or multiple intervals are left unchanged. For records missed by current matching, complete registry-resource evidence can supply versionless upstream queries even after a resource has been removed. The fresh results must reproduce the stored upstream family and range basis, and every resource identity must occur in formula history on every platform. Stored subject versions only reproduce the range basis; historical decisions use versions from the formula sources. A missing historical resource holds the record as `resource_not_found`; a stored family absent from the fresh query results is `resource_not_rediscovered`. Mixed, incomplete or non-resource provenance still requires current discovery. These fallback queries cannot create records and respect formula skips and preserved Homebrew ranges. When a prerelease suffix changes a subject’s `SEMVER` range state compared with its release version, `prerelease_boundary` holds the record for review. The command reports skip reasons and the number of matched records it did not revisit; success does not establish complete coverage.

Before running this mode, protect hand-reviewed Homebrew boundaries with `preserve_homebrew_ranges: true` under the formula and advisory in `overrides.yml`. The pin applies across advisory aliases and is separate from `upstream_fixed_in`, which describes the upstream fix. Unavailable history or upstream records, changed subjects, conflicting platform results and advisory-specific patches require review. A failed upstream lookup holds every record for that formula with `upstream_unavailable`; a failed batch query holds its entire formula batch. A confirmed HTTP 404 while following an upstream link is cached as a missing target; a record with no resolved targets keeps its original evidence. A 404 for a supplemental CPANSA CVE lookup uses the CPANSA evidence for that CVE, including on subsequent platform passes. A 404 for an ID returned directly by a query still holds the formula, as do other request failures. Reconciliation continues with the remaining formulae, so a successful command can include these holds. Complete history includes earlier lifetimes of deleted and re-added formulae, skipping revisions where Git proves the formula path was absent. A rename into the current formula name starts that name’s history; the old formula name’s builds are excluded. Historical loading ignores obsolete `devel` blocks and uses the stable build. It also accepts legacy `sha1` and `md5` declarations, `bottle :unneeded` and `plist_options` without fetching or building historical sources. This compatibility applies to all `FormulaVersions` callers, including daily matching; ordinary current-formula loading is unchanged. Any remaining unreadable build still holds the record, even when it appears before or after the affected interval. A historical formula’s `odie` option check becomes a failed load rather than terminating the command. The reconciliation summary counts failed formula revisions and affected formulae separately from revision/platform failures and per-record hold reasons. Reason counts, such as `history_unavailable`, count held records and may overlap. With `--verbose`, each failed load includes its formula, revision, path, platform and original error, once per revision/path/platform for that formula. Proven absent paths are not load failures; failed Git absence checks remain failures. Unattributed patches and `inreplace` alone do not block reconciliation. This mode cannot be combined with `--new-history`, `--no-history`, `--json` or `--index` and does not enable reconciliation in ordinary ingest runs.

For bounded daily or reconciliation runs, `--formula-list=&lt;file&gt;` selects newline-separated core formula names instead of `--all` or named arguments. It requires `--new-history` or `--reconcile-history`, retains bulk queries and uses the Repology index without live per-formula fallbacks. Only listed names still present in core are loaded; removed names are reported and their records remain unchanged. An empty list performs no matching, and the unvisited-record summary is scoped to the list. The advisory database partitions these lists by formula so each execution shard can be saved and retried independently.</excerpt>
</source>
<source kind="search">
<title>advisory-database/CONTRIBUTING.md at main · Homebrew/advisory-database · GitHub</title>
<location>https://github.com/Homebrew/advisory-database/blob/main/CONTRIBUTING.md</location>
<excerpt>citeturn0search1 [wordlim: 200] Crawled: last month; Advisories in this repository come from three places: records generated from `resolves` annotations on `homebrew/core` formula patches, candidate records matched against external OSV feeds by `brew advisory-match`, and records contributed directly by pull request.

# CONTRIBUTING.md

Copy path

[Input: Go to file]

Blame More file actions

Blame More file actions

## Latest commit

 

## History

History

main

## Breadcrumbs

  1. advisory-database

/

# CONTRIBUTING.md

Copy path

Top

## File metadata and controls

  * Preview

  * Code

  * Blame

88 lines (59 loc) · 7.92 KB

# Contributing

Advisories in this repository come from three places: records generated from `resolves` annotations on `homebrew/core` formula patches, candidate records matched against external OSV feeds by `brew advisory-match`, and records contributed directly by pull request. All live under `advisories/` as OSV-schema JSON and are validated against that schema on every push.

The concatenated advisory index is built from the reviewed records on `main` and served at formulae.brew.sh/api/advisories.json.

## Reporting a fixed vulnerability

If a `homebrew/core` formula already ships a patch that fixes a CVE, the simplest route is to annotate the patch. Open a pull request against Homebrew/homebrew-core adding `resolves &quot;CVE-YYYY-NNNNN&quot;` to the relevant `patch do` block; see `libquicktime.rb` for an example. CVE identifiers appearing in the patch URL or applied file paths are picked up automatically without an explicit `resolves`. The daily `Regenerate` workflow will pick it up and write a `BREW-&lt;formula&gt;-&lt;CVE&gt;` record here automatically. Generated records carry `&quot;database_specific&quot;: {&quot;source&quot;: &quot;generated&quot;}`. The workflow refreshes their upstream-derived fields (`summary`, `severity`, `references`, `ecosystem_specific.patches`) on each run but preserves `published` and `affected[].ranges` from whatever is on disk, so a hand-corrected `fixed` boundary will not be overwritten.

## Contributing an advisory directly

Open a pull request adding a file under `advisories/` when you want to record something the generated path cannot express, most commonly that a formula version is affected and Homebrew has not yet applied a fix.

Before opening the PR, report the issue upstream according to the project&#39;s security policy and wait for it to be acknowledged. Versions are the formula version as `brew info` reports it, with an `_N` suffix when the revision is nonzero. Link the upstream CVE, GHSA or advisory in `upstream` and `references`.

## Reviewing matched candidates

Records with `&quot;database_specific&quot;: {&quot;source&quot;: &quot;matched&quot;, ...}` are produced by `brew advisory-match` (in Homebrew/brew), which queries OSV.dev&#39;s GIT, language-registry and distro ecosystems plus CPANSA for a formula and emits one candidate per CVE reached. These arrive as automated PRs and need a human to confirm the match before merge.

`database_specific` tells you how the match was made:

  * `strategy` is the highest-precision path that reached the CVE: `git` (the formula&#39;s forge repo), `registry` (a PyPI/npm/crates/... package derived from `stable.url` or a `resource`), `cpansa` (a CPAN distribution), or `distro` (a Debian/Ubuntu/... source package name mapped via Repology).
  * `confidence` follows from strategy and whether a comparable version range was found: `high` for `git`/`registry` with a range, `medium` when no comparable range was found (typically GIT commit-SHA events), `low` for `distro`.
  * `upstream_evidence` lists every path that reached the CVE, each with the `{ecosystem, name, subject_version}` that was queried.

`affected[0].ecosystem_specific` tells you what the range check concluded:

  * `range_state` is `affected` (the shipped version is inside an upstream affected range), `fixed` (past one), or absent (no comparable range; the reviewer sets the boundary).
  * `upstream_fixed_in` is the upstream version the matched range says fixes it.
  * `resource` and `resource_purl` are set when the affected subject is a vendored `resource` block rather than the formula&#39;s primary source.
  * `&quot;fix&quot;: &quot;bump&quot;` and a `fixed` event in `ranges` are only present when `range_state` is `&quot;fixed&quot;`.

Before merging, check:

  * The `upstream_evidence` keys point at this formula&#39;s actual upstream. A `distro`-only hit can reach a CVE for an unrelated package that shares a Repology project (for example a `wget2` CVE surfaced against `wget`); close those.
  * The CVE is not a distro-specific patch. Open https://osv.dev/vulnerability/CVE-YYYY-NNNNN and confirm the affected package and description match the upstream project, not a distribution&#39;s packaging of it.
  * If `range_state` is `&quot;fixed&quot;`, the `fixed` boundary in `ranges` is the `pkg_version` at which Homebrew first shipped the fix. `brew advisory-match` derives this by walking `homebrew-core` history; spot-check it against `git log -p -- Formula/&lt;letter&gt;/&lt;name&gt;.rb` in a `homebrew-core` checkout and correct it in the PR if wrong. The corrected value is preserved on subsequent regenerations.
  * If `range_state` is `&quot;affected&quot;` with a `resource`, `brew info &lt;formula&gt; --json=v2 | jq &#39;.formulae[0].resources[] | select(.name == &quot;&lt;resource&gt;&quot;) | .version&#39;` confirms the pinned resource version is below `upstream_fixed_in`. Known false-positive sources are stale CPANSA ranges and OSV records where one alias (often a PYSEC id) has an open-ended range while another has a bounded one.
  * If `range_state` is absent and `confidence` is `medium` or `low`, the record is a lead rather than a determination: either set the `ranges` boundary yourself from the upstream advisory and `homebrew-core` history, or close if the CVE does not apply.

The Ingest workflow currently discards uncomparable candidates (`range_state` absent) instead of proposing them for review: their raw OSV shape (`{&quot;introduced&quot;: &quot;0&quot;}` with no `fixed`) reads as every version being affected. To reject a candidate durably, add its id to `data/rejected-candidates.txt` — matching re-runs from scratch daily, so closing a PR only postpones it — and if the record was already merged, delete its file in the same change.

Do not merge a `matched` record over an existing `source: &quot;generated&quot;` record for the same `(formula, CVE)`; the generated record already states Homebrew ships a patch and takes precedence. `brew advisory-match --output` skips these automatically.

## Scope

Records here describe vulnerabilities in software Homebrew distributes, scoped to the Homebrew formula name and version. They are not a substitute for the upstream project&#39;s own advisory; the purpose is to let tools that read `pkg:brew` purls or `Homebrew` OSV queries answer &quot;is this installed formula affected&quot;. Casks are out of scope for now.

## Development

The required Ruby version is recorded in `.ruby-version`. Install the development dependencies and run the same Ruby checks as CI with:
    
    bundle install
    bundle exec rake

Workflow changes should also pass Homebrew&#39;s standard workflow checks:
    
    brew install actionlint shellcheck zizmor
    actionlint
    zizmor .

## Code of Conduct

This project follows the Homebrew Code of Conduct.

You can’t perform that action at this time.</excerpt>
</source>
<source kind="search">
<title>Homebrew Documentation: Advisory Matching</title>
<location>https://docs.brew.sh/Advisory-Matching</location>
<excerpt>citeturn1search0 [wordlim: 200] Crawled: 2 weeks ago; `brew advisory-match` prepares candidate records for the Homebrew advisory database. ... An `introduced: &quot;0&quot;` boundary asserts that every earlier version is affected; it is not a marker for an unknown introduction. ... For records missed by current matching, complete registry-resource evidence can supply versionless upstream queries even after a resource has been removed. ... The pin applies across advisory aliases and is separate from `upstream_fixed_in`, which describes the upstream fix.
Image: Homebrew Documentation logo

# Homebrew Documentation

# Advisory Matching

`brew advisory-match` prepares candidate records for the Homebrew advisory database. It is an authoring tool, not the installed-package scanner provided by `brew vulns`. Candidates still need human review before publication.

## Range accuracy and coverage

With history enabled, a candidate with a comparable current state and no reviewed range must have an affected interval that can be established from formula history. This applies even when the current formula is known to be affected: knowing today’s state does not establish when the affected range began. An `introduced: &quot;0&quot;` boundary asserts that every earlier version is affected; it is not a marker for an unknown introduction.

Automatic matching deliberately favours range accuracy over coverage. Unreadable or uncomparable history and disjoint affected intervals can prevent a new record from being emitted. The command warns and counts these as history-unavailable skips instead of inventing a boundary. This includes a historical subject whose prerelease suffix changes its `SEMVER` range state compared with its release version. A skip does not mean the formula is unaffected, so an ingest run can omit a currently affected formula and is not evidence of complete vulnerability coverage. Reviewers must establish the ranges and matching provenance together from upstream evidence and formula build history, then contribute the record manually.

For a new record, a `pkg_version` shared by affected and unaffected builds is conservatively included in the affected interval, because the advisory cannot distinguish those builds by version. This can happen when a resource changes without a formula revision bump. For the same reason, a fix that shares its `pkg_version` with affected builds is recorded at the next version with only fixed builds, and a range stays unchanged while the current version also has an affected build. A distinct unaffected version inside the interval still requires review. Existing-range reconciliation and reintroduction checks retain their stricter rules for mixed builds, so reconciliation reports a record whose `introduced` version has mixed builds as an unrepresentable interval and leaves it unchanged.

Current-version prerelease ambiguity produces an uncomparable review lead with no `range_state`, reduced confidence and `database_specific.review_reason: &quot;prerelease_boundary&quot;`. Ingest drops these leads and lists their IDs by reason in its run summary. An explicit `range_state` override for the formula and advisory resolves the current-state ambiguity; an `upstream_fixed_in` override alone does not. Without a reviewed state override, existing reviewed records stay unchanged.

A reviewed state override does not establish historical boundaries. When its state disagrees with comparable upstream evidence, or the upstream evidence cannot be checked, a new range needs manual review. Existing reviewed ranges are preserved rather than replaced with guessed introductions; range transitions and changed provenance still require their own checks.

## History options

`--new-history` requires `--output` and reuses existing reviewed ranges where possible; a successful replay does not independently verify those boundaries. `--json` without `--output` has no existing reviewed records to reuse, so history checks still apply to new comparable candidates. `--no-history` explicitly uses unverified zero/current-version boundaries for new ranges and cannot be combined with `--new-history`. It is an unchecked authoring mode, not a way to validate a skipped candidate.

## Reconciling existing ranges

`--reconcile-history --output advisories --overrides data/overrides.yml` explicitly revisits existing `source: matched`, bump-fixed records with one terminal interval. It requires complete formula history and matching provenance, with the same result on the latest supported macOS and Linux for both ARM and Intel. These simulations check declared formula and resource versions; they do not rebuild historical bottles or verify installation steps. It can narrow an affected interval or delete a record proven never affected; it preserves other fields and updates `modified` only for a range change. Generated records, patch fixes and open or multiple intervals are left unchanged. For records missed by current matching, complete registry-resource evidence can supply versionless upstream queries even after a resource has been removed. The fresh results must reproduce the stored upstream family and range basis, and every resource identity must occur in formula history on every platform. Stored subject versions only reproduce the range basis; historical decisions use versions from the formula sources. A missing historical resource holds the record as `resource_not_found`; a stored family absent from the fresh query results is `resource_not_rediscovered`. Mixed, incomplete or non-resource provenance still requires current discovery. These fallback queries cannot create records and respect formula skips and preserved Homebrew ranges. When a prerelease suffix changes a subject’s `SEMVER` range state compared with its release version, `prerelease_boundary` holds the record for review. The command reports skip reasons and the number of matched records it did not revisit; success does not establish complete coverage.

Before running this mode, protect hand-reviewed Homebrew boundaries with `preserve_homebrew_ranges: true` under the formula and advisory in `overrides.yml`. The pin applies across advisory aliases and is separate from `upstream_fixed_in`, which describes the upstream fix. Unavailable history or upstream records, changed subjects, conflicting platform results and advisory-specific patches require review. A failed upstream lookup holds every record for that formula with `upstream_unavailable`; a failed batch query holds its entire formula batch. A confirmed HTTP 404 while following an upstream link is cached as a missing target; a record with no resolved targets keeps its original evidence. A 404 for a supplemental CPANSA CVE lookup uses the CPANSA evidence for that CVE, including on subsequent platform passes. A 404 for an ID returned directly b…[truncated]</excerpt>
</source>
<source kind="search">
<title>advisory-database/CONTRIBUTING.md at main · Homebrew/advisory-database · GitHub</title>
<location>https://github.com/Homebrew/advisory-database/blob/main/CONTRIBUTING.md</location>
<excerpt>citeturn1search1 [wordlim: 200] Crawled: last month; Advisories in this repository come from three places: records generated from `resolves` annotations on `homebrew/core` formula patches, candidate records matched against external OSV feeds by `brew advisory-match`, and records contributed directly by pull request.

# CONTRIBUTING.md

Copy path

[Input: Go to file]

Blame More file actions

Blame More file actions

## Latest commit

 

## History

History

main

## Breadcrumbs

  1. advisory-database

/

# CONTRIBUTING.md

Copy path

Top

## File metadata and controls

  * Preview

  * Code

  * Blame

88 lines (59 loc) · 7.92 KB

# Contributing

Advisories in this repository come from three places: records generated from `resolves` annotations on `homebrew/core` formula patches, candidate records matched against external OSV feeds by `brew advisory-match`, and records contributed directly by pull request. All live under `advisories/` as OSV-schema JSON and are validated against that schema on every push.

The concatenated advisory index is built from the reviewed records on `main` and served at formulae.brew.sh/api/advisories.json.

## Reporting a fixed vulnerability

If a `homebrew/core` formula already ships a patch that fixes a CVE, the simplest route is to annotate the patch. Open a pull request against Homebrew/homebrew-core adding `resolves &quot;CVE-YYYY-NNNNN&quot;` to the relevant `patch do` block; see `libquicktime.rb` for an example. CVE identifiers appearing in the patch URL or applied file paths are picked up automatically without an explicit `resolves`. The daily `Regenerate` workflow will pick it up and write a `BREW-&lt;formula&gt;-&lt;CVE&gt;` record here automatically. Generated records carry `&quot;database_specific&quot;: {&quot;source&quot;: &quot;generated&quot;}`. The workflow refreshes their upstream-derived fields (`summary`, `severity`, `references`, `ecosystem_specific.patches`) on each run but preserves `published` and `affected[].ranges` from whatever is on disk, so a hand-corrected `fixed` boundary will not be overwritten.

## Contributing an advisory directly

Open a pull request adding a file under `advisories/` when you want to record something the generated path cannot express, most commonly that a formula version is affected and Homebrew has not yet applied a fix.

Before opening the PR, report the issue upstream according to the project&#39;s security policy and wait for it to be acknowledged. Versions are the formula version as `brew info` reports it, with an `_N` suffix when the revision is nonzero. Link the upstream CVE, GHSA or advisory in `upstream` and `references`.

## Reviewing matched candidates

Records with `&quot;database_specific&quot;: {&quot;source&quot;: &quot;matched&quot;, ...}` are produced by `brew advisory-match` (in Homebrew/brew), which queries OSV.dev&#39;s GIT, language-registry and distro ecosystems plus CPANSA for a formula and emits one candidate per CVE reached. These arrive as automated PRs and need a human to confirm the match before merge.

`database_specific` tells you how the match was made:

  * `strategy` is the highest-precision path that reached the CVE: `git` (the formula&#39;s forge repo), `registry` (a PyPI/npm/crates/... package derived from `stable.url` or a `resource`), `cpansa` (a CPAN distribution), or `distro` (a Debian/Ubuntu/... source package name mapped via Repology).
  * `confidence` follows from strategy and whether a comparable version range was found: `high` for `git`/`registry` with a range, `medium` when no comparable range was found (typically GIT commit-SHA events), `low` for `distro`.
  * `upstream_evidence` lists every path that reached the CVE, each with the `{ecosystem, name, subject_version}` that was queried.

`affected[0].ecosystem_specific` tells you what the range check concluded:

  * `range_state` is `affected` (the shipped version is inside an upstream affected range), `fixed` (past one), or absent (no co…[truncated]</excerpt>
</source>
<source kind="search">
<title>Brew 6.0.14 Release - GitClear</title>
<location>https://www.gitclear.com/open_repos/homebrew/brew/release/6.0.14</location>
<excerpt>citeturn1search3 [wordlim: 200] Published: 2 months ago; Crawled: 2 months ago; # Brew: 6.0.14 Release ...   * vulns: add advisory matcher and dev-cmd/advisory-match by @andrew in GitHub pull request 23329 in Homebrew/brew (link omitted to avoid creating a cross-reference)
  * tap: require `trust` in `Tap#to_hash` by @carlocab in GitHub pull request 23333 in Homebrew/brew (link omitted to avoid creating a cross-reference)
  * test/os/mac/keg: require `macho` by @carlocab in GitHub pull request 23334 in Homebrew/brew (link omitted to avoid creating a cross-reference)
  * Preserve locale during brew startup by @MikeMcQuaid in GitHub pull request 23332 in Homebrew/brew (link omitted to avoid creating a cross-reference)
  * Support Landlock ABI 2 on Linux kernel 6.1 by @MikeMcQuaid in GitHub pull request 23335 in Homebrew/brew (link omitted to avoid creating a cross-reference)
  * Prepare complete DSL stanza ordering by @MikeMcQuaid in GitHub pull request 23331 in Homebrew/brew (link omitted to avoid creating a cross-reference)
  * cask/audit: require &quot;macho&quot; before use by @chenrui333 in GitHub pull request 23337 in Homebrew/brew (link omitted to avoid creating a cross-reference)
  * vulns: add advisory matcher and dev-cmd/advisory-match by @andrew in GitHub pull request 23329 in Homebrew/brew (link omitted to avoid creating a cross-reference)
  * Group `on_system_conditional` after `os` by @AlternateRT in GitHub pull request 23339 in Homebrew/brew (link omitted to avoid creating a cross-reference)
</excerpt>
</source>
<omitted_sources count="30">Additional source records were omitted from this bounded result.</omitted_sources>
</source_evidence>

Citations:

- 1: https://www.gitclear.com/open_repos/homebrew/brew/release/6.0.14?utm_source=openai
- 2: https://github.com/Homebrew/advisory-database/blob/main/CONTRIBUTING.md?utm_source=openai
- 3: https://docs.brew.sh/Advisory-Matching?utm_source=openai
- 4: https://docs.brew.sh/Advisory-Matching?utm_source=openai
- 5: https://github.com/Homebrew/advisory-database/blob/main/CONTRIBUTING.md?utm_source=openai

Script executed:

set -o pipefail
printf '%s\n' '--- exact target references ---'
rg -n -F --glob '*.rb' --glob '*.json' -e 'CVE-2026-110860' -e 'fdroidserver' -e '3.1.62' -e 'GitPython 3.1.62' spec data advisories lib || test "$?" -eq 1
printf '%s\n' '--- target diff and repository revisions ---'
git diff --unified=80 f5f213fd71f52ab1b30a810cf36d42680fb494fe ef85490540c42485094ea475bcc741c88ee53a87 -- advisories/BREW-fdroidserver-CVE-2026-110860.json
printf '%s\n' '--- nearby GitPython boundary fixtures ---'
nl -ba spec/advisory_records_spec.rb | sed -n '390,465p'

Repository: Homebrew/advisory-database

Length of output: 41429


Web query:

GHSA-gq48-pqfc-9p58 affected versions GitPython 3.1.62 OSV

Result:

<source_evidence>
<source kind="open_page">
<title>Submodule.move() follows an attacker-committed intermediate symlink outside the worktree · Advisory · gitpython-developers/GitPython · GitHub</title>
<location>https://github.com/gitpython-developers/GitPython/security/advisories/GHSA-gq48-pqfc-9p58</location>
<excerpt>citeturn1view0 [wordlim: 200] Crawled: today; Content type: text/html; Source: open({&quot;ref_id&quot;:&quot;turn0search0&quot;,&quot;lineno&quot;:null}); Total lines: 737
L71:     * SUPPORT &amp; SERVICES
L72:       * 【14†Documentation†docs.github.com】
L73:       * 【44†Customer support†support.github.com】
L74:       * 【45†Community forum】
L75:       * 【46†Trust center】
L76:       * 【47†Partners】
L77: 
L78: 【48†View all resources】
L79: 
L80:   * Open Source
L81: 
L82:     * COMMUNITY
L83:       * 【49†GitHub SponsorsFund open source developers】
L84:     * PROGRAMS
L85:       * 【50†Security Lab†securitylab.github.com】
L86:       * 【51†Maintainer Community†maintainers.github.com】
L87:       * 【52†GitHub Stars†stars.github.com】
L88:       * 【53†Archive Program†archiveprogram.github.com】
L89: 
L90:     * REPOSITORIES
L91:       * 【54†Topics】
L92:       * 【55†Trending】
L93:       * 【56†Collections】
L94: 
L95:   * Enterprise
L96: 
L97:     * ENTERPRISE SOLUTIONS
L98:       * 【19†Enterprise platformAI-powered developer platform】
L99:     * AVAILABLE ADD-ONS
L100:       * 【10†GitHub Advanced SecurityEnterprise-grade security features】
L101:       * 【57†Copilot for BusinessEnterprise-grade AI features】
L102:       * 【58†Premium SupportEnterprise-grade 24/7 support】
L103: 
L104:   * 【59†Pricing】
L105: 
L106: Search`/`
L107: 
L108: 【1†Sign in】
L109: 
L110: 【60†Sign up】
L111: 
L112: Appearance settings
L113: You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session. Dismiss alert
L114: 
L115:   1. 【61†gitpython-developers】
L116:   2. 【62†GitPython】
L117: ## Repository navigation
L118: 
L119:   *   * 【62†Code】
L120:   * 【63†Issues1 (1)】
L121:   * 【64†Pull requests】
L122:   * 【65†Discussions】
L123:   * 【66†Actions】
L124:   * 【67†Security and quality42 (42)】
L125:   * 【68†Insights】
L126: 
L127: More items
L128: 
L129: # Submodule.move() follows an attacker-committed intermediate symlink outside the worktree
L130: 
L131: Moderate
L132: 
L133: 【69†Byron】 published GHSA-gq48-pqfc-9p58 Sep 30, 2026
L134: 
L135: ## Package
L136: 
L137: GitPython (【70†pip】)
L138: 
L139: ## Affected versions
L140: 
L141: = 3.1.62
L142: 
L143: ## Patched versions
L144: 
L145: &gt;= 3.2.0
L146: 
L147: ## Description
L148: # `Submodule.move()` follows an attacker-committed intermediate symlink outside the worktree
L149: ## Summary
L150: 
L151: GitPython&#39;s public `Submodule.move()` API verifies that its destination is lexically inside the parent repository, but it does not reject symbolic links in the destination&#39;s intermediate components before filesystem operations. On systems that check out Git symlinks, an untrusted repository can therefore redirect a fixed, application-selected move destination outside the parent worktree.
L152: I reproduced this on the latest release, GitPython 3.1.62, and current `main`. In the strict scenario, the repository commits `vendor -&gt; ../outside`, while the consuming application independently passes the fixed literal `vendor/module`. `Submodule.move()` follows `vendor`, moves the initialized submodule checkout to `outside/module`, rewrites `.gitmodules` and the index to the symlinked path, and leaves the index unable to produce a tree.
L153: The same result occurs when the committed symlink contains an absolute path to an external directory. No attacker-controlled API argument, local symlink planting, race, Git hook, unsafe-option flag, or network access during the proof is required.
L154: ## Trust boundary and preconditions
L155: 
L156: The attacker controls:
L157: 
L158:   * an untrusted Git repository that the application clones;
L159:   * a mode-`120000` tracked symlink named `vendor`;
L160:   * the initialized submodule&#39;s content.
L161: 
L162: The consuming application controls the call and uses a fixed layout rule:
L163: 
L164:     submodule.move(&quot;vendor/module&quot;)
L165: The trigger requires the application to initialize the submodule and later call `Submodule.move()` with a path below the attacker-committed symlink. Ordinary clone or submodule update does not automatically make this call. Windows was not tested. The primitive applies where Git materializes the tracked entry as a real symlink; on Windows that generally requires `core.symlinks=true` with Developer Mode or sufficient privilege. Configurations that materialize it as an ordinary file do not take this path.
L166: ## Product and directly verified revisions
L167: 
L168:   * Package: `GitPython` (`pip` ecosystem)
L169:   * Latest release: 3.1.62, tag commit `db47516dac750c5968b8f6d388b18712c355df50`
L170:   * Current `main`: `b62e91be897f687a622e40cd1e59c33dce45f124`
L171:   * Relevant `git/objects/submodule/base.py` SHA-256 in both revisions: `a4355d49e0b75c7c7e74d33ac70ff9550f940c977848c99da40eb41e034b189c`
L172:   * Upstream state rechecked: 2026-09-10 KST
L173: Only these two revisions were directly tested. I recommend using `= 3.1.62` in initial advisory metadata and letting the maintainers determine the earliest affected version from history.
L174: ## Severity and weakness
L175: 
L176:   * Recommended severity: Medium, CVSS 3.1 6.1
L177:   * Vector: `CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:N/I:H/A:L`
L178:   * CWE-59: Improper Link Resolution Before File Access
L179:   * CWE-22: Improper Limitation of a Pathname to a Restricted Directory
L180: The demonstrated impact is an integrity boundary violation: repository content selects an existing directory outside the worktree, and GitPython moves an attacker-influenced checkout into a missing or empty child path there with the victim process&#39;s permissions. It also removes the original checkout and corrupts the parent repository&#39;s index/configuration state.
L181: For a downstream service that remotely accepts repositories and performs this exact layout operation with user involvement retained, `AV:N` gives a conditional application-level score of 7.1. A fully automatic service may warrant a different `UI` assessment. The library report uses `AV:L` because the vulnerable API call is a separate application action and is not part of GitPython&#39;s ordinary clone/update flow.
L182: No confidentiality impact, code execution, overwrite of an existing file, or overwrite of a non-empty directory was demonstrated.
L183: 
L184: A maintainer who rates placement into a missing or empty external child as partial rather than total integrity loss may prefer `I:L`, which gives 4.4 with the otherwise identical library-level vector: `CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:L`.
L185: ## Reproducer
L186: 
L187: The following script creates only temporary local repositories and a self-generated canary. It passes `protocol.file.allow=always` separately with `-c` on each fixture Git invocation; that permission is process-scoped and is not persisted to global or repository configuration.
L188: Run it from a fresh source checkout:
L189: 
L190:     git clone --depth 1 --branch 3.1.62 https://github.com/gitpython-developers/GitPython.git
L191:     python3 poc.py /path/to/GitPython
L192:     python3 poc.py --absolute-link /path/to/GitPython
L193: `--absolute-link` commits the temporary external directory&#39;s absolute path instead of `../outside`.
L194: 
L195:     #!/usr/bin/env python3
L196:     &quot;&quot;&quot;Local-only reproducer for GitPython Submodule.move() symlink traversal.&quot;&quot;&quot;
L197: 
L198:     from __future__ import annotations
L199: 
L200:     import argparse
L201:     import json
L202:     import subprocess
L203:     import sys
L204:     import tempfile
L205:     from pathlib import Path
L206:     from typing import Optional
L207: 
L208: 
L209:     def run_git(
L210:         *args: str, cwd: Optional[Path] = None, check: bool = True
L211:     ) -&gt; subprocess.CompletedProcess:
L212:         command = [
L213:             &quot;git&quot;,
L214:             &quot;-c&quot;,
L215:             &quot;user.name=GitPython security fixture&quot;,
L216:             &quot;-c&quot;,
L217:             &quot;user.email=fixture@example.invalid&quot;,
L218:             &quot;-c&quot;,
L219:             &quot;protocol.file.allow=always&quot;,
L220:             *args,
L221:         ]
L222:         return subprocess.run(command, cwd=cwd, check=check, text=True, capture_output=True)
L223: 
L224: 
L225:     def read_core_worktree(parent) -&gt; str:
L226:         module_config = Path(parent.git_dir) / &quot;modules&quot; / &quot;logical-name&quot; / &quot;config&quot;
L227:         return parent.git.config(&quot;--file&quot;, str(module_config), &quot;--get&quot;, &quot;core.worktree&quot;)
L228: 
L229: 
L230:     def read_gitmodules_path(parent) -&gt; str:
L231:         modules_file = Path(parent.working_tree_dir) / &quot;.gitmodules&quot;
L232:         return parent.git.config(
L233:             &quot;--file&quot;, str(modules_file), &quot;--get&quot;, &quot;submodule.logical-name.path&quot;
L234:         )
L235: 
L236: 
L237:     def main() -&gt; int:
L238:         parser = argparse.ArgumentParser()
L239:         parser.add_argument(&quot;source_root&quot;, type=Path, help=&quot;GitPython source checkout&quot;)
L240:         parser.add_argument(
L241:             &quot;--absolute-link&quot;,
L242:             action=&quot;store_true&quot;,
L243:             help=(
L244:                 &quot;Use the temporary external directory&#39;s absolute path as the committed &quot;
L245:                 &quot;symlink target&quot;
L246:             ),
L247:         )
L248:         args = parser.parse_args()
L249: 
L250:         source_root = args.source_root.resolve()
L251:         # The tested GitPython source trees include gitdb and smmap at their roots.
L252:         sys.path[:0] = [
L253:             str(source_root),
L254:             str(source_root / &quot;gitdb&quot;),
L255:             str(source_root / &quot;smmap&quot;),
L256:         ]
L257:         import gitdb  # pylint: disable=import-outside-toplevel
L258:         import smmap  # pylint: disable=import-outside-toplevel
L259:         from git import Repo  # pylint: disable=import-outside-toplevel
L260:         with tempfile.TemporaryDirectory(prefix=&quot;gitpython-move-poc-&quot;) as temporary:
L261:             root = Path(temporary)
L262:             module_source = root / &quot;module-source&quot;
L263:             attacker = root / &quot;attacker-parent&quot;
L264:             victim = root / &quot;victim-parent&quot;
L265:             outside = root / &quot;outside&quot;
L266: 
L267:             run_git(&quot;init&quot;, &quot;--quiet&quot;, str(module_source))
L268:             (module_source / &quot;SELF_GENERATED_CANARY.txt&quot;).write_text(
L269:                 &quot;SELF_GENERATED_CANARY\n&quot;, encoding=&quot;utf-8&quot;
L270:             )
L271:             run_git(&quot;add&quot;, &quot;SELF_GENERATED_CANARY.txt&quot;, cwd=module_source)
L272:             run_git(&quot;commit&quot;, &quot;--quiet&quot;, &quot;-m&quot;, &quot;fixture&quot;, cwd=module_source)
L273: 
L274:             outside.mkdir()
L275:             run_git(&quot;init&quot;, &quot;--quiet&quot;, str(attacker))
L276:             run_git(
L277:                 &quot;submodule&quot;,
L278:                 &quot;add&quot;,
L279:                 &quot;--quiet&quot;,
L280:                 &quot;--name&quot;,
L281:                 &quot;logical-name&quot;,
L282:                 str(module_source),
L283:                 &quot;module&quot;,
L284:                 cwd=attacker,
L285:             )
L286:             link_target = str(outside.resolve()) if args.absolute_link else &quot;../outside&quot;
L287:             (attacker / &quot;vendor&quot;).symlink_to(link_target, target_is_directory=True)
L288:             run_git(&quot;add&quot;, &quot;.gitmodules&quot;, &quot;module&quot;, &quot;vendor&quot;, cwd=attacker)
L289:             run_git(&quot;commit&quot;, &quot;--quiet&quot;, &quot;-m&quot;, &quot;attacker-controlled layout&quot;, cwd=attacker)
L290: 
L291:             run_git(&quot;clone&quot;, &quot;--quiet&quot;, str(attacker), str(victim))
L292:             run_git(&quot;submodule&quot;, &quot;update&quot;, &quot;--init&quot;, &quot;--quiet&quot;, cwd=victim)
L293:             parent = Repo(victim)
L294:             submodule = parent.submodule(&quot;logical-name&quot;)
L295:             before = {
L296:                 &quot;status&quot;: parent.git.status(&quot;--porcelain&quot;),
L297:                 &quot;write_tree&quot;: parent.git.write_tree(),
L298:                 &quot;vendor_index&quot;: parent.git.ls_files(&quot;--stage&quot;, &quot;vendor&quot;),
L299:                 &quot;index_paths&quot;: parent.git.ls_files().splitlines(),
L300:                 &quot;gitmodules_path&quot;: read_gitmodules_path(parent),
L399: `Submodule.move()` then joins the accepted relative path to the worktree and passes it to filesystem operations, including `os.listdir()` and `os.renames()`:
L400: 
L401:     module_checkout_path = self._to_relative_path(self.repo, module_path)
L402:     ...
L403:     module_checkout_abspath = join_path_native(str(self.repo.working_tree_dir), module_checkout_path)
L404:     ...
L405:     os.renames(cur_path, module_checkout_abspath)
L406: 
L407: The operating system resolves `vendor/module` through the checked-out `vendor` link at that point.
L661: ## Validation
L662: 
L663: The strict clean-clone proof was run with both relative and absolute committed symlink targets:
L664: 
L665: Revision  | macOS ARM64 unpatched  | Linux ARM64 unpatched  | macOS patched  | Linux patched
L666: --- | --- | --- | --- | ---
L667: 3.1.62  | escape reproduced  | escape reproduced  | rejected before mutation  | rejected before mutation
L668: `main` `b62e91b`  | escape reproduced  | escape reproduced  | rejected before mutation  | rejected before mutation
L669: Both platforms were ARM64 on the same physical Mac; Linux ran in a local LinuxKit VM image. All runs used Python 3.14.7. The Linux runs used a local image by immutable SHA-256, with networking disabled, a read-only container root and source mount, and a temporary writable `/tmp`.
L670: 
L671: Pinned reproducer SHA-256: `513b6f32fc44cc74bee1ca8e81e8ed3f48ae89bfdc332dd6782886bfd1d6a79c`.
L672: The documented shallow-clone command was also executed from a new temporary directory at 3.1.62. The reproducer resolved `git`, `gitdb`, and `smmap` from that checkout (`git/__init__.py`, `gitdb/gitdb/__init__.py`, and `smmap/smmap/__init__.py`) and reproduced the same external move. In that exact checkout, `git ls-tree HEAD gitdb smmap git/ext` reports ordinary mode-`040000` trees for root `gitdb` and `smmap`, no `.gitmodules` file exists, and `git submodule status --recursive` produces no entries.
L673: No recursive submodule checkout or preinstalled GitPython dependency was used for that bootstrap check. The evidence package includes both the raw local tree transcript and the matching official GitHub tree API entries.
L674: The revised patch also passed 12 focused tests on each revision on each platform (48 test executions total). They cover:
L675:   * relative and absolute ordinary moves from an external process working directory;
L676:   * relative and absolute no-op ordering;
L677:   * no-op compatibility when the stored path includes an existing symlink;
L678:   * the unchanged `Submodule.abspath` leaf-link guard;
L679:   * relative and absolute intermediate-link rejection before rename;
L680:   * empty-directory, non-empty-directory, file, and dangling final-component link behavior.
L681: Ruff 0.16.6 lint and format checks, Python compilation, patch application, and patched-file byte comparison passed for both revisions. GitPython&#39;s complete upstream test suite and mypy were not run against the patch; the test claim is limited to the focused matrix described above.
L682: Additional saved controls on both revisions record rejection of `../` and absolute API destinations, preservation of existing files and non-empty directories, the final-component link behavior, and `RootModule.update()` rejecting the tested commit-to-commit symlinked path before its internal move. These controls are separate from the strict 16-run proof.
L683: ## Impact limits and compatibility observations
L684:   * An existing destination file and an existing non-empty destination directory are preserved and rejected.
L685:   * A missing or empty leaf below an external symlink target can be populated.
L686:   * `../` and an absolute API destination outside the worktree are already rejected; the bypass is filesystem resolution of a lexically in-tree path.
L687:   * `RootModule.update()` rejects the tested commit-to-commit symlinked path before its internal `move()` call, so ordinary clone/update is not an automatic trigger.
L688:   * The proof does not require or demonstrate a local race.
L689:   * The directly demonstrated relative target is the practical repository-relative case. The absolute variant proves target-path scope using a temporary path known to the fixture; a remote attacker would instead need a predictable absolute directory on the victim.
L690:   * The exact affected history before 3.1.62 has not been established.
L691: ## Duplicate analysis
L692: 
L693: This is adjacent to 【71†GHSA-59cr-6r3x-644w】, but the trigger and primitive differ. That advisory covers an attacker-controlled `.gitmodules` path containing lexical traversal reaching the update flow. The `_to_relative_path()` check that `move()` relies on blocks lexical traversal, while this report demonstrates that it does not block operating-system resolution of an attacker-committed intermediate symlink when the application supplies a fixed destination.
L694: The relevant distinctions are:
L695: 
L696:   * attacker input: committed symlink versus `.gitmodules` traversal text;
L697:   * caller input: fixed application literal versus attacker-selected destination;
L698:   * entry point: public `Submodule.move()` versus update processing;
L699:   * primitive: link resolution after lexical validation versus `..` traversal;
L700:   * effect: external checkout move plus index and configuration rewrite.
L701: 【72†GHSA-hmq2-w58f-27jc】 concerns the submodule name selecting `.git/modules/&lt;name&gt;`, and 【73†GHSA-7545-fcxq-7j24】 concerns reference APIs. Neither describes this `Submodule.move()` destination behavior. The ID-to-summary mapping for all three related advisories was rechecked through GitHub&#39;s authenticated repository advisory API immediately before submission review.
L702: On 2026-09-10 KST, exact GitHub issue/PR searches for `Submodule.move` with symlink terms and for an intermediate-symlink worktree move returned no public match. Private reports and unpublished fixes remain unknown.
L703: ## Disclosure status
L704: 
</excerpt>
</source>
<source kind="open_page">
<title>OSV - Open Source Vulnerabilities</title>
<location>https://osv.dev/vulnerability/CVE-2026-110860</location>
<excerpt>citeturn1view1 [wordlim: 200] Crawled: today; Content type: text/html; Source: open({&quot;ref_id&quot;:&quot;turn0search2&quot;,&quot;lineno&quot;:null}); Total lines: 107
L0: [Input]
L1: 
L2:   * 【0†Vulnerability Database】
L3:   * 【1†Blog】
L4:   * 【2†FAQ†google.github.io】
L5:   * 【3†Docs†google.github.io】
L6: # CVE-2026-110860
L7: 
L8: 【4†See a problem?†google.github.io】
L9: Please try reporting it 【5†to the source†cve.org】 first.
L10: 
L11: Source
L12:     【5†https://cve.org/CVERecord?id=CVE-2026-110860†cve.org】
L13: Import Source
L14:     【6†https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-110860.json†storage.googleapis.com】
L15: JSON Data
L16:     【7†https://api.osv.dev/v1/vulns/CVE-2026-110860†api.osv.dev】
L17: Aliases
L18: 
L19: 
L20:   * 【8†GHSA-gq48-pqfc-9p58】
L21: Downstream
L22:   * 【9†DEBIAN-CVE-2026-110860】
L23:   * 【10†ECHO-52da-a715-9855】
L24:   * 【11†UBUNTU-CVE-2026-110860】
L25: Published
L26:     2026-10-14T22:52:44Z
L27: Modified
L28:     2026-10-27T02:31:04Z
L29: Severity
L30: 
L31: 
L32:   * 6.9 (Medium) CVSS_V4 - CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:P/VC:N/VI:H/VA:L/SC:N/SI:N/SA:N 【12†CVSS Calculator†www.first.org】
L33: Summary
L34:     GitPython 3.1.62 before 3.2.0 Symlink Path Traversal via Submodule.move()
L35: Details
L36: GitPython from 3.1.62 before 3.2.0 contains a symlink-following flaw in Submodule.move(), which checks the destination only lexically and does not reject symbolic links in intermediate path components. An untrusted repository can commit a symlink such as vendor pointing outside the worktree, so an application moving an initialized submodule beneath it relocates the checkout externally and corrupts the index and .gitmodules.
L37: Database specific
L38: 
L39: 
L40:     {
L41:         &quot;cna_assigner&quot;:  &quot;VulnCheck&quot;,
L42:         &quot;cwe_ids&quot;:  [
L43:             &quot;CWE-59&quot;
L44:         ],
L45:         &quot;osv_generated_from&quot;:  &quot;https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/110xxx/CVE-2026-110860.json&quot;
L46:     }
L47: 
L48: References
L49:   * 【13†https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/110xxx/CVE-2026-110860.json†github.com】
L50:   * 【14†https://github.com/gitpython-developers/GitPython/security/advisories/GHSA-gq48-pqfc-9p58†github.com】
L51:   * 【15†https://nvd.nist.gov/vuln/detail/CVE-2026-110860†nvd.nist.gov】
L52:   * 【16†https://www.vulncheck.com/advisories/gitpython-3.1.62-before-3.2.0-symlink-path-traversal-via-submodule-move†www.vulncheck.com】
L53: ## Affected packages
L54: 
L55: ## Git / github.com/gitpython-developers/gitpython
L56: ### Affected ranges
L57: 
L58: Type
L59:     GIT
L60: Repo
L61:     https://github.com/gitpython-developers/gitpython
L62: Events
L63: 
L64: 
L65: Introduced
L66: 
L67: 【17†db47516dac750c5968b8f6d388b18712c355df50†github.com】
L68: 
L69: Fixed
L70: 
L71: 【18†6a7180a9dfcb276755a8af99dd78155f775a6b14†github.com】
L72: Database specific
L73:     Show details
L74: 
L75:     {
L76:         &quot;extracted_events&quot;:  [
L77:             {
L78:                 &quot;range&quot;:  [
L79:                     {
L80:                         &quot;introduced&quot;:  &quot;3.1.62&quot;
L81:                     },
L82:                     {
L83:                         &quot;fixed&quot;:  &quot;3.2.0&quot;
L84:                     }
L85:                 ],
L86:                 &quot;source&quot;:  &quot;AFFECTED_FIELD&quot;,
L87:                 &quot;strategy&quot;:  &quot;StandardRange&quot;
L88:             },
L89:             {
L90:                 &quot;range&quot;:  [
L91:                     {
L92:                         &quot;introduced&quot;:  &quot;3.1.62&quot;
L93:                     },
L94:                     {
L95:                         &quot;fixed&quot;:  &quot;3.2.0&quot;
L96:                     }
L97:                 ],
L98:                 &quot;source&quot;:  &quot;DESCRIPTION&quot;
L99:             }
L100:         ]
L101:     }
L102: ### Database specific
L103: 
L104: source
L105: 
L106:     &quot;https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-110860.json&quot;
</excerpt>
</source>
<source kind="search">
<title>Submodule.move() follows an attacker-committed intermediate symlink outside the worktree · Advisory · gitpython-developers/GitPython · GitHub</title>
<location>https://github.com/gitpython-developers/GitPython/security/advisories/GHSA-gq48-pqfc-9p58</location>
<excerpt>citeturn0search0 [wordlim: 200] Published: 3 weeks ago; Crawled: 2 days ago; Byron published GHSA-gq48-pqfc-9p58 Sep 30, 2026 ... I reproduced this on the latest release, GitPython 3.1.62, and current `main`. ... I recommend using `= 3.1.62` in initial advisory metadata and letting the maintainers determine the earliest affected version from history. ... The demonstrated impact is an integrity boundary violation: repository content selects an existing directory outside the worktree, and GitPython moves an attacker-influenced checkout into a missing or empty child path there with the victim process&#39;s permissions.
</excerpt>
</source>
<source kind="search">
<title>OSV - Open Source Vulnerabilities</title>
<location>https://osv.dev/vulnerability/CVE-2026-110860</location>
<excerpt>citeturn0search2 [wordlim: 200] Published: last week; Crawled: last week;     https://api.osv.dev/v1/vulns/CVE-2026-110860

  * GHSA-gq48-pqfc-9p58 ...     GitPython 3.1.62 before 3.2.0 Symlink Path Traversal via Submodule.move() ...   * https://github.com/gitpython-developers/GitPython/security/advisories/GHSA-gq48-pqfc-9p58
</excerpt>
</source>
<source kind="search">
<title>GitPython: Submodule.move() follows an attacker-committed intermediate symlink outside the worktree · GHSA-gq48-pqfc-9p58 · GitHub Advisory Database · GitHub</title>
<location>https://abab.bluecat.qzz.io/advisories/GHSA-gq48-pqfc-9p58</location>
<excerpt>citeturn0search1 [wordlim: 200] Published: 3 weeks ago; Crawled: today; ## Affected versions ... The reporter reproduced this on the latest release, GitPython 3.1.62, and current `main`. ... The demonstrated impact is an integrity boundary violation: repository content selects an existing directory outside the worktree, and GitPython moves an attacker-influenced checkout into a missing or empty child path there with the victim process&#39;s permissions.
</excerpt>
</source>
<omitted_sources count="18">Additional source records were omitted from this bounded result.</omitted_sources>
</source_evidence>

Citations:

- 1: https://osv.dev/vulnerability/CVE-2026-110860
- 2: https://github.com/gitpython-developers/GitPython/security/advisories/GHSA-gq48-pqfc-9p58

Web query:

GHSA-gq48-pqfc-9p58 GitPython affected versions 3.1.62 fixed 3.2.0

Result:

<source_evidence>
<source kind="search">
<title>GitPython · PyPI</title>
<location>https://pypi.org/project/GitPython/</location>
<excerpt>citeturn0search1 [wordlim: 200] Crawled: today; PyPI data ... gitpython-3.2.1-py3-none-any.whl 231.5 kB Oct 14, 2026 Without provenance  | Python 3  | none  | any  | Details ... Uploaded via  | `twine/7.0.0 CPython/3.14.7`

## Release history Release notifications | RSS feed

This release

Image

3.2.1 This release

Oct 14, 2026 2 release files No provenance

Image

3.2.0

Sep 30, 2026 2 release files No provenance

Image

3.1.62

Sep 7, 2026 2 release files No provenance

Image

3.1.61

Aug 28, 2026 2 release files No provenance

Image

3.1.60

Aug 25, 2026 2 release files No provenance

Image

3.1.59

Aug 10, 2026 2 release files No provenance

Image

3.1.58

Aug 4, 2026 2 release files No provenance

Image

3.1.57

Jul 26, 2026 2 release files No provenance

Image

3.1.56

Jul 25, 2026 2 release files No provenance

Image

3.1.55

Jul 23, 2026 2 release files No provenance

Image

3.1.54

Jul 22, 2026 2 release files No provenance

Image

3.1.53

Jul 20, 2026 2 release files No provenance

Image

3.1.52

Jul 16, 2026 2 release files No provenance

Image

3.1.51

Jul 12, 2026 2 release files No provenance
</excerpt>
</source>
<source kind="search">
<title>GHSA-gq48-pqfc-9p58 - Path Traversal - SecAlerts</title>
<location>https://secalerts.co/vulnerability/GHSA-gq48-pqfc-9p58</location>
<excerpt>citeturn0search2 [wordlim: 200] Published: today; Crawled: today; - Package: GitPython (pip ecosystem) - Latest release: 3.1.62, tag commit db47516dac750c5968b8f6d388b18712c355df50 - Current main: b62e91be897f687a622e40cd1e59c33dce45f124 - Relevant git/objects/submodule/base.py SHA-256 in both revisions: a4355d49e0b75c7c7e74d33ac70ff9550f940c977848c99da40eb41e034b189c - Upstream state rechecked: 2026-09-10 KST ...   * https://github.com/gitpython-developers/GitPython/security/advisories/GHSA-gq48-pqfc-9p58 ...   * https://github.com/advisories/GHSA-gq48-pqfc-9p58Advisory

Trust boundary and preconditions

The attacker controls:

- an untrusted Git repository that the application clones; - a mode-120000 tracked symlink named vendor; - the initialized submodule&#39;s content.

The consuming application controls the call and uses a fixed layout rule:

python submodule.move(&quot;vendor/module&quot;)

The trigger requires the application to initialize the submodule and later call Submodule.move() with a path below the attacker-committed symlink. Ordinary clone or submodule update does not automatically make this call. Windows was not tested. The primitive applies where Git materializes the tracked entry as a real symlink; on Windows that generally requires core.symlinks=true with Developer Mode or sufficient privilege. Configurations that materialize it as an ordinary file do not take this path.

Product and directly verified revisions

- Package: GitPython (pip ecosystem) - Latest release: 3.1.62, tag commit db47516dac750c5968b8f6d388b18712c355df50 - Current main: b62e91be897f687a622e40cd1e59c33dce45f124 - Relevant git/objects/submodule/base.py SHA-256 in both revisions: a4355d49e0b75c7c7e74d33ac70ff9550f940c977848c99da40eb41e034b189c - Upstream state rechecked: 2026-09-10 KST

Only these two revisions were directly tested.

Severity and weakness

The demonstrated impact is an integrity boundary violation: repository content selects an existing directory outside the worktree, and GitPython moves an attacker-influenced checkout into a missing or empty child path there with the victim process&#39;s permissions. It also removes the original checkout and corrupts the parent repository&#39;s index/configuration state.

For a downstream service that remotely accepts repositories and performs this exact layout operation with user involvement retained, AV:N gives a conditional application-level score of 7.1. A fully automatic service may warrant a different UI assessment. The library report uses AV:L because the vulnerable API call is a separate application action and is not part of GitPython&#39;s ordinary clone/update flow.

No confidentiality impact, code execution, overwrite of an existing file, or overwrite of a non-empty directory was demonstrated.

## Affected Software

1 affected component Fixes available

pip/gitpython&lt;3.2.0

3.2.0

## Remediation

Recommended actions to resolve this vulnerability, in priority order.

  1. Upgrade

Upgrade `pip/GitPython` to a version that resolves this vulnerability.

Fixed in 3.2.0

  2. Compensating control

Patch GitPython&#39;s Submodule.move() to normalize the destination once and reject symbolic links in every intermediate destination component before any filesystem, index, or configuration mutation; the patched behavior raises ValueError for a destination such as &#39;vendor/module&#39; when &#39;vendor&#39; is a symbolic link.
</excerpt>
</source>
<source kind="search">
<title>GitPython · PyPI</title>
<location>https://pypi.org/project/GitPython/3.2.0/</location>
<excerpt>citeturn0search0 [wordlim: 200] Published: 3 weeks ago; Crawled: 3 days ago; PyPI data ... gitpython-3.2.0.tar.gz  | 238.1 kB  | Sep 30, 2026  | Without provenance  | Details ... gitpython-3.2.0-py3-none-any.whl 228.5 kB Sep 30, 2026 Without provenance  | Python 3  | none  | any  | Details

## Project links

  * Documentation
  * Source code

## Key dates

PyPI data

Data sourced directly from PyPI&#39;s database.

  * Released: Sep 30, 2026
Newer release available (3.2.1)

## 2 maintainers

PyPI data

Data sourced directly from PyPI&#39;s database.

ByronBates mtrier

## Credits

Author: Sebastian Thiel (byronimo@gmail.com)

## License

BSD-3-Clause

## Requires

Python &gt;=3.8

## Provides Extra

`test`

## Tags

`git`

## Classifiers

  * Development Status
    * 5 - Production/Stable
  * Environment
    * Console
  * Intended Audience
    * Developers
  * Operating System
    * MacOS :: MacOS X
    * Microsoft :: Windows
    * OS Independent
    * POSIX
  * Programming Language
    * Python
    * Python :: 3
    * Python :: 3.8
    * Python :: 3.9
    * Python :: 3.10
    * Python :: 3.11
    * Python :: 3.12
    * Python :: 3.13
    * Python :: 3.14
    * Python :: 3.15
  * Typing
    * Typed

## Release files for GitPython 3.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

### Source distribution (sdist)

Source distribution for GitPython 3.2.0
File  | Size  | Uploaded  | Provenance  | 
--- | --- | --- | --- | ---
gitpython-3.2.0.tar.gz  | 238.1 kB  | Sep 30, 2026  | Without provenance  | Details

* * *

### Built distribution (wheel)

Table of built distributions (wheels) for GitPython 3.2.0
File  | Interpreter  | ABI  | Platform  | 
--- | --- | --- | --- | ---
gitpython-3.2.0-py3-none-any.whl 228.5 kB Sep 30, 2026 Without provenance  | Python 3  | none  | any  | Details

* * *

Total release size: 466.6 kB

## Release files / gitpython-3.2.0.tar.gz

## Release history Release notifications | RSS feed

Image

3.2.1

Oct 14, 2026 2 release files No provenance

This release

Image

3.2.0 This release

Sep 30, 2026 2 release files No provenance

Image

3.1.62

Sep 7, 2026 2 release files No provenance

Image

3.1.61

Aug 28, 2026 2 release files No provenance

Image

3.1.60

Aug 25, 2026 2 release files No provenance

Image

3.1.59

Aug 10, 2026 2 release files No provenance

Image

3.1.58

Aug 4, 2026 2 release files No provenance

Image

3.1.57

Jul 26, 2026 2 release files No provenance

Image

3.1.56

Jul 25, 2026 2 release files No provenance
</excerpt>
</source>
<source kind="search">
<title>python3-GitPython-3.2.0-1.fc46.noarch RPM</title>
<location>https://www.rpmfind.net/linux/RPM/fedora/devel/rawhide/s390x/p/python3-GitPython-3.2.0-1.fc46.noarch.html</location>
<excerpt>citeturn0search3 [wordlim: 200] Published: 3 weeks ago; Crawled: 3 weeks ago;       - Fixes GHSA-gq48-pqfc-9p58, GHSA-23mf-xhv8-69c2, GHSA-f9j4-qggq-h239, ...         GHSA-284h-m62q-gf8w, GHSA-7833-fr7j-v32q, GHSA-hh9p-6wh2-4mfc,
</excerpt>
</source>
<source kind="search">
<title>GitPython: Submodule.move() follows an attacker-committed intermediate symlink outside the worktree · GHSA-gq48-pqfc-9p58 · GitHub Advisory Database · GitHub</title>
<location>https://abab.bluecat.qzz.io/advisories/GHSA-gq48-pqfc-9p58</location>
<excerpt>citeturn0search4 [wordlim: 200] Published: 3 weeks ago; Crawled: today;   * GHSA-gq48-pqfc-9p58 ...   * https://abab.bluecat.qzz.io/gitpython-developers/GitPython/releases/tag/3.2.0
</excerpt>
</source>
<omitted_sources count="12">Additional source records were omitted from this bounded result.</omitted_sources>
</source_evidence>

Citations:

- 1: https://secalerts.co/vulnerability/GHSA-gq48-pqfc-9p58?utm_source=openai
- 2: https://pypi.org/project/GitPython/?utm_source=openai

Web query:

Homebrew fdroidserver formula history 0.7.0 GitPython resource version

Result:

<source_evidence>
<source kind="open_page">
<title>fdroidserver — pkgstory</title>
<location>https://pkgstory.dev/homebrew-formula/fdroidserver/</location>
<excerpt>citeturn1view0 [wordlim: 200] Crawled: last week; Content type: text/html; Source: open({&quot;ref_id&quot;:&quot;turn0search1&quot;,&quot;lineno&quot;:null}); Total lines: 444
L0: # 【0†pkgstory】
L1: 
L2: checked 2026-10-14 00:01 UTC【1†rss】
L3: 
L4: fdroidserver version history (formula)
L5: 
L6: 【0†All packages】 / formula
L7: 
L8: ## fdroidserver
L9: 
L10: formula
L11: 
L12: formula timeline from Homebrew git history.
L13: 
L14: Track fdroidserver with the 【1†RSS feed】.
L15: 
L16: Current
L17:     2.4.5_6
L18: 
L19: Versions
L20:     95
L21: 
L22: Since
L23:     Feb 2016
L24: 
L25: Cadence
L26:     24d
L27: 
L28: Bottles
L29:     5 platforms
L30: 
L31: ## Update cadence
L32: 
L33: Feb 2016 to Oct 2026
L34: ## Bottle availability
L35: 
L36: 20 availability spans
L37: Platform  | From  | Until  | First bottled commit  | Removal commit
L38: --- | --- | --- | --- | ---
L39: Linux (arm64)  | 2025-04-11  | present  | 【2†9a1a31fd6†github.com】  | —
L40: Linux (x86_64)  | 2021-08-02  | present  | 【3†f305ad3e7†github.com】  | —
L41: macOS Golden Gate 27 (arm64)  | 2026-09-11  | present  | 【4†9786742a1†github.com】  | —
L42: macOS Tahoe 26 (arm64)  | 2025-09-15  | present  | 【5†9af540ba4†github.com】  | —
L43: macOS Sequoia 15 (arm64)  | 2024-09-13  | present  | 【6†de2ec5c85†github.com】  | —
L44: macOS Sonoma 14 (arm64)  | 2023-09-28  | 2026-10-01  | 【7†1f7113d7e†github.com】  | 【8†59193c1a6†github.com】
L45: macOS Sonoma 14 (x86_64)  | 2023-09-28  | 2026-09-04  | 【7†1f7113d7e†github.com】  | 【9†e168cbec6†github.com】
L46: macOS Ventura 13 (arm64)  | 2022-11-06  | 2025-10-14  | 【10†a9528f499†github.com】  | 【11†ac5e5a164†github.com】
L47: macOS Ventura 13 (x86_64)  | 2022-11-28  | 2025-10-14  | 【12†3dfe90dfa†github.com】  | 【11†ac5e5a164†github.com】
L48: macOS Monterey 12 (arm64)  | 2021-10-27  | 2024-10-13  | 【13†205cb8630†github.com】  | 【14†6a70e371f†github.com】
L49: macOS Monterey 12 (x86_64)  | 2021-10-27  | 2024-10-13  | 【13†205cb8630†github.com】  | 【14†6a70e371f†github.com】
L50: macOS Big Sur 11 (arm64)  | 2021-01-08  | 2023-10-29  | 【15†f75ba817a†github.com】  | 【16†3af0c137a†github.com】
L51: macOS Big Sur 11 (x86_64)  | 2020-11-15  | 2023-10-29  | 【17†ad018ffcc†github.com】  | 【16†3af0c137a†github.com】
L52: macOS Catalina 10.15 (x86_64)  | 2019-10-14  | 2022-12-05  | 【18†7655c3a54†github.com】  | 【19†b82e5e06a†github.com】
L53: macOS Mojave 10.14 (x86_64)  | 2019-08-10  | 2021-12-31  | 【20†f260ff69d†github.com】  | 【21†c2d1144e3†github.com】
L54: macOS High Sierra 10.13 (x86_64)  | 2017-09-20  | 2021-01-08  | 【22†0ddfd5ef5†github.com】  | 【15†f75ba817a†github.com】
L55: macOS Sierra 10.12 (x86_64)  | 2016-11-06  | 2019-10-22  | 【23†f62e0e0b5†github.com】  | 【24†ec049dc8e†github.com】
L195: ### Issy Long
L196: 
L197: 2 commits · 0 version changes
L198: 
L199: 2019-11-24 – 2020-02-23
L200: 
L201: ### 【31†commitay†github.com】
L202: 
L203: 2 commits · 2 version changes
L204: 
L205: 2018-03-03 – 2018-03-18
L206: 
L207: ### 【32†FX Coudert†github.com】
L208: 
L209: 1 commit · 0 version changes
L210: 
L211: 2026-09-11 – 2026-09-11
L212: 
L213: ### Marc Prud&#39;hommeaux
L214: 
L215: 1 commit · 1 version change
L216: 
L217: 2025-10-17 – 2025-10-17
L218: 
L219: ### 【33†tuzi3040†github.com】
L220: 
L221: 1 commit · 1 version change
L222: 
L223: 2024-12-08 – 2024-12-08
L224: 
L225: ### Issy Long
L226: 
L227: 1 commit · 0 version changes
L228: 
L229: 2024-11-08 – 2024-11-08
L306: ### William Ma
L307: 
L308: 1 commit · 0 version changes
L309: 
L310: 2020-07-06 – 2020-07-06
L311: 
L312: ### Dominyk Tiller
L313: 
L314: 1 commit · 1 version change
L315: 
L316: 2017-03-16 – 2017-03-16
L317: 
L318: ### JCount
L319: 
L320: 1 commit · 1 version change
L321: 
L346: Version  | Updated  | Commit  | Subject
L347: --- | --- | --- | ---
L348: 2.4.5_6  | 2026-10-01  | 【36†2cb229580†github.com】  | fdroidserver: bump python resources
L349: 2.4.5_5  | 2026-09-04  | 【37†6eda4cd92†github.com】  | fdroidserver: bump python resources
L350: 2.4.5_4  | 2026-08-08  | 【38†7122192e3†github.com】  | fdroidserver: bump python resources
L351: 2.4.5_3  | 2026-08-04  | 【39†dccd6e36d†github.com】  | fdroidserver: bump python resources
L352: 2.4.5_2  | 2026-07-25  | 【40†e2261c3d2†github.com】  | fdroidserver: bump python resources
L353: 2.4.5_1  | 2026-07-22  | 【41†ebb318375†github.com】  | fdroidserver: bump python resources
L354: 2.4.5  | 2026-06-05  | 【42†a2a87cd76†github.com】  | fdroidserver 2.4.5
L355: 2.4.4_3  | 2026-05-21  | 【43†a27d9cfcb†github.com】  | fdroidserver: bump python resources
L356: 2.4.4_2  | 2026-05-11  | 【44†13c08fcda†github.com】  | fdroidserver: bump python resources
L357: 2.4.4_1  | 2026-05-09  | 【45†85691ce64†github.com】  | fdroidserver: bump python resources
L358: 2.4.4  | 2026-05-05  | 【46†920c58911†github.com】  | fdroidserver 2.4.4
L359: 2.4.3_6  | 2026-04-22  | 【47†1999b3a86†github.com】  | fdroidserver: bump python resources
L360: 2.4.3_5  | 2026-04-17  | 【48†54f5665a8†github.com】  | fdroidserver: bump python resources
L361: 2.4.3_4  | 2026-04-01  | 【49†1e79e57e5†github.com】  | fdroidserver: bump python resources
L362: 2.4.3_3  | 2026-01-09  | 【50†e5df40415†github.com】  | fdroidserver: bump python resources
L363: 2.4.3_2  | 2026-01-07  | 【51†d197a66f0†github.com】  | fdroidserver: bump python resources
L364: 2.4.3_1  | 2025-12-06  | 【52†ab11c9d53†github.com】  | fdroidserver: bump python resources
L365: 2.4.3  | 2025-12-03  | 【53†18192d198†github.com】  | fdroidserver 2.4.3
L366: 2.4.2_3  | 2025-12-02  | 【54†54df44754†github.com】  | fdroidserver: bump python resources
L367: 2.4.2_2  | 2025-11-05  | 【55†60244b38c†github.com】  | fdroidserver: revision bump (libxml2 2.15.1)
L368: 2.4.2_1  | 2025-10-17  | 【56†b31c00823†github.com】  | fdroidserver: update dependencies
L369: 2.4.2  | 2025-06-24  | 【57†40dd18787†github.com】  | fdroidserver 2.4.2
L370: 2.4.1  | 2025-06-23  | 【58†5701794e2†github.com】  | fdroidserver 2.4.1
L371: 2.4.0_2  | 2025-06-19  | 【59†ac217a70c†github.com】  | fdroidserver: bump python resources
L372: 2.4.0_1  | 2025-06-10  | 【60†636ac086f†github.com】  | fdroidserver: bump python resources
L373: 2.4.0  | 2025-03-25  | 【61†ccf81ff6f†github.com】  | fdroidserver 2.4.0
L374: 2.3.5  | 2025-01-21  | 【62†7e484b0f2†github.com】  | fdroidserver 2.3.5
L375: 2.3.4  | 2024-12-12  | 【63†81f7731c7†github.com】  | fdroidserver 2.3.4
L376: 2.3.3  | 2024-12-11  | 【64†78a915c62†github.com】  | fdroidserver 2.3.3
L377: 2.3.2_1  | 2024-12-08  | 【65†cde57f60e†github.com】  | fdroidserver: update python resource argcomplete to 3.5.2
L378: 2.3.2  | 2024-11-26  | 【66†1a99cbe4d†github.com】  | fdroidserver 2.3.2
L379: 2.3.1_1  | 2024-11-26  | 【67†c0086e271†github.com】  | fdroidserver 2.3.1: add libraries to enable new features
L380: 2.3.1  | 2024-11-25  | 【68†e5fe61974†github.com】  | fdroidserver 2.3.1
L381: 2.3.0  | 2024-11-21  | 【69†231753f45†github.com】  | fdroidserver 2.3.0
L382: 2.2.2_2  | 2024-06-18  | 【70†61eaf8c66†github.com】  | fdroidserver: bump python resources
L383: 2.2.2_1  | 2024-06-12  | 【71†5d7909e2d†github.com】  | fdroidserver: bump python resources
L384: 2.2.2  | 2024-04-24  | 【72†f9f4e0dce†github.com】  | fdroidserver 2.2.2
L385: 2.2.1_5  | 2024-04-12  | 【73†562830be3†github.com】  | fdroidserver: bump python resources
L386: 2.2.1_4  | 2024-02-27  | 【74†32907bd12†github.com】  | fdroidserver: bump python resources
L387: 2.2.1_3  | 2023-12-14  | 【75†65f54b89d†github.com】  | fdroidserver: add missing dep sdkmanager and update caveats
L388: 2.2.1_2  | 2023-11-08  | 【76†a2bcd9312†github.com】  | fdroidserver: migrate to `python@3.12`
L389: 2.2.1_1  | 2023-06-22  | 【77†08b05cb9e†github.com】  | fdroidserver: switch to `openssl@3`
L390: 2.2.1  | 2023-03-12  | 【78†b372b49e7†github.com】  | fdroidserver 2.2.1
L391: 2.2.0  | 2023-02-21  | 【79†000ced660†github.com】  | fdroidserver 2.2.0
L392: 2.1.2  | 2022-11-27  | 【80†54c011114†github.com】  | fdroidserver 2.1.2
L393: 2.1.1  | 2022-09-07  | 【81†6b6a3cbd4†github.com】  | fdroidserver 2.1.1
L394: 2.1_1  | 2022-07-29  | 【82†0e22db1cb†github.com】  | fdroidserver: migrate to `python@3.10`
L395: 2.1  | 2022-04-08  | 【83†e14e133ef†github.com】  | fdroidserver 2.1
L396: 2.0.3_4  | 2022-01-01  | 【84†ffba42aaf†github.com】  | fdroidserver: update python resources
L397: 2.0.3_3  | 2021-12-31  | 【85†00edd3ac3†github.com】  | fdroidserver: update cryptography resource
L398: 2.0.3_2  | 2021-10-13  | 【86†1c3d8509d†github.com】  | fdroidserver: revision bump for libffi 3.4.2
L399: 2.0.3_1  | 2021-07-02  | 【87†e6cbd4daa†github.com】  | fdroidserver: depend on pillow formula
L400: 2.0.3  | 2021-07-02  | 【88†809b586a1†github.com】  | fdroidserver 2.0.3
L401: 2.0.2  | 2021-06-02  | 【89†cfd1550d8†github.com】  | fdroidserver 2.0.2
L402: 2.0.1  | 2021-03-10  | 【90†8a85fa6ae†github.com】  | fdroidserver 2.0.1
L403: 2.0  | 2021-02-17  | 【91†ed0eec9eb†github.com】  | fdroidserver 2.0
L404: 1.1.10_1  | 2021-01-08  | 【92†f8aae5f66†github.com】  | fdroidserver: update cffi resource
L405: 1.1.10  | 2020-10-23  | 【93†d3235db47†github.com】  | fdroidserver 1.1.10
L406: 1.1.9  | 2020-06-25  | 【94†e0feab436†github.com】  | fdroidserver 1.1.9
L407: 1.1.8  | 2020-06-19  | 【95†c0b7e6955†github.com】  | fdroidserver 1.1.8
L408: 1.1.7  | 2020-05-16  | 【96†fb6bd95eb†github.com】  | fdroidserver 1.1.7
L409: 1.1.6_2  | 2020-04-11  | 【97†c922d206e†github.com】  | fdroidserver: revision bump for s3cmd 2.1.0
L410: 1.1.6_1  | 2020-03-11  | 【98†0804c7f91†github.com】  | fdroidserver: revision bump to fix virtualenv symlinks
L411: 1.1.6  | 2020-01-12  | 【99†1fcdeaffe†github.com】  | fdroidserver 1.1.6
L412: 1.1.5_2  | 2019-10-22  | 【100†d34afbaca†github.com】  | fdroidserver: update numpy resource
L413: 1.1.5_1  | 2019-09-09  | 【101†78af2fcd2†github.com】  | fdroidserver: move to OpenSSL 1.1
L414: 1.1.5  | 2019-08-28  | 【102†6891ae0cb†github.com】  | fdroidserver 1.1.5
L415: 1.1.4  | 2019-08-17  | 【103†b733383aa†github.com】  | fdroidserver 1.1.4
L416: 1.1.2  | 2019-08-10  | 【104†208820079†github.com】  | fdroidserver 1.1.2
L417: 1.0.9  | 2018-07-20  | 【105†bf00bb914†github.com】  | fdroidserver 1.0.9
L418: 1.0.8_1  | 2018-06-30  | 【106†cd8a085e0†github.com】  | fdroidserver: revision for python
L419: 1.0.8  | 2018-06-26  | 【107†6e7fd59b9†github.com】  | fdroidserver 1.0.8
L420: 1.0.6  | 2018-05-26  | 【108†97b860ba8†github.com】  | fdroidserver 1.0.6
L421: 1.0.4  | 2018-05-16  | 【109†d1ce11b1e†github.com】  | fdroidserver 1.0.4
L422: 1.0.3  | 2018-03-23  | 【110†8a877b83a†github.com】  | fdroidserver 1.0.3
L423: 1.0.2_5  | 2018-03-18  | 【111†b7f015583†github.com】  | fdroidserver: revision to fix broken bottle
L424: 1.0.2_4  | 2018-03-10  | 【112†d76ef8fb7†github.com】  | fdroidserver: revision for python
L425: 1.0.2_3  | 2018-03-03  | 【113†3b09a5cec†github.com】  | fdroidserver: revision to fix broken bottle
L426: 1.0.2_2  | 2018-03-02  | 【114†0d581ca90†github.com】  | fdroidserver: rename python dependency
L427: 1.0.2_1  | 2018-02-23  | 【115†376883ca5†github.com】  | fdroidserver: update resources
L428: 1.0.2  | 2018-02-23  | 【116†4d61bc476†github.com】  | fdroidserver 1.0.2
L429: 1.0.0  | 2018-01-04  | 【117†3bc9cc6c0†github.com】  | fdroidserver 1.0.0
L430: 0.9.1  | 2017-11-29  | 【118†8f568476f†github.com】  | fdroidserver 0.9.1
L431: 0.8_2  | 2017-09-30  | 【119†0fc8d13cb†github.com】  | fdroidserver: depend on s3cmd
L432: 0.8_1  | 2017-08-07  | 【120†1252fe748†github.com】  | fdroidserver: revision for jpeg
L433: 0.8  | 2017-08-06  | 【121†5f2db0bf0†github.com】  | fdroidserver 0.8
L434: 0.7.0_7  | 2017-03-30  | 【122†dd4e0291b†github.com】  | fdroidserver: remove recommended android-sdk dependency.
L435: 0.7.0_6  | 2017-03-16  | 【123†a7ec50c19†github.com】  | fdroidserver: update resources
L436: 0.7.0_5  | 2017-02-16  | 【124†75f3eadab†github.com】  | fdroidserver: rebuild bottles to avoid little-cms2
L437: 0.7.0_4  | 2017-01-31  | 【125†912a92372†github.com】  | fdroidserver: revision for webp
L438: 0.7.0_3  | 2017-01-27  | 【126†48fd4b284†github.com】  | fdroidserver dep fix?
L439: 0.7.0_2  | 2016-12-24  | 【127†ee226a7a4†github.com】  | fdroidserver: revision for python3
L440: 0.7.0_1  | 2016-11-08  | 【128†07b5d5a4d†github.com】  | fdroidserver: cryptography 1.5.3
L441: 0.7.0  | 2016-11-06  | 【129†d30b6b6e9†github.com】  | fdroidserver 0.7.0
L442: 0.4.0  | 2016-02-14  | 【130†4b9934335†github.com】  | fdroidserver 0.4.0 (new formula)
L443: Data licensed under 【131†CC-BY-4.0†creativecommons.org】. Code licensed under 【132†AGPL-3.0-only†www.gnu.org】.
</excerpt>
</source>
<source kind="open_page">
<title>fdroidserver: update resources · Homebrew/homebrew-core@a7ec50c · GitHub</title>
<location>https://github.com/homebrew/homebrew-core/commit/a7ec50c1988a05a2063ebf7a83aad7bdb81441be</location>
<excerpt>citeturn2view0 [wordlim: 200] Crawled: today; Content type: text/html; Source: click({&quot;ref_id&quot;:&quot;turn1view0&quot;,&quot;id&quot;:123}); Total lines: 399
L0: 【0†Skip to content】
L1: ## Navigation Menu
L2: 
L3: 【1†Sign in】
L4: 
L5: Appearance settings
L6: 
L7:   * Platform
L8: 
L9:     * AI CODE CREATION
L10:       * 【2†GitHub CopilotWrite better code with AI】
L11:       * 【3†GitHub Copilot appDirect agents from issue to merge】
L12:       * 【4†MCP RegistryIntegrate external tools】
L13: 
L14:     * DEVELOPER WORKFLOWS
L15:       * 【5†ActionsAutomate any workflow】
L16:       * 【6†CodespacesInstant dev environments】
L17:       * 【7†IssuesPlan and track work】
L18:       * 【8†Code ReviewManage code changes】
L19:       * 【9†Code QualityEnforce quality at merge】
L20:     * APPLICATION SECURITY
L21:       * 【10†GitHub Advanced SecurityFind and fix vulnerabilities】
L22:       * 【11†Code securitySecure your code as you build】
L23:       * 【12†Secret protectionStop leaks before they start】
L24: 
L25:     * EXPLORE
L26:       * 【13†Why GitHub】
L27:       * 【14†Documentation†docs.github.com】
L28:       * 【15†Blog†github.blog】
L29:       * 【16†Changelog†github.blog】
L30:       * 【17†Marketplace】
L31: 
L32: 【18†View all features】
L33: 
L34:   * Solutions
L35:     * BY COMPANY SIZE
L36:       * 【19†Enterprises】
L37:       * 【20†Small and medium teams】
L38:       * 【21†Startups】
L39:       * 【22†Nonprofits】
L40: 
L41:     * BY USE CASE
L42:       * 【23†App Modernization】
L43:       * 【24†DevSecOps】
L44:       * 【25†DevOps】
L45:       * 【26†CI/CD】
L46:       * 【27†View all use cases】
L47: 
L48:     * BY INDUSTRY
L49:       * 【28†Healthcare】
L50:       * 【29†Financial services】
L51:       * 【30†Manufacturing】
L52:       * 【31†Government】
L53:       * 【32†See all industries】
L54: 
L55: 【33†View all solutions】
L56: 
L57:   * Resources
L58:     * EXPLORE BY TOPIC
L59:       * 【34†AI】
L60:       * 【35†Software Development】
L61:       * 【36†DevOps】
L62:       * 【37†Security】
L63:       * 【38†View all topics】
L64: 
L65:     * EXPLORE BY TYPE
L66:       * 【39†Customer stories】
L67:       * 【40†Events &amp; webinars】
L68:       * 【41†Ebooks &amp; reports】
L69:       * 【42†Business insights】
L70:       * 【43†GitHub Skills†skills.github.com】
L71:     * SUPPORT &amp; SERVICES
L72:       * 【14†Documentation†docs.github.com】
L73:       * 【44†Customer support†support.github.com】
L74:       * 【45†Community forum】
L75:       * 【46†Trust center】
L76:       * 【47†Partners】
L77: 
L78: 【48†View all resources】
L79: 
L80:   * Open Source
L81: 
L82:     * COMMUNITY
L83:       * 【49†GitHub SponsorsFund open source developers】
L84:     * PROGRAMS
L85:       * 【50†Security Lab†securitylab.github.com】
L86:       * 【51†Maintainer Community†maintainers.github.com】
L87:       * 【52†GitHub Stars†stars.github.com】
L88:       * 【53†Archive Program†archiveprogram.github.com】
L89: 
L90:     * REPOSITORIES
L91:       * 【54†Topics】
L92:       * 【55†Trending】
L93:       * 【56†Collections】
L94: 
L95:   * Enterprise
L96: 
L97:     * ENTERPRISE SOLUTIONS
L98:       * 【19†Enterprise platformAI-powered developer platform】
L99:     * AVAILABLE ADD-ONS
L100:       * 【10†GitHub Advanced SecurityEnterprise-grade security features】
L101:       * 【57†Copilot for BusinessEnterprise-grade AI features】
L102:       * 【58†Premium SupportEnterprise-grade 24/7 support】
L103: 
L104:   * 【59†Pricing】
L105: 
L106: Search`/`
L107: 
L108: 【1†Sign in】
L109: 
L110: 【60†Sign up】
L111: 
L112: Appearance settings
L113: You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session. Dismiss alert
L114: 
L115:   1. 【61†Homebrew】
L116:   2. 【62†homebrew-core】
L117: ## Repository navigation
L118: 
L119:   *   * 【62†Code】
L120:   * 【63†Issues3 (3)】
L121:   * 【64†Pull requests90 (90)】
L122:   * 【65†Actions】
L123:   * 【66†Security and quality】
L124:   * 【67†Insights】
L125: 
L126: More items
L127: # Commit a7ec50c
L128: 
L129: Browse the repository at this point in the history Browse files
L130: 
L131: 【68†Image: DomT4†avatars.githubusercontent.com】【69†Image: ilovezfs†avatars.githubusercontent.com】
L132: 
L133: 【70†DomT4】
L134: 
L135: authored and
L136: 
L137: 【71†ilovezfs】
L138: 
L139: committed
L140: 
L141: fdroidserver: update resources
L142: 
L143:     1 parent 【72†68ee193】 commit a7ec50c
L144: 
L145:     Copy full SHA for a7ec50c
L146: 
L147: 1 file changed
L148: 
L149: +72-41 Lines changed: 72 additions &amp; 41 deletions
L150: ## File tree
L151: 
L152: Expand file tree Collapse file tree
L153: 
L154: Open diff view settings
L155: 
L156: [Input: Filter files…]
L157: 
L158: Filter options
L159: 
L160:   * Formula
L161: 
L162:     * 【73†fdroidserver.rb】
L163: 
L164: Expand file tree Collapse file tree
L165: 
L166: Open diff view settings
L167: 
L168: Collapse file
L169: ### 【73†`‎Formula/fdroidserver.rb‎`】
L170: 
L171: Copy file name to clipboard Expand all lines: Formula/fdroidserver.rb
L172: 
L173: +72-41 Lines changed: 72 additions &amp; 41 deletions
L174: Original file line number  | Diff line number  | Diff line change
L175: --- | --- | ---
L176: `@@ -5,7 +5,7 @@ class Fdroidserver &lt; Formula`
L177: `5`  | `5`  | ` homepage &quot;https://f-droid.org&quot;`
L178: `6`  | `6`  | ` url &quot;https://files.pythonhosted.org/packages/18/6c/6fe6f718073024e23fb0bfaff8d0a6db596adc7d29f259edd325e93bd33c/fdroidserver-0.7.0.tar.gz&quot;`
L179: `7`  | `7`  | ` sha256 &quot;3de76a02d17260a5fd65b089ceaabcc578e238ffe71f205a8f6f37e705648d6e&quot;`
L180: `8`  | ``  | `- revision 5`
L181: ``  | `8`  | `+ revision 6`
L182: `9`  | `9`  | `
L183: `
L184: `10`  | `10`  | ` bottle do`
L185: `11`  | `11`  | ` sha256 &quot;e5acb7e77486c4759655fae3e8e4772765bcdedc42bb26c674393736af60d2a2&quot; =&gt; :sierra`
L186: `@@ -22,18 +22,28 @@ class Fdroidserver &lt; Formula`
L187: `22`  | `22`  | ` depends_on &quot;android-sdk&quot; =&gt; :recommended`
L188: `23`  | `23`  | `
L189: `
L190: `24`  | `24`  | ` resource &quot;apache-libcloud&quot; do`
L191: `25`  | ``  | `- url &quot;https://files.pythonhosted.org/packages/d3/44/847e2e81da096b89ef56cb1c66093e61b06a8e1262f8ea2a76358e0d7b65/apache-libcloud-1.3.0.tar.bz2&quot;`
L192: `26`  | ``  | `- sha256 &quot;3b74fa9ee317b9e744f25fe2381c4a582545fe1259d133afc5a660b935a9861b&quot;`
L193: ``  | `25`  | `+ url &quot;https://files.pythonhosted.org/packages/1d/a6/569313d0c95b6e0bbebc5f2c8197a7261c85556a3de84d42e9093d7d6996/apache-libcloud-1.5.0.tar.bz2&quot;`
L194: ``  | `26`  | `+ sha256 &quot;ea3dd7825e30611e5a018ab18107b33a9029097d64bd8b39a87feae7c2770282&quot;`
L195: ``  | `27`  | `+ end`
L196: ``  | `28`  | `+`
L197: ``  | `29`  | `+ resource &quot;appdirs&quot; do`
L198: ``  | `30`  | `+ url &quot;https://files.pythonhosted.org/packages/48/69/d87c60746b393309ca30761f8e2b49473d43450b150cb08f3c6df5c11be5/appdirs-1.4.3.tar.gz&quot;`
L199: ``  | `31`  | `+ sha256 &quot;9e5896d1372858f8dd3344faf4e5014d21849c756c8d5701f78f8a103b372d92&quot;`
L200: `27`  | `32`  | ` end`
L201: `28`  | `33`  | `
L202: `
L203: `29`  | `34`  | ` resource &quot;args&quot; do`
L204: `30`  | `35`  | ` url &quot;https://files.pythonhosted.org/packages/e5/1c/b701b3f4bd8d3667df8342f311b3efaeab86078a840fb826bd204118cc6b/args-0.1.0.tar.gz&quot;`
L205: `31`  | `36`  | ` sha256 &quot;a785b8d837625e9b61c39108532d95b85274acd679693b71ebb5156848fcf814&quot;`
L206: `32`  | `37`  | ` end`
L207: `33`  | `38`  | `
L208: `
L209: ``  | `39`  | `+ resource &quot;asn1crypto&quot; do`
L210: ``  | `40`  | `+ url &quot;https://files.pythonhosted.org/packages/ce/39/17e90c2efacc4060915f7d1f9b8d2a5b20e54e46233bdf3092e68193407d/asn1crypto-0.21.1.tar.gz&quot;`
L211: ``  | `41`  | `+ sha256 &quot;4e6d7b22814d680114a439faafeccb9402a78095fb23bf0b25f9404c6938a017&quot;`
L212: ``  | `42`  | `+ end`
L213: ``  | `43`  | `+`
L214: `34`  | `44`  | ` resource &quot;cffi&quot; do`
L215: `35`  | ``  | `- url &quot;https://files.pythonhosted.org/packages/0a/f3/686af8873b70028fccf67b15c78fd4e4667a3da995007afc71e786d61b0a/cffi-1.8.3.tar…[truncated]</excerpt>
</source>
<source kind="open_page">
<title>fdroidserver 0.7.0 · Homebrew/homebrew-core@d30b6b6 · GitHub</title>
<location>https://github.com/homebrew/homebrew-core/commit/d30b6b6e9fb28bc8c35258e781b66b9504cb6193</location>
<excerpt>citeturn2view1 [wordlim: 200] Crawled: today; Content type: text/html; Source: click({&quot;ref_id&quot;:&quot;turn1view0&quot;,&quot;id&quot;:129}); Total lines: 381
</excerpt>
</source>
<source kind="open_page">
<title>fdroidserver: update resources · Homebrew/homebrew-core@a7ec50c · GitHub</title>
<location>https://github.com/homebrew/homebrew-core/commit/a7ec50c1988a05a2063ebf7a83aad7bdb81441be</location>
<excerpt>citeturn3view0 [wordlim: 200] Crawled: today; Content type: text/html; Source: open({&quot;ref_id&quot;:&quot;turn2view0&quot;,&quot;lineno&quot;:235}); Total lines: 399
L215: `35`  | ``  | `- url &quot;https://files.pythonhosted.org/packages/0a/f3/686af8873b70028fccf67b15c78fd4e4667a3da995007afc71e786d61b0a/cffi-1.8.3.tar.gz&quot;`
L216: `36`  | ``  | `- sha256 &quot;c321bd46faa7847261b89c0469569530cad5a41976bb6dba8202c0159f476568&quot;`
L217: ``  | `45`  | `+ url &quot;https://files.pythonhosted.org/packages/a1/32/e3d6c3a8b5461b903651dd6ce958ed03c093d2e00128e3f33ea69f1d7965/cffi-1.9.1.tar.gz&quot;`
L218: ``  | `46`  | `+ sha256 &quot;563e0bd53fda03c151573217b3a49b3abad8813de9dd0632e10090f6190fdaf8&quot;`
L219: `37`  | `47`  | ` end`
L220: `38`  | `48`  | `
L221: `
L222: `39`  | `49`  | ` resource &quot;clint&quot; do`
L223: `@@ -42,8 +52,8 @@ class Fdroidserver &lt; Formula`
L224: `42`  | `52`  | ` end`
L225: `43`  | `53`  | `
L226: `
L227: `44`  | `54`  | ` resource &quot;cryptography&quot; do`
L228: `45`  | ``  | `- url &quot;https://files.pythonhosted.org/packages/6c/c5/7fc1f8384443abd2d71631ead026eb59863a58cad0149b94b89f08c8002f/cryptography-1.5.3.tar.gz&quot;`
L229: `46`  | ``  | `- sha256 &quot;cf82ddac919b587f5e44247579b433224cc2e03332d2ea4d89aa70d7e6b64ae5&quot;`
L230: ``  | `55`  | `+ url &quot;https://files.pythonhosted.org/packages/ec/5f/d5bc241d06665eed93cd8d3aa7198024ce7833af7a67f6dc92df94e00588/cryptography-1.8.1.tar.gz&quot;`
L231: ``  | `56`  | `+ sha256 &quot;323524312bb467565ebca7e50c8ae5e9674e544951d28a2904a50012a8828190&quot;`
L232: `47`  | `57`  | ` end`
L233: `48`  | `58`  | `
L234: `
L235: `49`  | `59`  | ` resource &quot;gitdb2&quot; do`
L236: `@@ -52,48 +62,48 @@ class Fdroidserver &lt; Formula`
L237: `52`  | `62`  | ` end`
L238: `53`  | `63`  | `
L239: `
L240: `54`  | `64`  | ` resource &quot;GitPython&quot; do`
L241: `55`  | ``  | `- url &quot;https://files.pythonhosted.org/packages/d7/16/e914d345d7d4e988f9196b9719a99220bad6a5dbd636162f9b5cc35f3bd6/GitPython-2.1.0.tar.gz&quot;`
L242: `56`  | ``  | `- sha256 &quot;3ebda1e6ff1ef68597e41dcd1b99c2a5ae902f4dc2b22ad3533cc89c32b42aad&quot;`
L243: ``  | `65`  | `+ url &quot;https://files.pythonhosted.org/packages/e8/87/a1cdd8b210e4b825ec34fef996d2680dc00ee9517379c167e9a57af0664e/GitPython-2.1.3.tar.gz&quot;`
L244: ``  | `66`  | `+ sha256 &quot;3826185b11e1fc372e7d31251e9b65e11ccb7c27f82c771d619048bdb5b66c81&quot;`
L245: `57`  | `67`  | ` end`
L246: `58`  | `68`  | `
L247: `
L248: `59`  | `69`  | ` resource &quot;idna&quot; do`
L249: `60`  | ``  | `- url &quot;https://files.pythonhosted.org/packages/fb/84/8c27516fbaa8147acd2e431086b473c453c428e24e8fb99a1d89ce381851/idna-2.1.tar.gz&quot;`
L250: `61`  | ``  | `- sha256 &quot;ed36f281aebf3cd0797f163bb165d84c31507cedd15928b095b1675e2d04c676&quot;`
L251: ``  | `70`  | `+ url &quot;https://files.pythonhosted.org/packages/d8/82/28a51052215014efc07feac7330ed758702fc0581347098a81699b5281cb/idna-2.5.tar.gz&quot;`
L252: ``  | `71`  | `+ sha256 &quot;3cb5ce08046c4e3a560fc02f138d0ac63e00f8ce5901a56b32ec8b7994082aab&quot;`
L253: `62`  | `72`  | ` end`
L254: `63`  | `73`  | `
L255: `
L256: `64`  | ``  | `- resource &quot;ipaddress&quot; do`
L257: `65`  | ``  | `- url &quot;https://files.pythonhosted.org/packages/bb/26/3b64955ff73f9e3155079b9ed31812afdfa5333b5c76387454d651ef593a/ipaddress-1.0.17.tar.gz&quot;`
L258: `66`  | ``  | `- sha256 &quot;3a21c5a15f433710aaa26f1ae174b615973a25182006ae7f9c26de151cd51716&quot;`
L259: ``  | `74`  | `+ resource &quot;mwclient&quot; do`
L260: ``  | `75`  | `+ url &quot;https://files.pythonhosted.org/packages/66/84/e99c39f3ab25a18eea9371d4e47ba79866d08f2e0ef3d70926f3ebd05c1b/mwclient-0.8.4.tar.gz&quot;`
L261: ``  | `76`  | `+ sha256 &quot;eedffd90912ec9ea1044c3e15c62d62df8763ad87cfd1f47ccf7ef53e1b7a018&quot;`
L262: `67`  | `77`  | ` end`
L263: `68`  | `78`  | `
L264: `
L265: `69`  | ``  | `- resource &quot;mwclient&quot; do`
L266: `70`  | ``  | `- url &quot;https://files.pyt…[truncated]</excerpt>
</source>
<source kind="open_page">
<title>fdroidserver 0.7.0 · Homebrew/homebrew-core@d30b6b6 · GitHub</title>
<location>https://github.com/homebrew/homebrew-core/commit/d30b6b6e9fb28bc8c35258e781b66b9504cb6193</location>
<excerpt>citeturn3view1 [wordlim: 200] Crawled: today; Content type: text/html; Source: open({&quot;ref_id&quot;:&quot;turn2view1&quot;,&quot;lineno&quot;:170}); Total lines: 381
L99:     * AVAILABLE ADD-ONS
L100:       * 【10†GitHub Advanced SecurityEnterprise-grade security features】
L101:       * 【57†Copilot for BusinessEnterprise-grade AI features】
L102:       * 【58†Premium SupportEnterprise-grade 24/7 support】
L103: 
L104:   * 【59†Pricing】
L105: 
L106: Search`/`
L107: 
L108: 【1†Sign in】
L109: 
L110: 【60†Sign up】
L111: 
L112: Appearance settings
L113: You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session. Dismiss alert
L114: 
L115:   1. 【61†Homebrew】
L116:   2. 【62†homebrew-core】
L117: ## Repository navigation
L118: 
L119:   *   * 【62†Code】
L120:   * 【63†Issues3 (3)】
L121:   * 【64†Pull requests90 (90)】
L122:   * 【65†Actions】
L123:   * 【66†Security and quality】
L124:   * 【67†Insights】
L125: 
L126: More items
L127: # Commit d30b6b6
L128: 
L129: Browse the repository at this point in the history Browse files
L130: 
L131: 【68†Image: tsparber†avatars.githubusercontent.com】【69†Image: dunn†avatars.githubusercontent.com】
L132: 
L133: 【70†tsparber】
L134: 
L135: authored and
L136: 
L137: 【71†dunn】
L138: 
L139: committed
L140: 
L141: fdroidserver 0.7.0
L142: 
L143: Closes 【72†#6440】. Signed-off-by: Alex Dunn &lt;dunn.alex@gmail.com&gt;
L144: 
L145:     1 parent 【73†54f6c86】 commit d30b6b6
L146: 
L147:     Copy full SHA for d30b6b6
L148: 
L149: 1 file changed
L150: 
L151: +84-43 Lines changed: 84 additions &amp; 43 deletions
L152: ## File tree
L153: 
L154: Expand file tree Collapse file tree
L155: 
L156: Open diff view settings
L157: 
L158: [Input: Filter files…]
L159: 
L160: Filter options
L161: 
L162:   * Formula
L163: 
L164:     * 【74†fdroidserver.rb】
L165: 
L166: Expand file tree Collapse file tree
L167: 
L168: Open diff view settings
L169: 
L170: Collapse file
L171: ### 【74†`‎Formula/fdroidserver.rb‎`】
L172: 
L173: Copy file name to clipboard Expand all lines: Formula/fdroidserver.rb
L174: 
L175: +84-43 Lines changed: 84 additions &amp; 43 deletions
L176: Original file line number  | Diff line number  | Diff line change
L177: --- | --- | ---
L178: `@@ -1,8 +1,10 @@`
L179: `1`  | `1`  | `class Fdroidserver &lt; Formula`
L180: ``  | `2`  | `+ include Language::Python::Virtualenv`
L181: ``  | `3`  | `+`
L182: `2`  | `4`  | ` desc &quot;Create and manage Android app repositories for F-Droid&quot;`
L183: `3`  | ``  | `- homepage &quot;https://f-droid.org/&quot;`
L184: `4`  | ``  | `- url &quot;https://pypi.python.org/packages/source/f/fdroidserver/fdroidserver-0.4.0.tar.gz&quot;`
L185: `5`  | ``  | `- sha256 &quot;89742f2e03e082c9d185835dbb4f166dade19a0e257b247a6e0bca3b4fd9b523&quot;`
L186: ``  | `5`  | `+ homepage &quot;https://f-droid.org&quot;`
L187: ``  | `6`  | `+ url &quot;https://files.pythonhosted.org/packages/18/6c/6fe6f718073024e23fb0bfaff8d0a6db596adc7d29f259edd325e93bd33c/fdroidserver-0.7.0.tar.gz&quot;`
L188: ``  | `7`  | `+ sha256 &quot;3de76a02d17260a5fd65b089ceaabcc578e238ffe71f205a8f6f37e705648d6e&quot;`
L189: `6`  | `8`  | `
L190: `
L191: `7`  | `9`  | ` bottle do`
L192: `8`  | `10`  | ` cellar :any`
L193: `@@ -11,86 +13,125 @@ class Fdroidserver &lt; Formula`
L194: `11`  | `13`  | ` sha256 &quot;b82b7afb81d63e8a734111d9ebf86079cdcd9c60903c03f0057b281709af7aef&quot; =&gt; :mavericks`
L195: `12`  | `14`  | ` end`
L196: `13`  | `15`  | `
L197: `
L198: `14`  | ``  | `- depends_on :java =&gt; &quot;1.7+&quot;`
L199: `15`  | ``  | `- depends_on :python if MacOS.version &lt;= :snow_leopard`
L200: ``  | `16`  | `+ depends_on :python3`
L201: `16`  | `17`  | ` depends_on &quot;freetype&quot;`
L202: `17`  | `18`  | ` depends_on &quot;jpeg&quot;`
L203: `18`  | ``  | `- depends_on &quot;libyaml&quot;`
L204: ``  | `19`  | `+ depends_on &quot;openssl&quot;`…[truncated]</excerpt>
</source>
<omitted_sources count="19">Additional source records were omitted from this bounded result.</omitted_sources>
</source_evidence>

Citations:

- 1: https://pkgstory.dev/homebrew-formula/fdroidserver/
- 2: https://pkgstory.dev/homebrew-formula/fdroidserver/

Use the first fdroidserver build that bundled GitPython 3.1.62.

GHSA-gq48-pqfc-9p58 affects only GitPython 3.1.62 and is fixed in 3.2.0. Homebrew’s 0.7.0 formula history bundled GitPython 2.1.3, so introduced: "0.7.0" includes unaffected builds.

The sibling advisories do not justify this boundary. CVE-2026-110858 starts at 2.1.2, showing that matched GitPython ranges can have advisory-specific lower bounds. The record stores upstream_fixed_in: "3.2.0" but does not record the upstream lower endpoint separately.

@BrewTestBot
BrewTestBot force-pushed the matched-advisories-24 branch from ef85490 to 0faf3eb Compare October 28, 2026 11:03

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2


Review info
Run configuration
Commits

Reviewing files that changed from the base of the PR and between ef85490 and 0faf3eb.

Files selected for processing: 67
  • advisories/BREW-fdroidserver-CVE-2008-0299.json
  • advisories/BREW-fdroidserver-CVE-2012-0805.json
  • advisories/BREW-fdroidserver-CVE-2018-1000805.json
  • advisories/BREW-fdroidserver-CVE-2018-7750.json
  • advisories/BREW-fdroidserver-CVE-2019-7164.json
  • advisories/BREW-fdroidserver-CVE-2019-7548.json
  • advisories/BREW-fdroidserver-CVE-2022-24302.json
  • advisories/BREW-fdroidserver-CVE-2022-24439.json
  • advisories/BREW-fdroidserver-CVE-2023-40267.json
  • advisories/BREW-fdroidserver-CVE-2023-40590.json
  • advisories/BREW-fdroidserver-CVE-2023-41040.json
  • advisories/BREW-fdroidserver-CVE-2023-48795.json
  • advisories/BREW-fdroidserver-CVE-2024-22190.json
  • advisories/BREW-fdroidserver-CVE-2026-100689.json
  • advisories/BREW-fdroidserver-CVE-2026-110855.json
  • advisories/BREW-fdroidserver-CVE-2026-110856.json
  • advisories/BREW-fdroidserver-CVE-2026-110857.json
  • advisories/BREW-fdroidserver-CVE-2026-110858.json
  • advisories/BREW-fdroidserver-CVE-2026-110859.json
  • advisories/BREW-fdroidserver-CVE-2026-110860.json
  • advisories/BREW-fdroidserver-CVE-2026-114145.json
  • advisories/BREW-fdroidserver-CVE-2026-42215.json
  • advisories/BREW-fdroidserver-CVE-2026-42284.json
  • advisories/BREW-fdroidserver-CVE-2026-44243.json
  • advisories/BREW-fdroidserver-CVE-2026-44244.json
  • advisories/BREW-fdroidserver-CVE-2026-44405.json
  • advisories/BREW-fdroidserver-CVE-2026-67322.json
  • advisories/BREW-fdroidserver-CVE-2026-67323.json
  • advisories/BREW-fdroidserver-CVE-2026-67324.json
  • advisories/BREW-fdroidserver-CVE-2026-67325.json
  • advisories/BREW-fdroidserver-CVE-2026-67326.json
  • advisories/BREW-fdroidserver-CVE-2026-69097.json
  • advisories/BREW-fdroidserver-CVE-2026-73619.json
  • advisories/BREW-fdroidserver-CVE-2026-73620.json
  • advisories/BREW-fdroidserver-CVE-2026-73621.json
  • advisories/BREW-fdroidserver-CVE-2026-73622.json
  • advisories/BREW-fdroidserver-CVE-2026-73623.json
  • advisories/BREW-fdroidserver-CVE-2026-73624.json
  • advisories/BREW-fdroidserver-CVE-2026-73625.json
  • advisories/BREW-fdroidserver-CVE-2026-76217.json
  • advisories/BREW-fdroidserver-CVE-2026-76218.json
  • advisories/BREW-fdroidserver-CVE-2026-76219.json
  • advisories/BREW-fdroidserver-CVE-2026-76220.json
  • advisories/BREW-fdroidserver-CVE-2026-76221.json
  • advisories/BREW-fdroidserver-CVE-2026-76222.json
  • advisories/BREW-fdroidserver-CVE-2026-78675.json
  • advisories/BREW-fdroidserver-CVE-2026-78676.json
  • advisories/BREW-fdroidserver-CVE-2026-78677.json
  • advisories/BREW-fdroidserver-CVE-2026-78678.json
  • advisories/BREW-fdroidserver-CVE-2026-78679.json
  • advisories/BREW-fdroidserver-CVE-2026-87817.json
  • advisories/BREW-fdroidserver-CVE-2026-87819.json
  • advisories/BREW-git-annex-CVE-2014-6274.json
  • advisories/BREW-git-annex-CVE-2017-12976.json
  • advisories/BREW-git-annex-CVE-2018-10857.json
  • advisories/BREW-git-annex-CVE-2018-10859.json
  • advisories/BREW-git-annex-HSEC-2023-0012.json
  • advisories/BREW-hf-CVE-2026-112940.json
  • advisories/BREW-rapid-mlx-CVE-2026-112940.json
  • advisories/BREW-rapid-mlx-CVE-2026-113786.json
  • advisories/BREW-rapid-mlx-CVE-2026-115572.json
  • advisories/BREW-rapid-mlx-CVE-2026-115580.json
  • advisories/BREW-rapid-mlx-CVE-2026-115585.json
  • advisories/BREW-rapid-mlx-CVE-2026-116684.json
  • advisories/BREW-rapid-mlx-CVE-2026-116685.json
  • advisories/BREW-rapid-mlx-CVE-2026-116686.json
  • advisories/BREW-vpn-slice-CVE-2026-114605.json
Files skipped from review as they are similar to previous changes: 48

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.

"type": "ECOSYSTEM",
"events": [
{
"introduced": "2.1.2"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Major · Data Integrity & Integration · Heavy lift

Supported by static analysis

Script executed:

cat advisories/BREW-fdroidserver-CVE-2026-110858.json | sed -n '1,84p'
rg -n '110858' data/ 2>/dev/null

Repository: Homebrew/advisory-database

Length of output: 10496


Script executed:

set -u
printf '%s\n' '--- related advisory/history files ---'
rg -n -F --glob '*.json' -e 'fdroidserver' -e 'CVE-2026-110858' -e 'GHSA-f9j4-qggq-h239' advisories .github 2>/dev/null || test "$?" -eq 1
printf '%s\n' '--- advisory history and range overrides ---'
git log --all --oneline -- advisories/BREW-fdroidserver-CVE-2026-110858.json
git log --all -S'BREW-fdroidserver-CVE-2026-110858' --oneline -- advisories
rg -n -i --glob '*.json' -e 'override' -e 'reviewed' -e 'range_state' advisories | head -120
printf '%s\n' '--- available formula evidence ---'
rg --files . | rg 'fdroidserver|homebrew-core|formula|resource' | head -120
printf '%s\n' '--- remote historical formula references ---'
git remote -v
git ls-remote https://github.com/Homebrew/homebrew-core.git 'refs/tags/*' 2>/dev/null | head -3

Repository: Homebrew/advisory-database

Length of output: 16873


Web query:

GitPython GHSA-f9j4-qggq-h239 affected versions CVE-2026-110858 official advisory

Result:

<source_evidence>
<source kind="open_page">
<title>GitPython Remote.pull() refspec bypasses the --upload-pack unsafe-option guard, enabling arbitrary command execution · Advisory · gitpython-developers/GitPython · GitHub</title>
<location>https://github.com/gitpython-developers/GitPython/security/advisories/GHSA-f9j4-qggq-h239</location>
<excerpt>citeturn1view0 [wordlim: 200] Crawled: today; Content type: text/html; Source: open({&quot;ref_id&quot;:&quot;https://github.com/gitpython-developers/GitPython/security/advisories/GHSA-f9j4-qggq-h239&quot;,&quot;lineno&quot;:null}); Total lines: 296
L0: 【0†Skip to content】
L1: ## Navigation Menu
L2: 
L3: 【1†Sign in】
L4: 
L5: Appearance settings
L6: 
L7:   * Platform
L8: 
L9:     * AI CODE CREATION
L10:       * 【2†GitHub CopilotWrite better code with AI】
L11:       * 【3†GitHub Copilot appDirect agents from issue to merge】
L12:       * 【4†MCP RegistryIntegrate external tools】
L13: 
L14:     * DEVELOPER WORKFLOWS
L15:       * 【5†ActionsAutomate any workflow】
L16:       * 【6†CodespacesInstant dev environments】
L17:       * 【7†IssuesPlan and track work】
L18:       * 【8†Code ReviewManage code changes】
L19:       * 【9†Code QualityEnforce quality at merge】
L20:     * APPLICATION SECURITY
L21:       * 【10†GitHub Advanced SecurityFind and fix vulnerabilities】
L22:       * 【11†Code securitySecure your code as you build】
L23:       * 【12†Secret protectionStop leaks before they start】
L24: 
L25:     * EXPLORE
L26:       * 【13†Why GitHub】
L27:       * 【14†Documentation†docs.github.com】
L28:       * 【15†Blog†github.blog】
L29:       * 【16†Changelog†github.blog】
L30:       * 【17†Marketplace】
L31: 
L32: 【18†View all features】
L33: 
L34:   * Solutions
L35:     * BY COMPANY SIZE
L36:       * 【19†Enterprises】
L37:       * 【20†Small and medium teams】
L38:       * 【21†Startups】
L39:       * 【22†Nonprofits】
L40: 
L41:     * BY USE CASE
L42:       * 【23†App Modernization】
L43:       * 【24†DevSecOps】
L44:       * 【25†DevOps】
L45:       * 【26†CI/CD】
L46:       * 【27†View all use cases】
L47: 
L48:     * BY INDUSTRY
L49:       * 【28†Healthcare】
L50:       * 【29†Financial services】
L51:       * 【30†Manufacturing】
L52:       * 【31†Government】
L53:       * 【32†See all industries】
L54: 
L55: 【33†View all solutions】
L56: 
L57:   * Resources
L58:     * EXPLORE BY TOPIC
L59:       * 【34†AI】
L60:       * 【35†Software Development】
L61:       * 【36†DevOps】
L62:       * 【37†Security】
L63:       * 【38†View all topics】
L64: 
L65:     * EXPLORE BY TYPE
L66:       * 【39†Customer stories】
L67:       * 【40†Events &amp; webinars】
L68:       * 【41†Ebooks &amp; reports】
L69:       * 【42†Business insights】
L70:       * 【43†GitHub Skills†skills.github.com】
L71:     * SUPPORT &amp; SERVICES
L72:       * 【14†Documentation†docs.github.com】
L73:       * 【44†Customer support†support.github.com】
L74:       * 【45†Community forum】
L75:       * 【46†Trust center】
L76:       * 【47†Partners】
L77: 
L78: 【48†View all resources】
L79: 
L80:   * Open Source
L81: 
L82:     * COMMUNITY
L83:       * 【49†GitHub SponsorsFund open source developers】
L84:     * PROGRAMS
L85:       * 【50†Security Lab†securitylab.github.com】
L86:       * 【51†Maintainer Community†maintainers.github.com】
L87:       * 【52†GitHub Stars†stars.github.com】
L88:       * 【53†Archive Program†archiveprogram.github.com】
L89: 
L90:     * REPOSITORIES
L91:       * 【54†Topics】
L92:       * 【55†Trending】
L93:       * 【56†Collections】
L94: 
L95:   * Enterprise
L96: 
L97:     * ENTERPRISE SOLUTIONS
L98:       * 【19†Enterprise platformAI-powered developer platform】
L99:     * AVAILABLE ADD-ONS
L100:       * 【10†GitHub Advanced SecurityEnterprise-grade security features】
L101:       * 【57†Copilot for BusinessEnterprise-grade AI features】
L102:       * 【58†Premium SupportEnterprise-grade 24/7 support】
L103: 
L104:   * 【59†Pricing】
L105: 
L106: Search`/`
L107: 
L108: 【1†Sign in】
L109: 
L110: 【60†Sign up】
L111: 
L112: Appearance settings
L113: You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session. Dismiss alert
L114: 
L115:   1. 【61†gitpython-developers】
L116:   2. 【62†GitPython】
L117: ## Repository navigation
L118: 
L119:   *   * 【62†Code】
L120:   * 【63†Issues1 (1)】
L121:   * 【64†Pull requests】
L122:   * 【65†Discussions】
L123:   * 【66†Actions】
L124:   * 【67†Security and quality42 (42)】
L125:   * 【68†Insights】
L126: 
L127: More items
L128: 
L129: # GitPython Remote.pull() refspec bypasses the --upload-pack unsafe-option guard, enabling arbitrary command execution
L130: 
L131: Critical
L132: 
L133: 【69†Byron】 published GHSA-f9j4-qggq-h239 Sep 30, 2026
L134: 
L135: ## Package
L136: 
L137: GitPython (【70†pip】)
L138: 
L139: ## Affected versions
L140: 
L141: &gt;= 3.1.30
L142: 
L143: ## Patched versions
L144: 
L145: &gt;= 3.2.0
L146: 
L147: ## Description
L148: ## Summary
L149: `Remote.pull()` in GitPython forwards its positional `refspec` argument directly to the `git pull` child process while its unsafe-option guard inspects only keyword arguments. An application that passes attacker-influenced data as the `refspec` (for example a user-supplied branch or refspec parameter in a web or CI service) can supply an option-shaped value such as `--upload-pack=&lt;command&gt;`.
L150: The value bypasses the `unsafe_git_pull_options` check, is placed after the `--` separator on the `git pull` command line, and is executed as the upload-pack program for local-path or SSH transports. This yields arbitrary command execution with the privileges of the calling process using the documented default arguments (`allow_unsafe_options=False`).
L151: ## Root Cause
L152: `Remote.pull()` is documented to reject dangerous options unless `allow_unsafe_options=True`, and `--upload-pack` is explicitly listed as such an option. The guard, however, only screens keyword arguments and never the positional `refspec`. The check builds its candidate list with `Git._option_candidates([], kwargs)`, passing an empty list in place of the positionals, so the `refspec` value is never compared against `unsafe_git_pull_options = [&quot;--upload-pack&quot;]`.
L153: The normalized `refspec` is then forwarded verbatim to the `git pull` invocation. The leading `--` separator that neutralizes an option-shaped refspec for `git fetch` and `git push` does not protect `git pull`, because `git pull` re-forwards its trailing positionals to an internal `git fetch` without re-inserting a `--` separator, so the positional becomes an option to that internal fetch.
L154: 
L155:     `Affected function: git.remote.Remote.pull
L156:     Source: git/remote.py (guard at the check_unsafe_options call using _option_candidates([], kwargs); sink at the self.repo.git.pull(&quot;--&quot;, self, refspec, ...) invocation)
L157:     `
L158: ## Impact
L159: An attacker who controls the `refspec` value passed to `Remote.pull()` achieves arbitrary operating-system command execution as the process invoking GitPython, with no additional privileges and no user interaction, on the default code path. Exploitation requires that the pulled remote uses a transport that runs upload-pack on the local side, namely a local filesystem path or SSH; over HTTPS the `--upload-pack` value is inert because the server ignores a client-supplied upload-pack program.
L160: This transport requirement narrows the population of vulnerable deployments but does not add work for the attacker once a vulnerable target is reached. Working checkouts commonly use local-path or SSH origins, so the exposed population is substantial.
L161: ## Proof of Concept
L162: 
L163:     `Environment: GitPython from the affected source tree; system git 2.43.0.
L164:     The pulled origin uses a local filesystem transport (protocol.file.allow=always for git &gt;= 2.38).
L165:     `
L166: 
L167: Reproduction steps:
L168:   1. Create an origin repository reachable over a local-path transport.
L169:   2. In a consumer repository, register that origin and call `Remote.pull()` with an attacker-controlled refspec.
L170:   3. Observe that the injected command executes.
L171: 
L172:     import git
L173:     repo = git.Repo(&quot;consumer&quot;)                 # has an origin using a local-path or ssh transport
L174:     origin = repo.remote(&quot;origin&quot;)
L175:     # Attacker-controlled refspec value; default arguments (allow_unsafe_options=False):
L176:     origin.pull(refspec=&quot;--upload-pack=touch /tmp/pwned; git-upload-pack&quot;)
L177: 
L178:     `cmdline: git pull -v -- origin --upload-pack=touch /tmp/pwned; git-upload-pack
L179:     [attack]  marker created (RCE)      : True
L180:     [isolate] upload_pack passed as KWARG blocked : True   (only the positional refspec escapes)
L181:     [sibling] same value via git fetch  : safe            (pull-specific behavior)
L182:     [control] benign refspec            : safe
L183:     `
L184: ## Attack Chain
L185:   1. Exposure: An application calls `Remote.pull(refspec=&lt;value&gt;)` on the default path, where `&lt;value&gt;` is derived from attacker-influenced input such as a branch or refspec request parameter.
</excerpt>
</source>
<source kind="open_page">
<title>GitPython from 3.1.30 before 3.2.0 contains a remote code... · CVE-2026-110858 · GitHub Advisory Database · GitHub</title>
<location>https://github.com/advisories/GHSA-mcf4-6385-6rcq</location>
<excerpt>citeturn1view1 [wordlim: 200] Crawled: yesterday; Content type: text/html; Source: open({&quot;ref_id&quot;:&quot;turn0search2&quot;,&quot;lineno&quot;:null}); Total lines: 251
L0: 【0†Skip to content】
L1: ## Navigation Menu
L2: 
L3: 【1†Sign in】
L4: 
L5: Appearance settings
L6: 
L7: CVE-2026-110858
L8: 
L9:   * Platform
L10: 
L11:     * AI CODE CREATION
L12:       * 【2†GitHub CopilotWrite better code with AI】
L13:       * 【3†GitHub Copilot appDirect agents from issue to merge】
L14:       * 【4†MCP RegistryIntegrate external tools】
L15:     * DEVELOPER WORKFLOWS
L16:       * 【5†ActionsAutomate any workflow】
L17:       * 【6†CodespacesInstant dev environments】
L18:       * 【7†IssuesPlan and track work】
L19:       * 【8†Code ReviewManage code changes】
L20:       * 【9†Code QualityEnforce quality at merge】
L21: 
L22:     * APPLICATION SECURITY
L23:       * 【10†GitHub Advanced SecurityFind and fix vulnerabilities】
L24:       * 【11†Code securitySecure your code as you build】
L25:       * 【12†Secret protectionStop leaks before they start】
L26:     * EXPLORE
L27:       * 【13†Why GitHub】
L28:       * 【14†Documentation†docs.github.com】
L29:       * 【15†Blog†github.blog】
L30:       * 【16†Changelog†github.blog】
L31:       * 【17†Marketplace】
L32: 
L33: 【18†View all features】
L34: 
L35:   * Solutions
L36: 
L37:     * BY COMPANY SIZE
L38:       * 【19†Enterprises】
L39:       * 【20†Small and medium teams】
L40:       * 【21†Startups】
L41:       * 【22†Nonprofits】
L42: 
L43:     * BY USE CASE
L44:       * 【23†App Modernization】
L45:       * 【24†DevSecOps】
L46:       * 【25†DevOps】
L47:       * 【26†CI/CD】
L48:       * 【27†View all use cases】
L49:     * BY INDUSTRY
L50:       * 【28†Healthcare】
L51:       * 【29†Financial services】
L52:       * 【30†Manufacturing】
L53:       * 【31†Government】
L54:       * 【32†See all industries】
L55: 
L56: 【33†View all solutions】
L57: 
L58:   * Resources
L59: 
L60:     * EXPLORE BY TOPIC
L61:       * 【34†AI】
L62:       * 【35†Software Development】
L63:       * 【36†DevOps】
L64:       * 【37†Security】
L65:       * 【38†View all topics】
L66:     * EXPLORE BY TYPE
L67:       * 【39†Customer stories】
L68:       * 【40†Events &amp; webinars】
L69:       * 【41†Ebooks &amp; reports】
L70:       * 【42†Business insights】
L71:       * 【43†GitHub Skills†skills.github.com】
L72: 
L73:     * SUPPORT &amp; SERVICES
L74:       * 【14†Documentation†docs.github.com】
L75:       * 【44†Customer support†support.github.com】
L76:       * 【45†Community forum】
L77:       * 【46†Trust center】
L78:       * 【47†Partners】
L79: 
L80: 【48†View all resources】
L81: 
L82:   * Open Source
L83: 
L84:     * COMMUNITY
L85:       * 【49†GitHub SponsorsFund open source developers】
L86:     * PROGRAMS
L87:       * 【50†Security Lab†securitylab.github.com】
L88:       * 【51†Maintainer Community†maintainers.github.com】
L89:       * 【52†GitHub Stars†stars.github.com】
L90:       * 【53†Archive Program†archiveprogram.github.com】
L91: 
L92:     * REPOSITORIES
L93:       * 【54†Topics】
L94:       * 【55†Trending】
L95:       * 【56†Collections】
L96: 
L97:   * Enterprise
L98: 
L99:     * ENTERPRISE SOLUTIONS
L100:       * 【19†Enterprise platformAI-powered developer platform】
L101:     * AVAILABLE ADD-ONS
L102:       * 【10†GitHub Advanced SecurityEnterprise-grade security features】
L103:       * 【57†Copilot for BusinessEnterprise-grade AI features】
L104:       * 【58†Premium SupportEnterprise-grade 24/7 support】
L105: 
L106:   * 【59†Pricing】
L107: 
L108: Search`/`
L109: 
L110: 【1†Sign in】
L111: 
L112: 【60†Sign up】
L113: 
L114: Appearance settings
L115: You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session. Dismiss alert
L116: ## GitPython from 3.1.30 before 3.2.0 contains a remote code...
L117: 
L118: Critical severity Unreviewed Published Oct 15, 2026 to the GitHub Advisory Database • Updated Oct 15, 2026
L119: 
L120: ## Package
L121: 
L122: No package listed— 【61†Suggest a package】
L123: 
L124: ## Affected versions
L125: 
L126: Unknown
L127: 
L128: ## Patched versions
L129: 
L130: Unknown
L131: ## Description
L132: 
L133: GitPython from 3.1.30 before 3.2.0 contains a remote code execution vulnerability in Remote.pull() whose unsafe-option guard inspects only keyword arguments, not the positional refspec. Attackers controlling the refspec can supply --upload-pack= to execute OS commands as the calling process over local-path or SSH transports.
L134: ### References
L135: 
L136:   * 【62†GHSA-f9j4-qggq-h239】
L137:   * 【63†https://nvd.nist.gov/vuln/detail/CVE-2026-110858†nvd.nist.gov】
L138:   * 【64†https://www.vulncheck.com/advisories/gitpython-3.1.30-before-3.2.0-command-injection-via-remote-pull-refspec†www.vulncheck.com】
L139: 
L140: Published by the 【63†National Vulnerability Database†nvd.nist.gov】 Oct 14, 2026
L141: 
L142: Published to the GitHub Advisory Database Oct 15, 2026
L143: 
L144: Last updated Oct 15, 2026
L145: 
L146: ### Severity
L147: 
L148: Critical
L149: 
L150: 9.2
L151: # CVSS overall score
L152: 
L153: This score calculates overall vulnerability severity from 0 to 10 and is based on the Common Vulnerability Scoring System (CVSS).
L154: 
L155: / 10
L156: 
L157: #### CVSS v4 base metrics
L158: 
L159: ##### Exploitability Metrics
L160: 
L161: Attack Vector Network
L162: 
L163: Attack Complexity Low
L164: 
L165: Attack Requirements Present
L166: 
L167: Privileges Required None
L168: 
L169: User interaction None
L170: 
L171: ##### Vulnerable System Impact Metrics
L172: 
L173: Confidentiality High
L174: 
L175: Integrity High
L176: 
L177: Availability High
L178: ##### Subsequent System Impact Metrics
L179: 
L180: Confidentiality None
L181: 
L182: Integrity None
L183: 
L184: Availability None
L185: 
L186: Learn more about base metrics
L187: 
L188: # CVSS v4 base metrics
L189: ##### Exploitability Metrics
L190: Attack Vector: This metric reflects the context by which vulnerability exploitation is possible. This metric value (and consequently the resulting severity) will be larger the more remote (logically, and physically) an attacker can be in order to exploit the vulnerable system.
L191: The assumption is that the number of potential attackers for a vulnerability that could be exploited from across a network is larger than the number of potential attackers that could exploit a vulnerability requiring physical access to a device, and therefore warrants a greater severity.
L192: Attack Complexity: This metric captures measurable actions that must be taken by the attacker to actively evade or circumvent existing built-in security-enhancing conditions in order to obtain a working exploit. These are conditions whose primary purpose is to increase security and/or increase exploit engineering complexity. A vulnerability exploitable without a target-specific variable has a lower complexity than a vulnerability that would require non-trivial customization.
L193: This metric is meant to capture security mechanisms utilized by the vulnerable system.
L194: Attack Requirements: This metric captures the prerequisite deployment and execution conditions or variables of the vulnerable system that enable the attack. These differ from security-enhancing techniques/technologies (ref Attack Complexity) as the primary purpose of these conditions is not to explicitly mitigate attacks, but rather, emerge naturally as a consequence of the deployment and execution of the vulnerable system.
L195: Privileges Required: This metric describes the level of privileges an attacker must possess prior to successfully exploiting the vulnerability. The method by which the attacker obtains privileged credentials prior to the attack (e.g., free trial accounts), is outside the scope of this metric. Generally, self-service provisioned accounts do not constitute a privilege requirement if the attacker can grant themselves privileges as part of the attack.
L196: User interaction: This metric captures the requirement for a human user, other than the attacker, to participate in the successful compromise of the vulnerable system. This metric determines whether the vulnerability can be exploited solely at the will of the attacker, or whether a separate user (or user-initiated process) must participate in some manner.
L197: ##### Vulnerable System Impact Metrics
L198: 
L199: Confidentiality: This metric measures the impact to the confidentiality of the information managed by the VULNERABLE SYSTEM due to a successfully exploited vulnerability. Confidentiality refers to limiting information access and disclosure to only authorized users, as well as preventing access by, or disclosure to, unauthorized ones.
L200: Integrity: This metric measures the impact to integrity of a successfully exploited vulnerability. Integrity refers to the trustworthiness and veracity of information. Integrity of the VULNERABLE SYSTEM is impacted when an attacker makes unauthorized modification of system data. Integrity is also impacted when a system user can repudiate critical actions taken in the context of the system (e.g. due to insufficient logging).
L201: Availability: This metric measures the impact to the availability of the VULNERABLE SYSTEM resulting from a successfully exploited vulnerability. While the Confidentiality and Integrity impact metrics apply to the loss of confidentiality or integrity of data (e.g., information, files) used by the system, this metric refers to the loss of availability of the impacted system itself, such as a networked service (e.g., web, database, email).
L202: Since availability refers to the accessibility of information resources, attacks that consume network bandwidth, processor cycles, or disk space all impact the availability of a system.
L203: ##### Subsequent System Impact Metrics
L204: 
L205: Confidentiality: This metric measures the impact to the confidentiality of the information managed by the SUBSEQUENT SYSTEM due to a successfully exploited vulnerability. Confidentiality refers to limiting information access and disclosure to only authorized users, as well as preventing access by, or disclosure to, unauthorized ones.
L206: Integrity: This metric measures the impact to integrity of a successfully exploited vulnerability. Integrity refers to the trustworthiness and veracity of information. Integrity of the SUBSEQUENT SYSTEM is impacted when an attacker makes unauthorized modification of system data. Integrity is also impacted when a system user can repudiate critical actions taken in the context of the system (e.g. due to insufficient logging).
L207: Availability: This metric measures the impact to the availability of the SUBSEQUENT SYSTEM resulting from a successfully exploited vulnerability. While the Confidentiality and Integrity impact metrics apply to the loss of confidentiality or integrity of data (e.g., information, files) used by the system, this metric refers to the loss of availability of the impacted system itself, such as a networked service (e.g., web, database, email).
L208: Since availability refers to the accessibility of information resources, attacks that consume network bandwidth, processor cycles, or disk space all impact the availability of a system.
L209: CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
L210: ### EPSS score
L211: 
L212: 0.465%
L213: 
L214: # Exploit Prediction Scoring System (EPSS)
L215: 
L216: This score estimates the probability of this vulnerability being exploited within the next 30 days. Data provided by 【65†FIRST†www.first.org】.
L217: 
L218: (40th percentile)
L219: 
L220: ### Weaknesses
L221: 
L222: Weakness CWE-88
L223: #### 【66†Improper Neutralization of Argument Delimiters in a Command (&#39;Argument Injection&#39;)】
L224: 
L225: The product constructs a string for a command to be executed by a separate component in another control sphere, but it does not properly delimit the intended arguments, options, or switches within that command string. 【67†Learn more on MITRE.†cwe.mitre.org】
L226: 
L227: ### CVE ID
L228: 
L229: CVE-2026-110858
L230: 
L231: ### GHSA ID
L232: 
L233: GHSA-mcf4-6385-6rcq
L234: ### Source code
L235: 
L236: No known source code
L237: 
L238: Dependabot alerts are not supported on this advisory because it does not have a package from a supported ecosystem with an affected and fixed version.
L239: 
L240: 【68†Learn more about GitHub language support†docs.github.com】
L241: 
L242: Loading Checking history
L243: 
L244: ### Uh oh!
L245: 
L246: There was an error while loading. Please reload this page.
L247: 
L248: See something to contribute? 【61†Suggest improvements for this vulnerability】.
L249: 
L250: You can’t perform that action at this time.
</excerpt>
</source>
<source kind="search">
<title>GitPython from 3.1.30 before 3.2.0 contains a remote code... · CVE-2026-110858 · GitHub Advisory Database · GitHub</title>
<location>https://github.com/advisories/GHSA-mcf4-6385-6rcq</location>
<excerpt>citeturn0search2 [wordlim: 200] Published: last week; Crawled: last week; CVE-2026-110858 ... GitPython from 3.1.30 before 3.2.0 contains a remote code execution vulnerability in Remote.pull() whose unsafe-option guard inspects only keyword arguments, not the positional refspec. ...   * https://nvd.nist.gov/vuln/detail/CVE-2026-110858 ... Dependabot alerts are not supported on this advisory because it does not have a package from a supported ecosystem with an affected and fixed version.
</excerpt>
</source>
<source kind="search">
<title>GitPython Remote.pull() refspec bypasses the --upload-pack unsafe-option guard, enabling arbitrary command execution | Legacy GitLab Advisory Database</title>
<location>https://advisories.gitlab.com/pypi/gitpython/GHSA-f9j4-qggq-h239/</location>
<excerpt>citeturn0search0 [wordlim: 200] Published: yesterday; Crawled: today;   * github.com/gitpython-developers/GitPython/security/advisories/GHSA-f9j4-qggq-h239 ... pypi/GitPython/GHSA-f9j4-qggq-h239.yml
</excerpt>
</source>
<source kind="search">
<title>Security Advisories · gitpython-developers/GitPython · GitHub</title>
<location>https://github.com/gitpython-developers/GitPython/security/advisories</location>
<excerpt>citeturn0search1 [wordlim: 200] Crawled: 3 weeks ago; GHSA-f9j4-qggq-h239 published Sep 30, 2026 by Byron ...   * GitPython: arbitrary file read via attacker-controlled branch name in `Head.checkout()` (incomplete fix of CVE-2026-78679, at the method named by CVE-2026-76217)
</excerpt>
</source>
<omitted_sources count="16">Additional source records were omitted from this bounded result.</omitted_sources>
</source_evidence>

Citations:

- 1: https://github.com/gitpython-developers/GitPython/security/advisories/GHSA-f9j4-qggq-h239
- 2: https://github.com/advisories/GHSA-mcf4-6385-6rcq

Script executed:

set -u
printf '%s\n' '--- cited fdroidserver formula ---'
for path in Formula/fdroidserver.rb Formula/f/fdroidserver.rb; do
  url="https://raw.githubusercontent.com/Homebrew/homebrew-core/54c011114/$path"
  printf '%s\n' "$url"
  curl -L --fail --silent --show-error --max-time 20 "$url" | sed -n '1,180p' || true
done
printf '%s\n' '--- formula commit history candidates ---'
for path in Formula/fdroidserver.rb Formula/f/fdroidserver.rb; do
  url="https://api.github.com/repos/Homebrew/homebrew-core/commits?path=$path&per_page=30"
  printf '%s\n' "$url"
  curl -L --fail --silent --show-error --max-time 20 "$url" |
    python3 -c 'import json,sys
try:
    data=json.load(sys.stdin)
    for x in data:
        print(x.get("sha",""), x.get("commit",{}).get("message","").splitlines()[0])
except Exception as e:
    print("API_PARSE_ERROR",e)' || true
done
printf '%s\n' '--- exact override references ---'
rg -n -F --max-count 40 -e 'fdroidserver' -e 'CVE-2026-110858' -e 'GHSA-f9j4-qggq-h239' data/overrides.yml advisories/BREW-fdroidserver-CVE-2026-110858.json 2>/dev/null || test "$?" -eq 1
printf '%s\n' '--- target advisory history only ---'
git log --all --format='%H %s' -- advisories/BREW-fdroidserver-CVE-2026-110858.json

Repository: Homebrew/advisory-database

Length of output: 14931


Script executed:

set -u
printf '%s\n' '--- fdroidserver override ---'
nl -ba data/overrides.yml | sed -n '300,335p'
printf '%s\n' '--- parent of fdroidserver 2.1.2 formula commit ---'
parent=$(
  curl -L --fail --silent --show-error --max-time 20 \
    https://api.github.com/repos/Homebrew/homebrew-core/commits/54c0111144ee93193cbf0a453a92f2ddf36250d1 |
  python3 -c 'import json,sys; print(json.load(sys.stdin)["parents"][0]["sha"])'
)
printf 'parent=%s\n' "$parent"
for path in Formula/fdroidserver.rb Formula/f/fdroidserver.rb; do
  url="https://raw.githubusercontent.com/Homebrew/homebrew-core/$parent/$path"
  printf '%s\n' "$url"
  curl -L --fail --silent --show-error --max-time 20 "$url" |
    awk 'BEGIN{p=0} /resource "GitPython"/{p=1} p{print} p && /end/{exit}'
done

Repository: Homebrew/advisory-database

Length of output: 2126


Move the Homebrew lower bound to the first affected formula version.

The upstream affected range is GitPython >= 3.1.30. fdroidserver 2.1.2 bundles GitPython 3.1.29, and 2.1.1 bundles 3.1.27, so neither version provides an affected resource. Set introduced to the first later fdroidserver version that bundles GitPython >= 3.1.30. No override preserves 2.1.2 for this advisory.

"severity": [
{
"type": "CVSS_V4",
"score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minor · Data Integrity & Integration · Quick win

Correct the CVSS impact metrics.

This vector records no confidentiality impact and high integrity impact. The described arbitrary file read and the published CVE vector instead specify VC:H/VI:N. Correct the vector so consumers do not classify the disclosure as an integrity issue. (osv.dev)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant