{"id":"CVE-2026-81930","aliases":["EUVD-2026-88696","GHSA-x776-f7fc-mx6q","PYSEC-2026-4188"],"status":"published","title":"Apache Airflow Snowflake provider: Unvalidated account field redirects SQL API bearer token off-domain","description":"Apache Airflow's Snowflake provider did not validate the connection's `account` and `region` fields before interpolating them into request URLs. The SQL API endpoint is built as `https://{account}.snowflakecomputing.com/api/v2/statements`, so an `account` value containing `/`, `?` or `#` demotes the intended domain to a path, query or fragment and leaves the attacker in control of the request host.\n\nThe provider sends that request with an `Authorization: Bearer` header carrying a JWT minted from the connection's private key, or the configured OAuth or programmatic access token. A user who can edit the Snowflake connection but cannot read its secrets — Airflow gives connection-configuration users write-only access to stored credentials, and a `private_key_file` lives on the worker rather than in the connection — can therefore cause a valid token for the account to be delivered to a host of their choosing and replay it against the genuine Snowflake endpoint. No Dag-authoring ability is required: the attacker edits the connection and waits for an existing Dag to use it. The same unvalidated value was also used to build the OAuth token-request URL and the Cortex Agent base URL.\n\nAffects deployments where Snowflake connections are editable by users who are not trusted with the connection's credentials. Users are advised to upgrade to `apache-airflow-providers-snowflake` `6.18.0` or later, which rejects `account` and `region` values containing anything other than letters, digits, `.`, `_` and `-` in every URL the provider builds from them.","severity":{"version":"3.1","score":6.3,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:L","level":"medium","assessor":"adp","from":"cve"},"epss":{"day":"2026-11-12","score":0.00432,"percentile":0.38013,"model":"v2026.06.15"},"facts":{"in_kev":false,"known_exploited":false,"public_exploit":false,"fix_available":true},"cwes":["CWE-522"],"published":"2026-09-29T10:00:23Z","modified":"2026-10-28T02:58:40Z","fixes":[{"ecosystem":"PyPI","package":"apache-airflow-providers-snowflake","fixed_in":["6.18.0"],"sources":["osv"]}],"affected":[{"source":"osv","ecosystem":"PyPI","package":"apache-airflow-providers-snowflake","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"6.18.0"}]}],"versions":["1.0.0","1.0.0b1","1.0.0b2","1.0.0rc1","1.1.0","1.1.0rc1","1.1.1","1.1.1rc1","1.1.1rc2","1.2.0","1.2.0rc1","1.3.0","1.3.0rc1","2.0.0","2.0.0rc1","2.0.0rc2","2.0.0rc3","2.1.0","2.1.0rc1","2.1.0rc2","2.1.1","2.1.1rc1","2.2.0","2.2.0rc1","2.3.0","2.3.0rc1","2.3.1","2.3.1rc1","2.4.0","2.4.0rc1","2.5.0","2.5.0rc1","2.5.0rc2","2.5.1","2.5.1rc1","2.5.2","2.5.2rc1","2.6.0","2.6.0rc1","2.7.0","2.7.0rc1","3.0.0","3.0.0rc1","3.0.0rc2","3.1.0","3.1.0rc1","3.2.0","3.2.0rc1","3.2.0rc2","3.2.0rc3","3.3.0","3.3.0rc1","4.0.0","4.0.0rc1","4.0.1","4.0.1rc2","4.0.1rc3","4.0.2","4.0.2rc1","4.0.3","4.0.3rc1","4.0.4","4.0.4rc1","4.0.5","4.0.5rc1","4.1.0","4.1.0rc1","4.1.0rc2","4.2.0","4.2.0rc1","4.3.0","4.3.0rc2","4.3.1","4.3.1rc1","4.4.0","4.4.0rc1","4.4.1","4.4.1rc1","4.4.2","4.4.2rc1","5.0.0","5.0.0rc1","5.0.1","5.0.1rc1","5.1.0","5.1.0rc1","5.1.1","5.1.1rc1","5.1.2","5.1.2rc1","5.2.0","5.2.0rc1","5.2.1","5.2.1rc1","5.3.0","5.3.0rc1","5.3.0rc2","5.3.1","5.3.1rc1","5.4.0","5.4.0rc1","5.5.0","5.5.0rc1","5.5.1","5.5.1rc1","5.5.2","5.5.2rc1","5.6.0","5.6.0rc1","5.6.1","5.6.1rc1","5.7.0","5.7.0rc1","5.7.1","5.7.1rc1","5.8.0","5.8.0rc1","5.8.1","5.8.1rc1","6.0.0","6.0.0rc1","6.0.0rc2","6.1.0","6.1.0rc1","6.1.1","6.1.1rc1","6.10.0","6.10.0rc1","6.11.0","6.11.0rc1","6.12.0","6.12.0rc1","6.12.1","6.12.1rc1","6.12.2","6.12.2rc1","6.13.0","6.13.0rc1","6.14.0","6.14.0rc1","6.15.0","6.15.0rc1","6.15.0rc2","6.16.0","6.16.0rc1","6.16.0rc2","6.16.1","6.16.1rc1","6.17.0","6.17.0rc1","6.18.0rc1","6.2.0","6.2.0rc1","6.2.1","6.2.1rc1","6.2.2","6.2.2rc1","6.3.0","6.3.0rc1","6.3.0rc2","6.3.1","6.3.1rc1","6.4.0","6.4.0rc1","6.5.0","6.5.0rc1","6.5.1","6.5.1rc1","6.5.2","6.5.2rc1","6.5.3","6.5.3rc1","6.5.4","6.5.4rc1","6.6.0","6.6.0rc1","6.6.1","6.6.1rc1","6.7.0","6.7.0rc1","6.8.0","6.8.0rc1","6.8.1","6.8.1rc1","6.8.2","6.8.2rc1","6.9.0","6.9.0rc1","6.9.1","6.9.1rc1"]}],"products":[{"vendor":"apache","product":"apache-airflow-providers-snowflake"},{"vendor":"apache software foundation","product":"apache airflow snowflake provider"}],"references":[{"url":"https://github.com/apache/airflow/pull/72174","tags":["patch","Issue Tracking","Patch","fix"]},{"url":"https://lists.apache.org/thread/324jm2mxd5x4nq85jfw1ostz94xwzrmk","tags":["vendor-advisory","Mailing List","Vendor Advisory","advisory"]},{"url":"http://www.openwall.com/lists/oss-security/2026/09/29/12","tags":["Mailing List","Third Party Advisory","web","advisory"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-81930","tags":["advisory"]},{"url":"https://github.com/advisories/GHSA-x776-f7fc-mx6q"},{"url":"https://pypi.python.org","tags":["web"]},{"url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/81xxx/CVE-2026-81930.json","tags":["advisory"]}],"sources":{"cve":[{"id":"CVE-2026-81930","title":"Apache Airflow Snowflake provider: Unvalidated account field redirects SQL API bearer token off-domain","description":"Apache Airflow's Snowflake provider did not validate the connection's `account` and `region` fields before interpolating them into request URLs. The SQL API endpoint is built as `https://{account}.snowflakecomputing.com/api/v2/statements`, so an `account` value containing `/`, `?` or `#` demotes the intended domain to a path, query or fragment and leaves the attacker in control of the request host.\n\nThe provider sends that request with an `Authorization: Bearer` header carrying a JWT minted from the connection's private key, or the configured OAuth or programmatic access token. A user who can edit the Snowflake connection but cannot read its secrets — Airflow gives connection-configuration users write-only access to stored credentials, and a `private_key_file` lives on the worker rather than in the connection — can therefore cause a valid token for the account to be delivered to a host of their choosing and replay it against the genuine Snowflake endpoint. No Dag-authoring ability is required: the attacker edits the connection and waits for an existing Dag to use it. The same unvalidated value was also used to build the OAuth token-request URL and the Cortex Agent base URL.\n\nAffects deployments where Snowflake connections are editable by users who are not trusted with the connection's credentials. Users are advised to upgrade to `apache-airflow-providers-snowflake` `6.18.0` or later, which rejects `account` and `region` values containing anything other than letters, digits, `.`, `_` and `-` in every URL the provider builds from them.","status":"published","published":"2026-09-29T10:00:23.666Z","modified":"2026-09-29T18:29:50.02Z","cvss":[{"version":"3.1","score":6.3,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:L","level":"medium","assessor":"adp"}],"cwes":["CWE-522"],"updated_at":"2026-11-02T13:36:18.075535Z"}],"euvd":[{"id":"EUVD-2026-88696","description":"Apache Airflow's Snowflake provider did not validate the connection's `account` and `region` fields before interpolating them into request URLs. The SQL API endpoint is built as `https://{account}.snowflakecomputing.com/api/v2/statements`, so an `account` value containing `/`, `?` or `#` demotes the intended domain to a path, query or fragment and leaves the attacker in control of the request host.\n\nThe provider sends that request with an `Authorization: Bearer` header carrying a JWT minted from the connection's private key, or the configured OAuth or programmatic access token. A user who can edit the Snowflake connection but cannot read its secrets — Airflow gives connection-configuration users write-only access to stored credentials, and a `private_key_file` lives on the worker rather than in the connection — can therefore cause a valid token for the account to be delivered to a host of their choosing and replay it against the genuine Snowflake endpoint. No Dag-authoring ability is required: the attacker edits the connection and waits for an existing Dag to use it. The same unvalidated value was also used to build the OAuth token-request URL and the Cortex Agent base URL.\n\nAffects deployments where Snowflake connections are editable by users who are not trusted with the connection's credentials. Users are advised to upgrade to `apache-airflow-providers-snowflake` `6.18.0` or later, which rejects `account` and `region` values containing anything other than letters, digits, `.`, `_` and `-` in every URL the provider builds from them.","status":"published","published":"2026-09-29T10:00:23Z","modified":"2026-09-29T18:29:50Z","cvss":[{"version":"3.1","score":6.3,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:L","level":"medium"}],"updated_at":"2026-11-02T17:27:51.524944Z"}],"ghsa":[{"id":"GHSA-x776-f7fc-mx6q","title":"Apache Airflow's Snowflake provider did not validate the connection's `account` and `region`...","description":"Apache Airflow's Snowflake provider did not validate the connection's `account` and `region` fields before interpolating them into request URLs. The SQL API endpoint is built as `https://{account}.snowflakecomputing.com/api/v2/statements`, so an `account` value containing `/`, `?` or `#` demotes the intended domain to a path, query or fragment and leaves the attacker in control of the request host.\n\nThe provider sends that request with an `Authorization: Bearer` header carrying a JWT minted from the connection's private key, or the configured OAuth or programmatic access token. A user who can edit the Snowflake connection but cannot read its secrets — Airflow gives connection-configuration users write-only access to stored credentials, and a `private_key_file` lives on the worker rather than in the connection — can therefore cause a valid token for the account to be delivered to a host of their choosing and replay it against the genuine Snowflake endpoint. No Dag-authoring ability is required: the attacker edits the connection and waits for an existing Dag to use it. The same unvalidated value was also used to build the OAuth token-request URL and the Cortex Agent base URL.\n\nAffects deployments where Snowflake connections are editable by users who are not trusted with the connection's credentials. Users are advised to upgrade to `apache-airflow-providers-snowflake` `6.18.0` or later, which rejects `account` and `region` values containing anything other than letters, digits, `.`, `_` and `-` in every URL the provider builds from them.","status":"published","published":"2026-09-29T12:31:29Z","modified":"2026-09-29T21:33:10Z","cvss":[{"version":"3.1","score":6.3,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:L","level":"medium"}],"cwes":["CWE-522"],"updated_at":"2026-11-02T15:12:33.840327Z"}],"nvd":[{"id":"CVE-2026-81930","description":"Apache Airflow's Snowflake provider did not validate the connection's `account` and `region` fields before interpolating them into request URLs. The SQL API endpoint is built as `https://{account}.snowflakecomputing.com/api/v2/statements`, so an `account` value containing `/`, `?` or `#` demotes the intended domain to a path, query or fragment and leaves the attacker in control of the request host.\n\nThe provider sends that request with an `Authorization: Bearer` header carrying a JWT minted from the connection's private key, or the configured OAuth or programmatic access token. A user who can edit the Snowflake connection but cannot read its secrets — Airflow gives connection-configuration users write-only access to stored credentials, and a `private_key_file` lives on the worker rather than in the connection — can therefore cause a valid token for the account to be delivered to a host of their choosing and replay it against the genuine Snowflake endpoint. No Dag-authoring ability is required: the attacker edits the connection and waits for an existing Dag to use it. The same unvalidated value was also used to build the OAuth token-request URL and the Cortex Agent base URL.\n\nAffects deployments where Snowflake connections are editable by users who are not trusted with the connection's credentials. Users are advised to upgrade to `apache-airflow-providers-snowflake` `6.18.0` or later, which rejects `account` and `region` values containing anything other than letters, digits, `.`, `_` and `-` in every URL the provider builds from them.","status":"published","published":"2026-09-29T10:17:12.673Z","modified":"2026-10-07T19:57:31.443Z","cvss":[{"version":"3.1","score":6.3,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:L","level":"medium","assessor":"secondary"}],"cwes":["CWE-522"],"updated_at":"2026-11-02T14:12:52.413234Z"}],"osv":[{"id":"CVE-2026-81930","title":"Apache Airflow Snowflake provider: Unvalidated account field redirects SQL API bearer token off-domain","description":"Apache Airflow's Snowflake provider did not validate the connection's `account` and `region` fields before interpolating them into request URLs. The SQL API endpoint is built as `https://{account}.snowflakecomputing.com/api/v2/statements`, so an `account` value containing `/`, `?` or `#` demotes the intended domain to a path, query or fragment and leaves the attacker in control of the request host.\n\nThe provider sends that request with an `Authorization: Bearer` header carrying a JWT minted from the connection's private key, or the configured OAuth or programmatic access token. A user who can edit the Snowflake connection but cannot read its secrets — Airflow gives connection-configuration users write-only access to stored credentials, and a `private_key_file` lives on the worker rather than in the connection — can therefore cause a valid token for the account to be delivered to a host of their choosing and replay it against the genuine Snowflake endpoint. No Dag-authoring ability is required: the attacker edits the connection and waits for an existing Dag to use it. The same unvalidated value was also used to build the OAuth token-request URL and the Cortex Agent base URL.\n\nAffects deployments where Snowflake connections are editable by users who are not trusted with the connection's credentials. Users are advised to upgrade to `apache-airflow-providers-snowflake` `6.18.0` or later, which rejects `account` and `region` values containing anything other than letters, digits, `.`, `_` and `-` in every URL the provider builds from them.","status":"published","published":"2026-09-29T10:00:23.666Z","modified":"2026-10-28T02:58:40.155567421Z","cvss":[{"version":"3.1","score":6.3,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:L","level":"medium"}],"cwes":["CWE-522"],"updated_at":"2026-11-02T15:45:18.131258Z"},{"id":"PYSEC-2026-4188","description":"Apache Airflow's Snowflake provider did not validate the connection's `account` and `region` fields before interpolating them into request URLs. The SQL API endpoint is built as `https://{account}.snowflakecomputing.com/api/v2/statements`, so an `account` value containing `/`, `?` or `#` demotes the intended domain to a path, query or fragment and leaves the attacker in control of the request host.\n\nThe provider sends that request with an `Authorization: Bearer` header carrying a JWT minted from the connection's private key, or the configured OAuth or programmatic access token. A user who can edit the Snowflake connection but cannot read its secrets — Airflow gives connection-configuration users write-only access to stored credentials, and a `private_key_file` lives on the worker rather than in the connection — can therefore cause a valid token for the account to be delivered to a host of their choosing and replay it against the genuine Snowflake endpoint. No Dag-authoring ability is required: the attacker edits the connection and waits for an existing Dag to use it. The same unvalidated value was also used to build the OAuth token-request URL and the Cortex Agent base URL.\n\nAffects deployments where Snowflake connections are editable by users who are not trusted with the connection's credentials. Users are advised to upgrade to `apache-airflow-providers-snowflake` `6.18.0` or later, which rejects `account` and `region` values containing anything other than letters, digits, `.`, `_` and `-` in every URL the provider builds from them.","status":"published","published":"2026-09-29T10:17:12.673Z","modified":"2026-10-08T10:00:03.975900043Z","cvss":[{"version":"3.1","score":6.3,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:L","level":"medium"}],"updated_at":"2026-11-02T15:52:57.671918Z"}]}}
