{"id":"CVE-2026-123859","kind":"vulnerability","aliases":["CVE-2026-123859"],"related":[],"title":"Snowflake Connector for Python: write_pandas column names enable SQL injection","description":"When identifier escaping is disabled through a non-default configuration, the write_pandas() data-loading functionality in the Snowflake Connector for Python and the Snowflake Connector for Python (Universal Core) did not escape DataFrame column names before including them in generated SQL, which could allow SQL injection. In both products, a crafted column name could have been used to chain additional SQL statements onto the generated statement, potentially allowing an attacker to read, modify, or delete other data accessible to the application's Snowflake role. Exploitation required an application to pass attacker controlled column names into this functionality. The fix is available in Snowflake Connector for Python version 4.8.1 and Snowflake Connector for Python (Universal Core) version 5.2.0. Users must upgrade manually.","summary":"When identifier escaping is turned off through a non-default setting, the write_pandas() function in the Snowflake Connector for Python does not escape DataFrame column names before building SQL. A crafted column name can chain extra SQL statements, letting an attacker read, change or delete data the application's Snowflake role can reach.","severity":"high","cvss":8.1,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["data-pipelines","package","python","snowflake"],"not_affected_if":["default-config","trusted-column-names"],"how_to_check":"- Check the installed connector version with `pip show snowflake-connector-python` (or the Universal Core package used by the project)\n- Look for calls to `write_pandas()` in the codebase and check whether identifier escaping is disabled in the connection or call settings\n- Check whether any of those calls pass column names that come from user input","fix":"- Snowflake Connector for Python: `4.8.1`\n- Snowflake Connector for Python (Universal Core): `5.2.0`","status":"open","published_at":"2026-11-06T17:17:25+00:00","first_seen_at":"2026-11-06T17:43:14+00:00","triaged_at":"2026-11-06T17:44:54+00:00","updated_at":"2026-11-06T17:44:54+00:00","category":"package","confidence":0.7,"triage":{"at":"2026-11-06T17:44:54Z","model":"claude-haiku-5-5","output":{"fix":"- Snowflake Connector for Python: `4.8.1`\n- Snowflake Connector for Python (Universal Core): `5.2.0`","reach":"unknown","title":"Snowflake Connector for Python: write_pandas column names enable SQL injection","impact":"high","summary":"When identifier escaping is turned off through a non-default setting, the write_pandas() function in the Snowflake Connector for Python does not escape DataFrame column names before building SQL. A crafted column name can chain extra SQL statements, letting an attacker read, change or delete data the application's Snowflake role can reach.","audience":"developers","category":"package","nicknames":[],"who_cares":["python","snowflake","data-pipelines"],"confidence":0.7,"fix_status":"available","needs_auth":"unknown","worst_case":"Attacker reads, modifies or deletes data reachable by the Snowflake role","analyst_note":"","how_to_check":"- Check the installed connector version with `pip show snowflake-connector-python` (or the Universal Core package used by the project)\n- Look for calls to `write_pandas()` in the codebase and check whether identifier escaping is disabled in the connection or call settings\n- Check whether any of those calls pass column names that come from user input","plain_action":"","needs_analyst":false,"not_affected_if":["default-config","trusted-column-names"],"who_is_affected":"Applications that call write_pandas() with identifier escaping disabled through a non-default configuration, and that let attacker-controlled column names reach it. The sources say exploitation required that an application pass attacker-controlled column names into this functionality. Applications with escaping at its default, or with only trusted column names, are not described as exposed.","user_interaction":"no","needs_special_setup":"yes","severity_if_unknown":"high"},"cost_usd":0.000743,"input_tokens":4371,"output_tokens":612,"severity_before":"high"},"analyst_status":null,"analyst_note":null,"search":"'-123859':14A,17A '-2026':13A,16A '4.8.1':189C '5.2.0':198C 'access':159C 'addit':141C 'allow':125C,149C 'applic':73B,162C,169C 'attack':66B,151C,172C 'avail':182C 'build':53B 'chain':60B,140C 'chang':68B 'column':7A,50B,57B,115C,133C,174C 'configur':89C 'connector':2A,43B,100C,106C,185C,192C 'control':173C 'core':110C,196C 'could':124C,135C 'craft':56B,132C 'cve':12A,15A 'data':19B,71B,94C,158C 'data-load':93C 'data-pipelin':18B 'datafram':49B,114C 'default':34B,88C 'delet':70B,156C 'disabl':83C 'enabl':9A 'escap':26B,48B,81C,113C 'exploit':166C 'extra':61B 'fix':180C 'function':39B,96C,178C 'generat':121C,146C 'identifi':25B,80C 'includ':118C 'inject':11A,127C 'let':64B 'load':95C 'manual':202C 'modifi':154C 'must':200C 'name':8A,51B,58B,116C,134C,175C 'non':33B,87C 'non-default':32B,86C 'onto':144C 'packag':21B 'panda':6A,38B,92C 'pass':171C 'pipelin':20B 'potenti':148C 'product':130C 'python':4A,22B,45B,102C,108C,187C,194C 'reach':78B 'read':67B,153C 'requir':167C 'role':76B,165C 'set':35B 'snowflak':1A,23B,42B,75B,99C,105C,164C,184C,191C 'sql':10A,54B,62B,122C,126C,142C 'statement':63B,143C,147C 'turn':28B 'univers':109C,195C 'upgrad':201C 'use':138C 'user':199C 'version':188C,197C 'write':5A,37B,91C","nicknames":[],"mitigations":[],"who_affected":"Applications that call write_pandas() with identifier escaping disabled through a non-default configuration, and that let attacker-controlled column names reach it. The sources say exploitation required that an application pass attacker-controlled column names into this functionality. Applications with escaping at its default, or with only trusted column names, are not described as exposed.","tier":"B","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"developers","plain_action":null,"pkeys":[],"ptokens":[],"labels":["datapipelines","high","package","python","snowflake"],"campaign_type":null,"search_a":"'-123859':14A,17A '-2026':13A,16A 'column':7A 'connector':2A 'cve':12A,15A 'enabl':9A 'inject':11A 'name':8A 'panda':6A 'python':4A 'snowflak':1A 'sql':10A 'write':5A","search_b":"'applic':73B 'attack':66B 'build':53B 'chain':60B 'chang':68B 'column':50B,57B 'connector':43B 'craft':56B 'data':19B,71B 'data-pipelin':18B 'datafram':49B 'default':34B 'delet':70B 'escap':26B,48B 'extra':61B 'function':39B 'identifi':25B 'let':64B 'name':51B,58B 'non':33B 'non-default':32B 'packag':21B 'panda':38B 'pipelin':20B 'python':22B,45B 'reach':78B 'read':67B 'role':76B 'set':35B 'snowflak':23B,42B,75B 'sql':54B,62B 'statement':63B 'turn':28B 'write':37B","search_c":"'4.8.1':189C '5.2.0':198C 'access':159C 'addit':141C 'allow':125C,149C 'applic':162C,169C 'attack':151C,172C 'avail':182C 'chain':140C 'column':115C,133C,174C 'configur':89C 'connector':100C,106C,185C,192C 'control':173C 'core':110C,196C 'could':124C,135C 'craft':132C 'data':94C,158C 'data-load':93C 'datafram':114C 'default':88C 'delet':156C 'disabl':83C 'escap':81C,113C 'exploit':166C 'fix':180C 'function':96C,178C 'generat':121C,146C 'identifi':80C 'includ':118C 'inject':127C 'load':95C 'manual':202C 'modifi':154C 'must':200C 'name':116C,134C,175C 'non':87C 'non-default':86C 'onto':144C 'panda':92C 'pass':171C 'potenti':148C 'product':130C 'python':102C,108C,187C,194C 'read':153C 'requir':167C 'role':165C 'snowflak':99C,105C,164C,184C,191C 'sql':122C,126C,142C 'statement':143C,147C 'univers':109C,195C 'upgrad':201C 'use':138C 'user':199C 'version':188C,197C 'write':91C","first_public_at":"2026-11-06T17:17:25+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H","cvss_by":"412d305a-227d-44f9-a262-a31ba44f2aea","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-123859","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-123859","severity":null,"published_at":"2026-11-06T17:17:25+00:00","modified_at":"2026-11-06T17:17:25+00:00","first_seen_at":"2026-11-06T17:43:14+00:00","fetched_at":"2026-11-06T17:43:14+00:00","note":null}],"documents":[],"exploit_sources":[],"notice":"Free to read, with fair use of about 60 pages a minute. For higher limits or API access: sales@infrastack.ai"}