This release includes breaking changes for platform teams planning a safe upgrade.
✓ No known CVEs patched in this version
Topics
+11 more
Affected surfaces
ReleasePort's take
Light signalFleet v4.85.0 fixes Windows BitLocker auto-unlock on secondary drives and resolves MDM/DDM profile stuck-state bugs. Per-user API roles with endpoint restrictions and dark theme UI are now available.
Why it matters: Windows BitLocker auto-unlock deployments should upgrade for the secondary-drive fix. Test per-endpoint API restrictions in dev; MDM/DDM stability improvements reduce profile failures during fleet-wide changes.
Summary
AI summaryFixed Windows BitLocker encrypt/decrypt loop on machines with secondary drives using auto-unlock.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Breaking | Medium |
Enforced fleet name uniqueness across UI, API, and GitOps paths, returning 409 on conflicts Enforced fleet name uniqueness across UI, API, and GitOps paths, returning 409 on conflicts Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
| Feature | Medium |
Middleware enforces per-user API endpoint restrictions with 403 responses Middleware enforces per-user API endpoint restrictions with 403 responses Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Feature | Medium |
Fleet variables supported in Apple declaration profiles (DDM) Fleet variables supported in Apple declaration profiles (DDM) Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Feature | Medium |
End-user authentication context passed to Windows MDM installer End-user authentication context passed to Windows MDM installer Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Feature | Medium |
Dashboard charts added for hosts online, vulnerability, hosts enrolled Dashboard charts added for hosts online, vulnerability, hosts enrolled Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Feature | Medium |
Prometheus serving no longer defaults to hard-coded credentials in dev Prometheus serving no longer defaults to hard-coded credentials in dev Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Feature | Medium |
Docker now default WiX runtime for .msi generation on macOS Docker now default WiX runtime for .msi generation on macOS Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Feature | Medium |
UI pages added for creating and editing API-only users with role selection UI pages added for creating and editing API-only users with role selection Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Feature | Medium |
Dark theme added to Fleet UI with light, dark, system options Dark theme added to Fleet UI with light, dark, system options Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Feature | Medium |
Implemented Clear Passcode feature for iOS and iPadOS Implemented Clear Passcode feature for iOS and iPadOS Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
| Feature | Medium |
Updated macOS 15 CIS benchmark to include v2.0.0 changes Updated macOS 15 CIS benchmark to include v2.0.0 changes Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
| Feature | Medium |
Updated macOS 14 (Sonoma) CIS policy set to benchmark v3.0.0 Updated macOS 14 (Sonoma) CIS policy set to benchmark v3.0.0 Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
| Feature | Medium |
Added conditional HTTP downloads using ETag for GitOps software Added conditional HTTP downloads using ETag for GitOps software Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
| Feature | Medium |
Automatically escape JSON special characters in GitOps variables for .json profiles Automatically escape JSON special characters in GitOps variables for .json profiles Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
| Feature | Medium |
Allowed saving policies with flagged SQL syntax errors Allowed saving policies with flagged SQL syntax errors Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
| Feature | Medium |
Introduced new read‑only policy details page with policy information Introduced new read‑only policy details page with policy information Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
| Feature | Medium |
Added dedicated `/policies/:id/live` route for running policies Added dedicated `/policies/:id/live` route for running policies Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
| Feature | Medium |
Added premium `GET /api/_version_/fleet/rest_api` endpoint returning embedded `api_endpoints.yml` artifact Added premium `GET /api/_version_/fleet/rest_api` endpoint returning embedded `api_endpoints.yml` artifact Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
| Feature | Low |
Added `always_download` option to bypass conditional download in GitOps Added `always_download` option to bypass conditional download in GitOps Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
| Feature | Low |
Enabled renewing and deleting AB tokens in the UI when GitOps mode is active Enabled renewing and deleting AB tokens in the UI when GitOps mode is active Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
| Feature | Low |
Show reason in host OS settings detail when an Android profile is pending due to a certificate dependency Show reason in host OS settings detail when an Android profile is pending due to a certificate dependency Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
| Feature | Low |
Added admin setting to control retention of vulnerability‑exposure data for the dashboard Added admin setting to control retention of vulnerability‑exposure data for the dashboard Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
| Feature | Low |
Added `POST /users/api_only` endpoint for creating API‑only users Added `POST /users/api_only` endpoint for creating API‑only users Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
| Feature | Low |
Added `PATCH /users/api_only/{id}` endpoint for updating existing API‑only users Added `PATCH /users/api_only/{id}` endpoint for updating existing API‑only users Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
| Performance | Medium |
FMA sync performance improved with software.bundle_identifier index FMA sync performance improved with software.bundle_identifier index Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Performance | Medium |
MySQL writer skips no-op updates for host_orbit_info and host_disks MySQL writer skips no-op updates for host_orbit_info and host_disks Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Performance | Medium |
Windows MDM profile deletion batched into single statement Windows MDM profile deletion batched into single statement Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Performance | Medium |
Conditional HTTP downloads with ETag skip re-download if unchanged Conditional HTTP downloads with ETag skip re-download if unchanged Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Bugfix | Medium |
Android Wi-Fi profiles withheld until referenced certificate installed Android Wi-Fi profiles withheld until referenced certificate installed Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Bugfix | Medium |
Windows BitLocker encrypt/decrypt loop fixed for auto-unlock secondary drives Windows BitLocker encrypt/decrypt loop fixed for auto-unlock secondary drives Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Bugfix | Medium |
Race condition fixed preventing host silent revert to previous team Race condition fixed preventing host silent revert to previous team Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Bugfix | Medium |
Pending MDM profile rows cleaned up when MDM disabled or unenrolled Pending MDM profile rows cleaned up when MDM disabled or unenrolled Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Bugfix | Medium |
Custom package installers removed when adding FMA for same title Custom package installers removed when adding FMA for same title Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Bugfix | Medium |
Renaming patch policy in GitOps file no longer deletes policy Renaming patch policy in GitOps file no longer deletes policy Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Bugfix | Medium |
Device wipe after certificate renewal succeeds with bootstrap token Device wipe after certificate renewal succeeds with bootstrap token Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Bugfix | Medium |
Server panic fixed for deleted host Android pubsub status reports Server panic fixed for deleted host Android pubsub status reports Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Bugfix | Medium |
Server panic fixed for incomplete Apple MDM DeviceInformation response Server panic fixed for incomplete Apple MDM DeviceInformation response Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Bugfix | Medium |
AccountConfiguration command no longer sent to iOS/iPadOS with EUA AccountConfiguration command no longer sent to iOS/iPadOS with EUA Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Bugfix | Medium |
Host activity feed displays correct host activities after navigation Host activity feed displays correct host activities after navigation Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Bugfix | Medium |
Software table infinite pagination loop fixed with filter dropdown Software table infinite pagination loop fixed with filter dropdown Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Bugfix | Medium |
Nil pointer dereference fixed in contributor API spec/policies Nil pointer dereference fixed in contributor API spec/policies Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Bugfix | Medium |
Host environment variables in script-only packages handled in GitOps Host environment variables in script-only packages handled in GitOps Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Bugfix | Medium |
DDM reconciler self-healing fixed for stuck remove/pending profiles DDM reconciler self-healing fixed for stuck remove/pending profiles Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Bugfix | Medium |
Batch DDM profile changes no longer result in stuck profiles Batch DDM profile changes no longer result in stuck profiles Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Bugfix | Medium |
DDM profile display name comparison is case-insensitive DDM profile display name comparison is case-insensitive Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Bugfix | Medium |
Host OS setting entry removed when RemoveProfile fails with error 89 Host OS setting entry removed when RemoveProfile fails with error 89 Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Refactor | Low |
Switched default WiX runtime on macOS to Docker, removing Wine requirement Switched default WiX runtime on macOS to Docker, removing Wine requirement Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
| Refactor | Low |
Changed Fleet‑maintained apps serving location from GitHub to https://maintained-apps.fleetdm.com/manifests with fallback Changed Fleet‑maintained apps serving location from GitHub to https://maintained-apps.fleetdm.com/manifests with fallback Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
| Refactor | Low |
Updated `fleetctl gitops` to process Android certificates before Android profiles Updated `fleetctl gitops` to process Android certificates before Android profiles Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
| Refactor | Low |
Set `script_execution_timeout` to default from global agent options if unset Set `script_execution_timeout` to default from global agent options if unset Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
| Refactor | Low |
Redirect users with read‑only access from edit policy page to policy details page Redirect users with read‑only access from edit policy page to policy details page Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
| Refactor | Low |
Removed email and password requirements from `fleetctl user create --api-only` Removed email and password requirements from `fleetctl user create --api-only` Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
| Refactor | Low |
Updated `GET /users/{id}` response to include `api_endpoints` field for API‑only users Updated `GET /users/{id}` response to include `api_endpoints` field for API‑only users Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
Full changelog
Fleet 4.85.0 (May 14, 2026)
IT Admins
- Added a dark theme to the Fleet UI, selectable in account settings with light, dark, and system options.
- Implemented Clear Passcode feature for iOS and iPadOS.
- Added support for Fleet variables in Apple's declaration profiles (DDM).
- Added support for passing end-user authentication context to the Fleet MSI installer during Windows MDM enrollment, so end users are not prompted to authenticate twice when EUA is enabled.
- Switched to Docker as the default WiX runtime on macOS (including Apple Silicon) when generating
.msipackages viafleetctl package. Wine is no longer required on macOS for the default path. - Updated macOS 15 CIS benchmark to include v2.0.0 changes.
- Updated the macOS 14 (Sonoma) CIS policy set to benchmark v3.0.0.
- Switched Fleet-maintained apps serving location from GitHub to https://maintained-apps.fleetdm.com/manifests. If this site is inaccessible, Fleet will fall back to the previous GitHub-hosted copies of manifest files.
- Added conditional HTTP downloads using ETag headers for software in GitOps, skipping re-download when content hasn't changed.
- Added
always_downloadoption for software in GitOps to bypass the new conditional download feature. - Added automatic escaping of JSON special characters in GitOps variables used in
.jsonconfiguration profiles (Apple DDM declarations and Android profiles). - Updated
fleetctl gitopsto process Android certificates before Android profiles. - Made fleet name uniqueness rules consistent across the UI, API, and GitOps paths. Fleet names must now differ by more than letter case, and conflicts return a 409 error on all code paths.
- Enabled renewing and deleting AB tokens in the UI in GitOps mode.
- Changed the team's
script_execution_timeoutin agent options to default to the global agent options value when unset. - Added ability to save policies whose SQL is flagged as a syntax error.
- Withheld Android Wi-Fi configuration profiles (
openNetworkConfigurationwithClientCertKeyPairAlias) until the referenced certificate is installed or terminally failed on the device. - Updated the host OS settings detail column to show the reason when an Android profile is pending due to a certificate dependency.
- Added "Hosts online", "Vulnerability exposure", and "Hosts enrolled" charts to the dashboard.
- Added an admin setting to control retention of vulnerability-exposure data used by the dashboard chart.
- Added new policy details page with a read-only view of policy information.
- Updated edit policy page to redirect users with read-only access to the policy details page.
- Added dedicated
/policies/:id/liveroute for running policies.
Security Engineers
- Added UI pages for creating and editing API-only users with support for fleet assignment, role selection, and API endpoint access control.
- Added new middleware (
APIOnlyEndpointCheck) that enforces a 403 response for API-only users whose request either isn't in the API endpoint catalog or falls outside their configured per-user endpoint restrictions. - Added
POST /users/api_onlyendpoint for creating API-only users. - Added
PATCH /users/api_only/{id}endpoint for updating existing API-only users. - Updated
fleetctl user create --api-onlyto remove email and password field requirements. - Added a new premium
GET /api/_version_/fleet/rest_apiendpoint that returns the contents of the embeddedapi_endpoints.ymlartifact. - Updated
GET /users/{id}response to include the newapi_endpointsfield for API-only users. - Added
user_api_endpointstable to track per-user API endpoint permissions.
Bug fixes and improvements
- Updated Go to 1.26.3.
- Improved MySQL writer performance by skipping no-op
UPDATE host_orbit_infoandUPDATE host_diskswrites when the stored values already match the incoming ingest values from osquery, cutting these writes to near zero at steady state. - Improved Fleet-maintained apps (FMA) sync performance by adding an index on
software.bundle_identifierthat eliminates a full table scan during the hourly sync, reducing writer CPU load on large deployments. - Improved the performance of deleting Windows MDM configuration profiles at scale by collapsing the per-profile update loop into a single batched statement that spans multiple profiles per chunk.
- Updated copy, show, and other action buttons app-wide for a more consistent style.
- Improved button and link styling.
- Improved the OS settings modal layout.
- Improved host policy empty state.
- Updated the enrollment page enroll button to render at full screen width for larger-resolution mobile devices.
- Updated the error message returned when an invalid domain is supplied for MDM Apple CSR signing.
- Updated EULA PDF upload size check to use the default max request body size.
- Added activity when a Windows MDM wipe command fails.
- Improved documentation for MySQL read replica configuration, clarifying that all settings (including region for IAM authentication) must be explicitly set for the read replica.
- Upgraded to TypeScript 6.0 for the app frontend.
- Moved some core UI form components to TypeScript for better predictability and reliability.
- Removed the unused
windows_updatesMySQL table and ingestion code. - Implemented the chart bounded context and schema to support charting capabilities in Fleet.
- Added
gitOpsModeEnabledandgitOpsModeExceptionsto the anonymous statistics payload. - Added startup validation that panics if any route declared in
service/api_endpoints.ymlis not registered in the router. - Stopped turning on Prometheus serving by default with a hard-coded username and password when the server is started with
--dev. - Fixed a Windows BitLocker encrypt/decrypt loop on machines with secondary drives using auto-unlock. Fleet now detects disk encryption using
conversion_status(not justprotection_status), preventing the server from repeatedly requesting encryption when the disk is already encrypted. Addedbitlocker_protection_statustracking so the UI shows "Action required" when BitLocker protection is off instead of misleadingly showing "Verified." - Fixed a race condition where a host could silently revert to its previous team after an admin team transfer.
- Fixed an issue where trying to wipe a device after its certificate was renewed could fail due to a missing bootstrap token. Note: The device might still have wiped.
- Fixed a server panic (502) when an Android pubsub status report arrived for a host that had been deleted from Fleet.
- Fixed a server panic when an Apple MDM
DeviceInformationrefetch response omittedDeviceNameor other expected fields. - Fixed an issue where Fleet would send an
AccountConfigurationcommand to iOS and iPadOS devices when end user authentication was enabled;AccountConfigurationis macOS-only. - Fixed a bug where pending MDM profile rows persisted in the database after Apple or Windows MDM was turned off, causing stale profiles to reappear when MDM was re-enabled. Also fixed cleanup of pending Windows profile rows when a device unenrolls from MDM.
- Fixed a bug where custom package installers were not removed when adding an FMA for the same title via GitOps, which caused setup experience to install duplicate software.
- Fixed a bug where renaming a patch policy in a GitOps file caused it to be deleted initially.
- Fixed a bug where host environment variables in script-only packages would cause GitOps to fail.
- Fixed an issue where the DDM reconciler would not self-heal for stuck remove/pending profiles due to resend with update.
- Fixed an issue where a host DDM cleanup function was not executed for stale remove/pending profiles that weren't reported by the device.
- Fixed an issue where batch processing many DDM profile changes would result in stuck remove/pending profiles.
- Fixed an issue where sending a differently cased display name for a DDM profile via the batch endpoint would result in recreating the DDM profile and triggering a resend.
- Fixed an issue where Fleet would not remove the host OS setting entry if a
RemoveProfilecommand failed with error code 89 (profile not found on device). - Fixed an issue where adding a custom icon for a script-only package was not allowed in GitOps.
- Fixed an issue where duplicate Disk Encryption activity types showed up.
- Fixed the host details activity feed showing the previously opened host's activities by including the host ID in the activity query cache keys.
- Fixed navigation to the settings page for multi-team admin users.
- Fixed software table page number to be bookmarkable.
- Fixed an infinite page loop pagination bug on the software table page that occurred when viewing a subsequent page and then using the software filter dropdown.
- Fixed styling bugs in GitOps mode UI.
- Fixed padding between GitOps exceptions checkboxes.
- Fixed a nil pointer dereference in the contributor API spec/policies.
Fleet-maintained app updates and vulnerability fixes are applied, whether or not you upgrade.
Fleet's agent
The following version of Fleet's agent (fleetd) support the latest changes to Fleet:
- orbit-v1.55.0
fleet-desktop-v1.55.0(included with Orbit)osquery-5.23.0(included with Orbit)- fleetd-chrome-v1.3.5
- fleetd-android-v1.0.2
While newer versions of
fleetdstill function with older versions of Fleet, old versions offleetdand osquery may not function with new versions of Fleet. We do not actively test these scenarios, and we recommend deploying a minimum of the agent versions above before upgrading to this version of Fleet.
Upgrading
Please visit our upgrade guide for upgrade instructions.
Documentation
Documentation for Fleet is available at fleetdm.com/docs.
Binary Checksum
SHA256
f7eed5849929b0da95b6137637ff511861c77083347b56729e64ec730ffe0fac fleet_v4.85.0_linux.tar.gz
5ec57c4fbeea41d709a53b95cdc45c9882a0fcec540ee6817aeab8c1dee3451c fleetctl_v4.85.0_linux_amd64.tar.gz
bee544c2a1c14f00f3704ae5b7d30e7ae4bd5eb6e83f83036787563cb96e1adc fleetctl_v4.85.0_linux_amd64.zip
cf1c797a89ec9fdfca0faeee5e9eaf6e12abe6b2f19d1eebba721e2eb52d1075 fleetctl_v4.85.0_linux_arm64.tar.gz
97f893bb791193f6c341e6aaeb5495738d396dfd68861d0ee745083f18e70cd6 fleetctl_v4.85.0_linux_arm64.zip
ad2190195b51267eec3a935c89ea60f2fcb49ff6f85a8bd80f432664e455f56b fleetctl_v4.85.0_macos.tar.gz
f9c5acdb0da87185cd154c653618e0dd7466267edbce33147533735b686551a6 fleetctl_v4.85.0_macos.zip
5928e8ea9652273860f7fcc0afc5689fd64df7e6fb1dde7e45b4d62af453de82 fleetctl_v4.85.0_windows_amd64.tar.gz
2229f249a7bfe0c574ea16727f2dfd8093e674d33cdb9960c28fbc17df705019 fleetctl_v4.85.0_windows_amd64.zip
07fbc541d75ef073ec18722b7cb0f7d66b89bbad85326c7fff3c27f033d408be fleetctl_v4.85.0_windows_arm64.tar.gz
fd23af063cc59c50f125ade79d531952207595488f4c179c8efd1d5242c08411 fleetctl_v4.85.0_windows_arm64.zip
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
Related context
Related tools
Earlier breaking changes
- vfleet-v4.86.0 Required `--host` flag for `fleetctl get mdm-commands`; deprecated `GET /api/v1/fleet/commands` without a `host_identifier`.
Beta — feedback welcome: [email protected]