Overview
Microsoft released Cumulative Update 10 (CU10) for SQL Server 2025 on 22 October 2026. This update installs build 17.0.5035.5 and packages 36 fixes that have accumulated since CU9. Analysis Services is also updated, reaching product version 17.0.25.223.
You can compare your current build right now:
SELECT
SERVERPROPERTY('ProductVersion') AS CurrentBuild,
SERVERPROPERTY('ProductLevel') AS PatchLevel,
SERVERPROPERTY('ProductUpdateLevel') AS CULevel;
If CurrentBuild is lower than 17.0.5035.5, this update applies to you. The KB article is KB5125471 and registration is no longer required to download the package.
The headline story for CU10 is security. A large proportion of the 36 fixes address memory safety issues, input validation gaps, and privilege escalation risks across backup/restore, replication, PolyBase, and extensibility components. There are also correctness fixes for JSON indexes, Change Event Streaming, and linked servers that will matter to specific workloads.
What's in This Update
Security Hardening (the majority of this release)
CU10 contains an unusually high number of security-oriented fixes. DBAs should treat this release with the same urgency as a security patch rollup.
Backup and restore (VDI) Three separate fixes address the Virtual Device Interface used by third-party backup tools and VSS Writer operations. Bug 5491072 fixes malformed size values that could cause out-of-bounds memory access during VDI and VSS backup jobs. Bug 5571219 fixes an out-of-bounds write that could occur when a virtual device set is opened. Bug 5571935 fixes an out-of-bounds read or write during data transfer in backup or restore operations. If you use any third-party backup agent (Veeam, Commvault, Veritas, and so on) that hooks into VDI, these fixes are directly relevant.
Bug 5494339 addresses an integer handling issue in backup and restore metadata processing that could allow a local authenticated user to gain elevated privileges and cause the SQL Server service to stop responding. This is a privilege escalation risk and should be weighted accordingly.
PolyBase and external data Bug 5419454 fixes a security vulnerability in PolyBase data processing validation. Bug 5575381 fixes unsafe deserialisation of PolyBase rollback queue data so that malformed payloads are rejected. Bug 5558665 improves shared memory handling in PolyBase. Bug 5555768 adds schema metadata validation for Delta Lake tables. Bug 5439307 fixes an unexpected process termination when accessing external data sources.
Extensibility and Machine Learning Services
Bug 5578870 fixes multiple memory corruption and memory disclosure vulnerabilities in the parsing of SQLSatellite protocol messages used by Machine Learning Services and Language Extensions. Bug 5574835 fixes an invalid memory read in runtime parameter processing for the AI_GENERATE_EMBEDDINGS function. Bug 5505572 updates the third-party archive extraction component used to install external language and library packages.
Replication A cluster of replication fixes (5529345, 5529358, 5529370, 5529381, 5529395, 5632692, 5632803, 5632816, 5632930, 5635187) improve security and reliability across internal data handling, text processing, queued updating subscriptions, Log Reader Agent behaviour, change feed configuration, and stored procedure security. Bug 5632851 fixes a buffer overflow that occurs when merge replication processes more than 250 XML nickname entries during web synchronisation. Bugs 5632877 and 5632890 fix data validation issues in replication and web synchronisation operations.
CLR Integration
Bug 5529171 fixes improper field offset validation in the SqlDataRecord.SetBytes API for sql_variant values. If CLR integration is enabled, a malformed call could cause an out-of-bounds heap write.
SQL Trace
Bug 5635965 fixes an out-of-bounds read that can occur when SQL Trace processes the LoginSid column from malformed trace data.
Showplan / Query Store Bug 5529204 improves handling of Showplan input to enhance security and reliability.
Data Correctness and Stability
XML compression corruption (Bug 5090700)
A self-assignment UPDATE on a small off-row XML column with XML compression enabled could silently corrupt the XML data and then produce a transport-level error on the next SELECT. If you use XML compression on columns that receive self-assignment updates (for example, SET col = col), this fix is important.
JSON index crash on long multibyte paths (Bug 5318463) Creating a JSON index on a path containing multibyte Unicode characters could crash SQL Server if the path exceeded 8,000 bytes after UTF-8 conversion. This is a silent risk during index creation DDL.
Change Event Streaming (CES) deserialisation (Bug 5529458) CES could fail to deserialise event payloads containing certain characters, silently dropping events. Bug 5529462 also fixes dump files that could occur when CES streamed large object data.
Linked servers via MSDASQL (Bug 5582011) Linked server connections using the MSDASQL provider could fail if the provider string omitted a user ID (UID). This would surface as a connection error on queries to affected linked servers.
Contained availability group on Linux (Bug 5555143) Creating a contained availability group could fail with error 1803 after a first-boot collation change on SQL Server on Linux.
FILESTREAM on AG secondaries (Bug 5522142) Oversized FILESTREAM fragments were not being rejected on availability group secondary replicas. CU10 adds validation to reject them, preventing potential data integrity issues from propagating.
Why You Should Apply It
- Privilege escalation risk in backup metadata (5494339): A local authenticated user could gain elevated privileges and crash the SQL Server service. Apply this update before any other consideration.
- VDI out-of-bounds memory writes (5571219, 5571935, 5491072): Third-party backup agents interact with VDI on every backup job. These are memory safety vulnerabilities in a high-frequency code path.
- Machine Learning Services memory corruption (5578870): Multiple memory corruption and disclosure vulnerabilities in SQLSatellite message parsing. Any instance running ML Services or Language Extensions is exposed.
- PolyBase security vulnerability (5419454) and unsafe deserialisation (5575381): Environments using PolyBase for external data access or Delta Lake queries are directly affected.
- XML data corruption (5090700): Silent data corruption on compressed XML columns is a data integrity risk with no visible warning until the data is read back.
- JSON index crash (5318463): DDL operations creating JSON indexes on Unicode-heavy paths can crash the instance.
- CLR heap write (5529171): Out-of-bounds heap write via
SqlDataRecord.SetBytesif CLR integration is on. - Replication buffer overflow (5632851): Merge replication with web synchronisation and more than 250 XML nickname entries can overflow a buffer.
- CES event loss (5529458): Change Event Streaming silently drops events containing certain characters.
- Linked server failures (5582011): MSDASQL-based linked servers without a UID in the provider string will fail to connect.
Known Issues to Be Aware Of
Microsoft has documented two known issues in CU10 that are not yet resolved.
SESSION_CONTEXT Incorrect Results in Parallel Plans
Queries using the built-in SESSION_CONTEXT() function may return incorrect results or trigger access violation dump files when executed under a parallel query plan. The issue relates to how SESSION_CONTEXT interacts with parallel execution threads, particularly when a session is reset for reuse (for example, in connection pooling scenarios).
Should this stop your deployment? If your application relies on SESSION_CONTEXT for row-level security, tenant isolation, or any logic where an incorrect value would cause a security or correctness problem, you should test this scenario thoroughly before deploying to production. As a short-term workaround, you can force serial plans for affected queries using the MAXDOP 1 query hint, or set MAXDOP 1 at the database or instance level while waiting for a fix.
Access Violation Querying sys.dm_exec_requests During Database Recovery
Querying sys.dm_exec_requests while a database is in recovery (during a RESTORE, instance startup, or before an AG replica comes online) can trigger an access violation and generate a dump file, terminating the SQL Server process.
The error log will contain entries similar to:
The database '<DatabaseName>' is marked RESTORING and is in a state that does not allow recovery to be run.
SqlDumpExceptionHandler: Process 77 generated fatal exception c0000005 EXCEPTION_ACCESS_VIOLATION.
Should this stop your deployment? For environments with monitoring agents or custom scripts that poll sys.dm_exec_requests continuously (including during startup or failover), this is a real crash risk. Review your monitoring configuration and consider suppressing or delaying sys.dm_exec_requests queries during known recovery windows. This known issue does not affect the majority of steady-state workloads.
Does This Affect You? How to Check
Build version check
SELECT
SERVERPROPERTY('ProductVersion') AS CurrentBuild,
SERVERPROPERTY('ProductLevel') AS PatchLevel,
SERVERPROPERTY('ProductUpdateLevel') AS CULevel;
-- Target: 17.0.5035.5 or higher
VDI / third-party backup agents (5491072, 5571219, 5571935, 5494339) Check whether a third-party backup agent is installed on the SQL Server host. Review Windows Services for agents from Veeam, Commvault, Veritas NetBackup, or similar. All instances using VDI-based backup are affected.
PolyBase in use (5419454, 5439307, 5555768, 5558665, 5575381)
SELECT name, is_enabled
FROM sys.configurations
WHERE name = 'polybase enabled';
Also check for external data sources:
SELECT name, type_desc, location
FROM sys.external_data_sources;
Machine Learning Services / Language Extensions (5578870, 5574835)
SELECT name, is_enabled
FROM sys.configurations
WHERE name IN ('external scripts enabled');
CLR integration (5529171)
SELECT name, is_enabled
FROM sys.configurations
WHERE name = 'clr enabled';
XML compression on columns (5090700)
SELECT
OBJECT_SCHEMA_NAME(c.object_id) AS schema_name,
OBJECT_NAME(c.object_id) AS table_name,
c.name AS column_name
FROM sys.columns c
JOIN sys.types t ON t.user_type_id = c.user_type_id
WHERE t.name = 'xml'
AND c.xml_collection_id IS NOT NULL
OR t.name = 'xml';
-- Then check whether XML compression is enabled on those tables:
SELECT
OBJECT_SCHEMA_NAME(p.object_id) AS schema_name,
OBJECT_NAME(p.object_id) AS table_name,
p.data_compression_desc
FROM sys.partitions p
WHERE p.data_compression_desc = 'XML';
JSON indexes (5318463)
SELECT
OBJECT_SCHEMA_NAME(i.object_id) AS schema_name,
OBJECT_NAME(i.object_id) AS table_name,
i.name AS index_name,
i.type_desc
FROM sys.indexes i
WHERE i.type_desc = 'XML'
AND i.name LIKE '%json%';
-- Also search module definitions for JSON index creation:
SELECT name, type_desc
FROM sys.sql_modules m
JOIN sys.objects o ON o.object_id = m.object_id
WHERE m.definition LIKE '%CREATE JSON INDEX%';
Replication in use (multiple fixes)
SELECT name, type
FROM sys.databases
WHERE is_published = 1
OR is_subscribed = 1
OR is_merge_published = 1;
Linked servers using MSDASQL (5582011)
SELECT name, provider, data_source, provider_string
FROM sys.servers
WHERE is_linked = 1
AND provider = 'MSDASQL';
-- Flag any rows where provider_string does not contain 'UID='
Availability groups and FILESTREAM (5522142)
SELECT
ag.name AS ag_name,
ar.replica_server_name,
ar.role_desc
FROM sys.availability_replicas ar
JOIN sys.availability_groups ag ON ag.group_id = ar.group_id;
-- Then check for FILESTREAM usage:
SELECT name, is_filetable_enabled
FROM sys.databases
WHERE DATABASEPROPERTYEX(name, 'IsFilestream') = 1
OR is_filetable_enabled = 1;
SESSION_CONTEXT usage (known issue)
SELECT o.name, o.type_desc
FROM sys.sql_modules m
JOIN sys.objects o ON o.object_id = m.object_id
WHERE m.definition LIKE '%SESSION_CONTEXT%';
Monitoring scripts querying sys.dm_exec_requests (known issue)
Review your monitoring agent configuration and any custom SQL Agent jobs or scripts that poll sys.dm_exec_requests. If they run continuously, consider adding logic to skip execution while databases are in a RESTORING or RECOVERING state.
How to Apply
- Download the CU10 package from the Microsoft Download Centre. No registration is required.
- Test first. Deploy to a non-production environment that mirrors your production workload, particularly if you use SESSION_CONTEXT, continuous monitoring of
sys.dm_exec_requests, or any of the affected features above. - Back up everything before patching production. Take a full backup of all user databases and the system databases (master, msdb, model).
- Plan for a service restart. CU installation requires a SQL Server service restart. Schedule a maintenance window and notify application teams.
- Apply in order for multi-instance environments: patch the least critical instances first, verify stability, then proceed to production.
- Verify the build after patching:
SELECT SERVERPROPERTY('ProductVersion') AS Build, SERVERPROPERTY('ProductLevel') AS Level, SERVERPROPERTY('ProductUpdateLevel') AS CU; -- Expected: 17.0.5035.5, RTM, CU10 - Review the known issues documented above before signing off the deployment, particularly if your monitoring tooling polls
sys.dm_exec_requestsduring startup or failover.
Microsoft recommends enabling encryption with Extended Protection on Windows to further harden SQL Server after applying this update.
DBA Services Recommendation
For our managed clients, cumulative update assessment and deployment is handled proactively as part of our standard patching cycle. We review each CU against your specific feature usage, schedule patching within agreed maintenance windows, and verify build versions post-deployment. If you are managing SQL Server 2025 instances independently and would like a second opinion on your patching posture, get in touch with the DBA Services team.
Get a SQL Server Health Check for $999
Find out what's really going on inside your SQL Server environment. We find critical misconfigurations in 97% of reviews, with a full 48-hour performance baseline and a prioritised action plan.
$999 ex-GST
normally $2,499
For your first SQL Server instance; additional instances are 2 hours each.