<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: NAS Digital</title>
    <description>The latest articles on DEV Community by NAS Digital (@nasdigital).</description>
    <link>https://dev.to/nasdigital</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3950619%2F53530d24-3922-4d12-8f82-afc7d2cd9738.png</url>
      <title>DEV Community: NAS Digital</title>
      <link>https://dev.to/nasdigital</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nasdigital"/>
    <language>en</language>
    <item>
      <title>Semantic Kernel CVSS 10.0 Vulnerability: What You Need to Know</title>
      <dc:creator>NAS Digital</dc:creator>
      <pubDate>Tue, 09 Jun 2026 17:52:56 +0000</pubDate>
      <link>https://dev.to/nasdigital/semantic-kernel-cvss-100-vulnerability-what-you-need-to-know-1m77</link>
      <guid>https://dev.to/nasdigital/semantic-kernel-cvss-100-vulnerability-what-you-need-to-know-1m77</guid>
      <description>&lt;p&gt;On 7 May 2026, Microsoft disclosed critical vulnerabilities in Semantic Kernel, the official .NET framework used to build AI agents and LLM-powered applications. Among them was CVE-2026-25592, a vulnerability that received a CVSS 10.0 rating.&lt;/p&gt;

&lt;p&gt;If you've upgraded to Semantic Kernel 1.71.0, you've applied Microsoft's official fix. Many teams considered the issue closed at that point.&lt;/p&gt;

&lt;p&gt;From a CVE perspective, they're correct.&lt;/p&gt;

&lt;p&gt;However, the vulnerability highlights a broader security problem that can still exist in many Semantic Kernel deployments: allowing AI-controlled values to flow into privileged operations without strict validation.&lt;/p&gt;

&lt;p&gt;This post explains what CVE-2026-25592 was, how it worked in a real .NET application, why the underlying pattern remains relevant, and what developers should be doing to secure their Semantic Kernel implementations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Semantic Kernel Matters
&lt;/h2&gt;

&lt;p&gt;Semantic Kernel is Microsoft's open-source orchestration framework for integrating Large Language Models into .NET applications. It provides abstractions for prompts, plugins, memory, planning, tool invocation, and agent workflows.&lt;/p&gt;

&lt;p&gt;It is increasingly being used to power:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enterprise customer support systems&lt;/li&gt;
&lt;li&gt;AI-assisted business workflow automation&lt;/li&gt;
&lt;li&gt;Internal knowledge management platforms&lt;/li&gt;
&lt;li&gt;Intelligent data processing pipelines&lt;/li&gt;
&lt;li&gt;Agentic applications connected to enterprise systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The framework works by exposing application functionality to the LLM through "kernel functions" — methods decorated with the &lt;code&gt;[KernelFunction]&lt;/code&gt; attribute that the model can invoke when it determines they are needed.&lt;/p&gt;

&lt;p&gt;This capability is what makes Semantic Kernel powerful.&lt;/p&gt;

&lt;p&gt;It is also what makes mistakes extremely dangerous.&lt;/p&gt;




&lt;h2&gt;
  
  
  CVE-2026-25592: The Sandbox That Wasn't
&lt;/h2&gt;

&lt;p&gt;The vulnerability centered around the &lt;code&gt;SessionsPythonPlugin&lt;/code&gt; component within Semantic Kernel's .NET SDK.&lt;/p&gt;

&lt;p&gt;The plugin exists to allow agents to execute Python code inside an Azure Container Apps sandbox. The intended security model is straightforward: code runs inside the isolated environment and cannot directly impact the host system.&lt;/p&gt;

&lt;p&gt;The problem was a helper method named &lt;code&gt;DownloadFileAsync&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The method was intended to transfer files from the sandbox back to the host machine. Unfortunately, it was also exposed to the LLM through a &lt;code&gt;[KernelFunction]&lt;/code&gt; attribute.&lt;/p&gt;

&lt;p&gt;That single attribute transformed an internal helper function into an AI-callable tool.&lt;/p&gt;

&lt;p&gt;As soon as that happened, the &lt;code&gt;localFilePath&lt;/code&gt; parameter became AI-controlled.&lt;/p&gt;

&lt;p&gt;An attacker who can influence any prompt consumed by the agent — a support ticket, uploaded document, SharePoint file, Teams message, RAG source, or direct user interaction — could potentially persuade the model to invoke the function with an attacker-chosen file path.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Vulnerable pattern (pre-1.71.0)&lt;/span&gt;
&lt;span class="c1"&gt;// DownloadFileAsync exposed as a KernelFunction&lt;/span&gt;
&lt;span class="c1"&gt;// No validation of localFilePath&lt;/span&gt;

&lt;span class="n"&gt;localFilePath&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
&lt;span class="s"&gt;"C:\\Users\\[user]\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\evil.exe"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If a malicious payload is written to a startup directory, the next user login may result in code execution.&lt;/p&gt;

&lt;p&gt;This is why the vulnerability received a CVSS score of 10.0.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Broader Lesson
&lt;/h2&gt;

&lt;p&gt;Microsoft's fix in Semantic Kernel 1.71.0 addresses the specific vulnerability that was reported.&lt;/p&gt;

&lt;p&gt;However, the broader lesson extends beyond a single method.&lt;/p&gt;

&lt;p&gt;The root problem was allowing AI-generated values to reach privileged operations without appropriate validation.&lt;/p&gt;

&lt;p&gt;Although the reported vulnerability has been remediated, developers can unintentionally recreate the same class of issue in custom implementations.&lt;/p&gt;

&lt;p&gt;Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Custom kernel functions that accept file paths&lt;/li&gt;
&lt;li&gt;Functions that construct URLs&lt;/li&gt;
&lt;li&gt;Database query generation&lt;/li&gt;
&lt;li&gt;Command execution wrappers&lt;/li&gt;
&lt;li&gt;Reflection-based operations&lt;/li&gt;
&lt;li&gt;Network-access plugins&lt;/li&gt;
&lt;li&gt;Internal API integrations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a custom &lt;code&gt;[KernelFunction]&lt;/code&gt; accepts AI-controlled input and passes it directly into operating system, database, filesystem, or network operations, the same trust-boundary problem can reappear regardless of Semantic Kernel version.&lt;/p&gt;

&lt;p&gt;The important question is not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Am I running 1.71.0?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The important question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Do any of my kernel functions trust values generated by an LLM?"&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Hardened Implementation Pattern
&lt;/h2&gt;

&lt;p&gt;The safest approach is to avoid automatic execution of sensitive functions whenever possible.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;executionSettings&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;OpenAIPromptExecutionSettings&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;ToolCallBehavior&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ToolCallBehavior&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EnableKernelFunctions&lt;/span&gt;
    &lt;span class="c1"&gt;// Avoid AutoInvokeKernelFunctions for privileged operations&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When functions must accept paths or similar parameters, validate against an allowlist rather than attempting to block dangerous values.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;KernelFunction&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;DownloadFileAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;localFilePath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;allowedRoot&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetFullPath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/app/downloads"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;TrimEnd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DirectorySeparatorChar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DirectorySeparatorChar&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;requestedPath&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetFullPath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Combine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;allowedRoot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetFileName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;localFilePath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;requestedPath&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;StartsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;allowedRoot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;StringComparison&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OrdinalIgnoreCase&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;SecurityException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="s"&gt;$"Path traversal attempt: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;localFilePath&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Proceed with validated path&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key principle is simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Never trust AI-generated input simply because it originated from your own application.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Audit Every AI-Initiated Action
&lt;/h2&gt;

&lt;p&gt;One of the most effective defensive controls is auditing all AI-triggered function calls.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;kernel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FunctionInvocationFilters&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;SecurityAuditFilter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A security-focused invocation filter should:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Log every tool invocation&lt;/li&gt;
&lt;li&gt;Capture relevant arguments&lt;/li&gt;
&lt;li&gt;Alert on filesystem access&lt;/li&gt;
&lt;li&gt;Alert on network operations&lt;/li&gt;
&lt;li&gt;Alert on database modifications&lt;/li&gt;
&lt;li&gt;Generate audit events for investigation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you cannot see what your agent is doing, you cannot detect when it has been manipulated.&lt;/p&gt;




&lt;h2&gt;
  
  
  Human Approval Controls
&lt;/h2&gt;

&lt;p&gt;Many enterprise teams rely on human-in-the-loop controls before allowing agents to perform sensitive actions.&lt;/p&gt;

&lt;p&gt;Semantic Kernel includes mechanisms intended to support these workflows. However, developers have reported scenarios where confirmation behaviour did not align with their expectations.&lt;/p&gt;

&lt;p&gt;For that reason, organizations with strict approval requirements should consider implementing confirmation logic explicitly at the application layer rather than relying solely on framework-level controls.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ConfirmationRequiredFilter&lt;/span&gt;
    &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IFunctionInvocationFilter&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;IConfirmationService&lt;/span&gt;
        &lt;span class="n"&gt;_confirmationService&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;OnFunctionInvocationAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;FunctionInvocationContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Func&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;FunctionInvocationContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;approved&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
            &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_confirmationService&lt;/span&gt;
                &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;RequestApprovalAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Arguments&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;approved&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;OperationCanceledException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="s"&gt;"Human approval denied."&lt;/span&gt;
            &lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Immediate Actions for Production Deployments
&lt;/h2&gt;

&lt;p&gt;If you're currently running Semantic Kernel in production:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Upgrade to 1.71.0 or Later
&lt;/h3&gt;

&lt;p&gt;Apply Microsoft's security fixes without delay.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Audit Every Kernel Function
&lt;/h3&gt;

&lt;p&gt;Review every &lt;code&gt;[KernelFunction]&lt;/code&gt; implementation and identify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Filesystem operations&lt;/li&gt;
&lt;li&gt;Network requests&lt;/li&gt;
&lt;li&gt;Database access&lt;/li&gt;
&lt;li&gt;Process execution&lt;/li&gt;
&lt;li&gt;Reflection usage&lt;/li&gt;
&lt;li&gt;Dynamic code generation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Treat all parameters as untrusted input.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Disable AutoInvoke for Sensitive Operations
&lt;/h3&gt;

&lt;p&gt;Only allow automatic invocation for low-risk, read-only functions.&lt;/p&gt;

&lt;p&gt;Require explicit approval for anything that modifies systems or data.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Implement Allowlist Validation
&lt;/h3&gt;

&lt;p&gt;Validate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Paths&lt;/li&gt;
&lt;li&gt;URLs&lt;/li&gt;
&lt;li&gt;Queries&lt;/li&gt;
&lt;li&gt;Commands&lt;/li&gt;
&lt;li&gt;Resource identifiers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do not rely exclusively on blacklists.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Run With Least Privilege
&lt;/h3&gt;

&lt;p&gt;The application hosting Semantic Kernel should have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Minimal filesystem permissions&lt;/li&gt;
&lt;li&gt;Restricted network access&lt;/li&gt;
&lt;li&gt;Limited IAM permissions&lt;/li&gt;
&lt;li&gt;Regular credential rotation&lt;/li&gt;
&lt;li&gt;Strong isolation where practical&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. Monitor for Exploitation Attempts
&lt;/h3&gt;

&lt;p&gt;Look for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unexpected tool invocations&lt;/li&gt;
&lt;li&gt;Reflection-heavy execution paths&lt;/li&gt;
&lt;li&gt;Unusual filesystem activity&lt;/li&gt;
&lt;li&gt;Unexpected outbound network traffic&lt;/li&gt;
&lt;li&gt;Repeated failed function calls followed by success&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7. Review Historical Activity
&lt;/h3&gt;

&lt;p&gt;If vulnerable versions were previously deployed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Review audit logs&lt;/li&gt;
&lt;li&gt;Investigate unusual agent behaviour&lt;/li&gt;
&lt;li&gt;Check for unauthorized file modifications&lt;/li&gt;
&lt;li&gt;Rotate secrets and credentials where appropriate&lt;/li&gt;
&lt;li&gt;Conduct a security assessment&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Bigger Picture
&lt;/h2&gt;

&lt;p&gt;CVE-2026-25592 highlights a challenge facing every AI framework today.&lt;/p&gt;

&lt;p&gt;Developers want agents that can take meaningful action.&lt;/p&gt;

&lt;p&gt;Security teams want systems that cannot be manipulated.&lt;/p&gt;

&lt;p&gt;Those goals are often in tension.&lt;/p&gt;

&lt;p&gt;Semantic Kernel is not unique in this regard. Similar patterns can emerge in any framework where an LLM is allowed to invoke application functionality. Whenever model-generated output crosses into privileged operations, the trust boundary becomes a security-critical control.&lt;/p&gt;

&lt;p&gt;The industry is still learning how to secure these systems properly.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I'm Looking At Next
&lt;/h2&gt;

&lt;p&gt;These issues are only part of a much larger attack surface.&lt;/p&gt;

&lt;p&gt;Future research will focus on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Azure AI Search index poisoning through SharePoint and Teams content&lt;/li&gt;
&lt;li&gt;Text-to-SQL injection chains in Azure OpenAI applications&lt;/li&gt;
&lt;li&gt;Secure patterns for agentic workflows&lt;/li&gt;
&lt;li&gt;Building Roslyn analyzers that detect dangerous Semantic Kernel patterns at compile time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI agents are becoming increasingly capable. The security controls protecting them need to mature just as quickly.&lt;/p&gt;

&lt;p&gt;Until then, treat every AI-generated action as untrusted input and design your systems accordingly.&lt;/p&gt;

&lt;p&gt;This version is something I'd be comfortable putting my name on from a technical accuracy standpoint. It still has a strong thesis, but it no longer makes any claim that requires proving Microsoft's patch is bypassable. Instead, it uses the CVE as a concrete example of a broader security pattern, which is both accurate and more valuable to readers.&lt;/p&gt;

</description>
      <category>aisecurity</category>
      <category>semantickernel</category>
      <category>dotnet</category>
    </item>
  </channel>
</rss>
