PYSEC-2026-4187
Vulnerability from pysec - Published: 2026-09-29 10:17 - Updated: 2026-10-08 09:43Apache Airflow's Google provider built Google Drive search expressions by interpolating file and folder names directly into single-quoted string literals, without escaping the quote character that delimits them. A name containing an apostrophe therefore terminated the literal early and appended clauses of the attacker's choosing to the query.
The names are frequently not written by the Dag author. In a wildcard gcs_to_gdrive transfer they come from the source bucket listing, so anyone able to create objects in that bucket controls them — typically an external data producer or an ingest-only service account, a different trust principal from the Dag author. An injected clause can broaden the match and so steer which file or folder the hook resolves: an upload can be directed into a folder the attacker named, and, because downloads select the most recently modified match, a download can return a file they placed rather than the one the Dag asked for.
Affects deployments passing externally-sourced names to the Google Drive hook, including wildcard gcs_to_gdrive transfers from buckets writable by less-trusted principals. Users are advised to upgrade to apache-airflow-providers-google 22.6.0 or later, which escapes quote and backslash characters in every value interpolated into a Drive query.
| Name | purl | apache-airflow-providers-google | pkg:pypi/apache-airflow-providers-google |
|---|
{
"affected": [
{
"ecosystem_specific": {},
"package": {
"ecosystem": "PyPI",
"name": "apache-airflow-providers-google",
"purl": "pkg:pypi/apache-airflow-providers-google"
},
"ranges": [
{
"events": [
{
"introduced": "0"
},
{
"fixed": "22.6.0"
}
],
"type": "ECOSYSTEM"
}
],
"versions": [
"1.0.0",
"1.0.0b1",
"1.0.0b2",
"1.0.0rc1",
"10.0.0",
"10.0.0rc1",
"10.1.0",
"10.1.0rc1",
"10.1.0rc2",
"10.1.1",
"10.1.1rc1",
"10.10.0",
"10.10.0rc1",
"10.10.1",
"10.10.1rc1",
"10.11.0",
"10.11.0rc1",
"10.11.1",
"10.11.1rc1",
"10.12.0",
"10.12.0rc1",
"10.13.0",
"10.13.0rc1",
"10.13.0rc2",
"10.13.0rc3",
"10.13.1",
"10.13.1rc1",
"10.14.0",
"10.14.0rc1",
"10.14.0rc2",
"10.15.0",
"10.15.0rc1",
"10.16.0",
"10.16.0rc1",
"10.17.0",
"10.17.0rc1",
"10.18.0",
"10.18.0rc1",
"10.18.0rc2",
"10.19.0",
"10.19.0rc1",
"10.2.0",
"10.2.0rc1",
"10.20.0",
"10.20.0rc1",
"10.21.0",
"10.21.0rc1",
"10.21.1",
"10.21.1rc1",
"10.21.1rc2",
"10.22.0",
"10.22.0rc1",
"10.23.0",
"10.23.0rc1",
"10.24.0",
"10.24.0rc1",
"10.25.0",
"10.25.0rc1",
"10.26.0",
"10.26.0rc1",
"10.3.0",
"10.3.0rc1",
"10.3.0rc2",
"10.4.0",
"10.4.0rc1",
"10.5.0",
"10.5.0rc1",
"10.6.0",
"10.6.0rc1",
"10.6.0rc2",
"10.6.0rc3",
"10.7.0",
"10.7.0rc1",
"10.8.0",
"10.8.0rc1",
"10.9.0",
"10.9.0rc1",
"11.0.0",
"11.0.0rc1",
"12.0.0",
"12.0.0rc1",
"12.0.0rc2",
"13.0.0",
"14.0.0",
"14.0.0rc1",
"14.1.0",
"14.1.0rc1",
"15.0.0",
"15.0.0rc1",
"15.0.1",
"15.0.1rc1",
"15.1.0",
"15.1.0rc1",
"16.0.0",
"16.0.0rc1",
"16.1.0",
"16.1.0rc1",
"17.0.0",
"17.0.0rc1",
"17.1.0",
"17.1.0rc1",
"17.2.0",
"17.2.0rc1",
"18.0.0",
"18.0.0rc1",
"18.1.0",
"18.1.0rc1",
"19.0.0",
"19.0.0rc1",
"19.1.0",
"19.1.0rc1",
"19.1.0rc2",
"19.2.0",
"19.2.0rc1",
"19.3.0",
"19.3.0rc1",
"19.4.0",
"19.4.0rc1",
"19.4.0rc2",
"19.5.0",
"19.5.0rc1",
"2.0.0",
"2.0.0rc1",
"2.1.0",
"2.1.0rc1",
"2.2.0",
"2.2.0rc1",
"20.0.0",
"20.0.0rc1",
"20.0.0rc2",
"21.0.0",
"21.0.0rc1",
"21.0.0rc2",
"21.1.0",
"21.1.0rc1",
"21.2.0",
"21.2.0rc1",
"21.3.0",
"21.3.0rc1",
"22.0.0",
"22.0.0rc1",
"22.1.0",
"22.1.0rc1",
"22.2.0",
"22.2.0rc1",
"22.2.1",
"22.2.1rc1",
"22.2.2",
"22.2.2rc1",
"22.3.0",
"22.3.0rc1",
"22.3.0rc2",
"22.3.0rc3",
"22.3.0rc4",
"22.4.0",
"22.4.0rc1",
"22.5.0",
"22.5.0rc1",
"22.6.0rc1",
"3.0.0",
"3.0.0rc1",
"4.0.0",
"4.0.0rc1",
"4.0.0rc2",
"4.1.0rc1",
"5.0.0",
"5.0.0rc2",
"5.1.0",
"5.1.0rc1",
"6.0.0",
"6.0.0rc1",
"6.1.0",
"6.1.0rc1",
"6.2.0",
"6.2.0rc1",
"6.3.0",
"6.3.0rc1",
"6.4.0",
"6.4.0rc1",
"6.4.0rc2",
"6.4.0rc3",
"6.5.0",
"6.5.0rc1",
"6.6.0",
"6.6.0rc1",
"6.7.0",
"6.7.0rc1",
"6.8.0",
"6.8.0rc1",
"7.0.0",
"7.0.0rc1",
"8.0.0",
"8.0.0rc1",
"8.0.0rc2",
"8.1.0",
"8.1.0rc1",
"8.10.0",
"8.10.0rc1",
"8.11.0",
"8.11.0rc1",
"8.12.0",
"8.12.0rc1",
"8.2.0",
"8.2.0rc1",
"8.3.0",
"8.3.0rc1",
"8.3.0rc2",
"8.3.0rc3",
"8.4.0",
"8.4.0rc1",
"8.4.0rc2",
"8.5.0",
"8.5.0rc1",
"8.6.0",
"8.6.0rc2",
"8.6.0rc3",
"8.7.0",
"8.7.0rc1",
"8.7.0rc2",
"8.8.0",
"8.8.0rc1",
"8.9.0",
"8.9.0rc1",
"9.0.0",
"9.0.0rc1",
"9.0.0rc2"
]
}
],
"aliases": [
"CVE-2026-81914"
],
"details": "Apache Airflow\u0027s Google provider built Google Drive search expressions by interpolating file and folder names directly into single-quoted string literals, without escaping the quote character that delimits them. A name containing an apostrophe therefore terminated the literal early and appended clauses of the attacker\u0027s choosing to the query.\n\nThe names are frequently not written by the Dag author. In a wildcard `gcs_to_gdrive` transfer they come from the source bucket listing, so anyone able to create objects in that bucket controls them \u2014 typically an external data producer or an ingest-only service account, a different trust principal from the Dag author. An injected clause can broaden the match and so steer which file or folder the hook resolves: an upload can be directed into a folder the attacker named, and, because downloads select the most recently modified match, a download can return a file they placed rather than the one the Dag asked for.\n\nAffects deployments passing externally-sourced names to the Google Drive hook, including wildcard `gcs_to_gdrive` transfers from buckets writable by less-trusted principals. Users are advised to upgrade to `apache-airflow-providers-google` `22.6.0` or later, which escapes quote and backslash characters in every value interpolated into a Drive query.",
"id": "PYSEC-2026-4187",
"modified": "2026-10-08T09:43:09.515191Z",
"published": "2026-09-29T10:17:12.530Z",
"references": [
{
"type": "ADVISORY",
"url": "http://www.openwall.com/lists/oss-security/2026/09/29/13"
},
{
"type": "ADVISORY",
"url": "https://lists.apache.org/thread/90osv795jrqds051y7v3lcdzhsospooo"
},
{
"type": "FIX",
"url": "https://github.com/apache/airflow/pull/72166"
}
],
"severity": [
{
"score": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N",
"type": "CVSS_V3"
}
]
}
Sightings
| Author | Source | Type | Date | Other |
|---|
Nomenclature
- Seen: The vulnerability was mentioned, discussed, or observed by the user.
- Confirmed: The vulnerability has been validated from an analyst's perspective.
- Published Proof of Concept: A public proof of concept is available for this vulnerability.
- Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
- Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
- Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
- Not confirmed: The user expressed doubt about the validity of the vulnerability.
- Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.
Vulnerability timeline
Sightings and recorded dates, grouped by day · UTC
Loading timeline…
The approach is described in our paper Mapping CVEs to MITRE ATT&CK Techniques: A Curated Gold-Set Classifier and the Limits of LLM-Assisted Label Expansion.
Browse all ATT&CK techniques and the vulnerabilities related to each.
Related by attack behaviour
Vulnerabilities whose description is nearest to this one in the vector space of the CIRCL/vulnerability-attack-technique-biencoder model. This is a similarity search over the bi-encoder space (plain cosine), not a classification, and it has no measured accuracy.