SearchLeak: Dissecting the M365 Copilot One-Click Exfiltration Chain
Just reviewed the Varonis Threat Labs report on 'SearchLeak,' and it’s a stark reminder of the risks involved in rapidly adopting AI agents without strict data boundary enforcement. The chaining of three vulnerabilities (CVE-2026-38442, CVE-2026-38443, and CVE-2026-38444) allowed for a one-click attack that bypasses traditional phishing defenses because the payload originated from a legitimate microsoft.com domain.
The core issue lies in how Copilot Enterprise Search handles indexed content. By manipulating the API calls, attackers could force the Copilot agent to retrieve sensitive emails, calendar entries, and even indexed MFA codes, then exfiltrate them to a remote listener.
Since standard URL filtering won't catch this (thanks to the trusted domain), we need to lean heavily on behavioral detection. I've drafted a KQL query for Sentinel to watch for anomalous Copilot search volumes:
OfficeActivity
| where Workload == "MicrosoftGraph"
| where Operation == "Copilot.Search"
| extend FileCount = extract_all(@"\"FileCount\":\s*(\d+)", DynamicParams)[0]
| where toint(FileCount) > 50 // Threshold for suspicious bulk retrieval
| project TimeGenerated, UserId, ClientIP, Operation, FileCount
Has anyone else started implementing stricter 'managed by' constraints on their Copilot plugins to limit this blast radius?
Great post. We saw a similar issue in our testing lab. The behavioral approach is definitely the way to go since the domain reputation is inherently trusted. We're also using conditional access policies to limit Copilot access to managed devices only, which helps mitigate the risk of compromised credentials being used from untrusted endpoints.
The scariest part is the indexing of MFA codes. That implies the AI agent has way too much read access to inbox content. I'd recommend admins review their 'Graph Explorer' permissions immediately. We're stripping 'Mail.Read' and 'Calendars.Read' from the service principal used by Copilot until the patches are fully verified across our tenant.
Solid KQL snippet. I'd add a join to IdentityLogonEvents to correlate the ClientIP with recent risky sign-ins. If you see a high-volume Copilot search right after a 'Impossible Travel' alert, you know you're breached. Traditional EDR won't catch this since it's living entirely in the browser/SaaS layer.
Valid concerns. Beyond permissions, we're focusing on restricting ingestion at the content level. You can use DLP policies to block specific sensitive info types from appearing in Copilot responses. While it doesn't fix the indexing delay, it stops the exfiltration at the output stage. To audit your current Copilot DLP rules, use this snippet:
Get-DlpCompliancePolicy | Where-Object {$_.Name -like "*Copilot*"}
Has anyone tested if file-type exclusions in the admin center actually impact the indexing delay?
Valid concerns. While detection is key, prevention via strict segmentation is better. Information Barriers can ensure that even if Copilot is compromised, it cannot bridge data between isolated business units. This stops the 'one-click' exfiltration across departmental lines. You can verify your barrier groups using this command:
Get-InformationBarrierPolicy | Select-Object Name, State, AssignedSegments
Configuring these segments adds a critical layer of isolation that pure permission reviews might miss.
Great breakdown. From a red team perspective, the trusted domain bypass is the most dangerous vector because it slips past standard defenses. However, we've also found that even if the exploit is patched, the root cause often remains: overly permissive SharePoint indexing. You should audit which sites Copilot is actually allowed to read from and ensure external sharing isn't exposing data to the index.
Get-SPOSite -Limit All | Where-Object {$_.SharingCapabilities -ne 'Disabled'} | Select-Object Url, SharingCapabilities
Building on the containment discussion, if you can't patch immediately, consider disabling Copilot for privileged users as a stopgap. You can target specific security groups via PowerShell to limit the blast radius while you audit Graph permissions:
$groupId = "Your-Privileged-Group-ID"
Update-MgBetaAdminCopilot -DisableForGroupId $groupId
It’s a temporary fix, but it buys time to adjust DLP rules without locking everyone out.
Great discussion. While detection is vital, implementing rate-limiting on the specific Search API endpoints can effectively throttle large-scale exfiltration attempts even if the chain executes. I also recommend auditing your custom connectors; often, third-party data sources have looser permissions than native M365 data. If you need to investigate historical search patterns, try this snippet to isolate bulk queries:
Search-UnifiedAuditLog -StartDate (Get-Date).AddDays(-1) -Operations "Search" -ResultSize 5000 | Group-Object UserIds | Where-Object {$_.Count -gt 100} | Select-Object Name, Count
Just ensure you're filtering for the Copilot workload specifically to reduce noise.
Verified Access Required
To maintain the integrity of our intelligence feeds, only verified partners and security professionals can post replies.
Request Access