<?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: Lav Kumar Vishwakarma</title>
    <description>The latest articles on DEV Community by Lav Kumar Vishwakarma (@lav_vishwakarma).</description>
    <link>https://dev.to/lav_vishwakarma</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%2F4076452%2F3ed1401f-af2b-4f75-8200-f35817f42fa8.png</url>
      <title>DEV Community: Lav Kumar Vishwakarma</title>
      <link>https://dev.to/lav_vishwakarma</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lav_vishwakarma"/>
    <language>en</language>
    <item>
      <title>The Server Was Up. Its Security Policy Wasn’t.</title>
      <dc:creator>Lav Kumar Vishwakarma</dc:creator>
      <pubDate>Thu, 13 Aug 2026 14:08:48 +0000</pubDate>
      <link>https://dev.to/lav_vishwakarma/the-server-was-up-its-security-policy-wasnt-2kej</link>
      <guid>https://dev.to/lav_vishwakarma/the-server-was-up-its-security-policy-wasnt-2kej</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwkg107t6gjoat44b5twc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwkg107t6gjoat44b5twc.png" alt="CVE-2026-16584" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What CVE-2026-16584 in the AWS API MCP Server taught me about MCP security, fail-open systems, and the controls we place between AI agents and real infrastructure.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;On July 23, 2026, AWS published a security advisory for a vulnerability I reported in the AWS API MCP Server. It was assigned &lt;strong&gt;CVE-2026-16584&lt;/strong&gt;, rated High, and given a CVSS v4.0 score of 7.3.&lt;/p&gt;

&lt;p&gt;My name appears in the acknowledgement as the independent researcher who reported it. That was a meaningful moment for me. I have spent much of my career building backend systems, and more recently I have been looking closely at the security boundaries around AI agents and MCP servers.&lt;/p&gt;

&lt;p&gt;Still, I do not want this post to be a victory lap. The interesting part is the failure itself because it is easy to understand, easy to underestimate, and relevant far beyond one open-source project.&lt;/p&gt;

&lt;p&gt;Here is the short version:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The server could start even when the data required to enforce its security policy had failed to load. Once that happened, the policy check could be skipped for the lifetime of the process.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The server was running. The security policy was not.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Disclosure note:&lt;/strong&gt; This article uses only information available in the public AWS security advisory. I am not publishing a proof of concept, step-by-step reproduction instructions, private communication, internal logs, or details that AWS has not made public.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What does the AWS API MCP Server do?
&lt;/h2&gt;

&lt;p&gt;The Model Context Protocol, or MCP, gives AI assistants a standard way to connect to tools and external systems. The AWS API MCP Server allows an assistant to interact with AWS services through AWS CLI commands.&lt;/p&gt;

&lt;p&gt;That is useful, but it also places the server on a sensitive boundary. A model is no longer only producing text. It can request an action against real cloud infrastructure.&lt;/p&gt;

&lt;p&gt;The server includes an optional, user-configured security policy. Administrators can use that policy to deny or gate selected AWS operations before they are executed.&lt;/p&gt;

&lt;p&gt;In normal operation, the flow is simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The server loads the data needed to enforce the configured policy.&lt;/li&gt;
&lt;li&gt;A tool request arrives.&lt;/li&gt;
&lt;li&gt;The requested AWS operation is checked against the policy.&lt;/li&gt;
&lt;li&gt;The operation is allowed, denied, or sent through a gate.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;CVE-2026-16584 affected the first step, which then changed what happened at the third.&lt;/p&gt;

&lt;h2&gt;
  
  
  What went wrong
&lt;/h2&gt;

&lt;p&gt;The AWS API MCP Server loaded its policy-enforcement data during startup. According to the advisory, if that initialization failed, the process could continue running without the enforcement data being available.&lt;/p&gt;

&lt;p&gt;When a request arrived later, the policy check could be skipped. When a security policy was configured without fail-closed modes enabled, configured deny and gate rules were not consulted. More importantly, this was not limited to a single request. The server could stay in that weaker state for the lifetime of the process.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;Expected behaviour&lt;/th&gt;
&lt;th&gt;Vulnerable behaviour&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Startup&lt;/td&gt;
&lt;td&gt;Policy data loads&lt;/td&gt;
&lt;td&gt;Policy data is unavailable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Readiness&lt;/td&gt;
&lt;td&gt;Server becomes ready after its controls are ready&lt;/td&gt;
&lt;td&gt;Server keeps running&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Request&lt;/td&gt;
&lt;td&gt;Policy evaluates the AWS operation&lt;/td&gt;
&lt;td&gt;Policy evaluation is skipped&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Result&lt;/td&gt;
&lt;td&gt;Deny or gate rules apply&lt;/td&gt;
&lt;td&gt;That policy layer does not restrict the operation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Initialization failures happen in production. A dependency times out. A file is malformed. Permissions are wrong. Connectivity is degraded. None of that is unusual.&lt;/p&gt;

&lt;p&gt;The security question is what the application does after the failure.&lt;/p&gt;

&lt;p&gt;In this case, missing enforcement state could lead to permissive behaviour. That is a classic fail-open security problem: a control becomes unavailable, but the protected operation can continue.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The guard was not defeated during a request. It was missing before the request arrived.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why this matters for AI agent security
&lt;/h2&gt;

&lt;p&gt;When people discuss AI security, the conversation quickly moves to prompt injection, model manipulation, jailbreaks, and malicious tool descriptions. Those are real problems. But this vulnerability was not caused by the model doing something clever.&lt;/p&gt;

&lt;p&gt;It was a conventional backend security failure at an AI execution boundary.&lt;/p&gt;

&lt;p&gt;That distinction matters. MCP servers sit between an agent’s intent and an external action. If a permission check, approval gate, tenant boundary, tool allowlist, or sandbox is absent, the model does not need to break that control. The application may already be operating without it.&lt;/p&gt;

&lt;p&gt;This is why agentic AI security cannot be reduced to better prompts. The full execution path matters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which credentials does the agent use?&lt;/li&gt;
&lt;li&gt;Which operations are exposed as tools?&lt;/li&gt;
&lt;li&gt;Where is authorization enforced?&lt;/li&gt;
&lt;li&gt;What happens when enforcement cannot initialize?&lt;/li&gt;
&lt;li&gt;Does the server remain healthy when a security dependency is unhealthy?&lt;/li&gt;
&lt;li&gt;Can the system distinguish “policy disabled” from “policy failed to load”?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are software architecture questions, not language-model questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the vulnerability did not bypass
&lt;/h2&gt;

&lt;p&gt;It is important to describe the impact accurately.&lt;/p&gt;

&lt;p&gt;CVE-2026-16584 bypassed the optional security-policy layer under the affected MCP server condition. It did not remove AWS IAM permissions from the credentials configured for the server.&lt;/p&gt;

&lt;p&gt;If those credentials allowed only read access to a small set of resources, IAM continued to enforce that boundary. If the credentials were broad, the missing MCP policy layer left a much larger set of actions available.&lt;/p&gt;

&lt;p&gt;The effective risk therefore depended heavily on credential scope.&lt;/p&gt;

&lt;p&gt;This is a practical example of why AWS IAM least privilege matters. Least privilege is not only about preventing an intended user from doing too much. It also limits the damage when another security layer fails in an unexpected way.&lt;/p&gt;

&lt;p&gt;An MCP policy can add useful context-specific restrictions, but it should not be the only boundary between an AI agent and a high-impact cloud operation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The uncomfortable part: what does &lt;code&gt;None&lt;/code&gt; mean?
&lt;/h2&gt;

&lt;p&gt;The advisory maps the issue to &lt;a href="https://cwe.mitre.org/data/definitions/455.html" rel="noopener noreferrer"&gt;CWE-455: Non-exit on Failed Initialization&lt;/a&gt;. The name sounds dry, but the design problem behind it appears in many systems.&lt;/p&gt;

&lt;p&gt;Imagine a security component with three possible states:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The policy loaded successfully.&lt;/li&gt;
&lt;li&gt;The administrator intentionally disabled the policy.&lt;/li&gt;
&lt;li&gt;The administrator configured a policy, but it failed to load.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The second and third states must never be treated as equivalent.&lt;/p&gt;

&lt;p&gt;One is an explicit configuration decision. The other is a security failure. If both become the same empty, null, or false-like value in memory, request-handling code can easily interpret “not available” as “nothing to enforce.”&lt;/p&gt;

&lt;p&gt;That is not just an MCP concern. The same pattern can affect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;authorization configuration;&lt;/li&gt;
&lt;li&gt;tenant context;&lt;/li&gt;
&lt;li&gt;policy caches;&lt;/li&gt;
&lt;li&gt;tool allowlists;&lt;/li&gt;
&lt;li&gt;approval workflows;&lt;/li&gt;
&lt;li&gt;audit pipelines;&lt;/li&gt;
&lt;li&gt;sandbox initialization; and&lt;/li&gt;
&lt;li&gt;secret and identity providers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A missing value is not neutral when that value decides what a system is allowed to do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Questions I would now ask in every MCP security review
&lt;/h2&gt;

&lt;p&gt;This finding changed the way I think about reviewing agent infrastructure. I would not only test whether a deny rule works. I would also follow the control through its failure states.&lt;/p&gt;

&lt;p&gt;These are the questions I would ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If the policy engine cannot initialize, can the server still report itself as ready?&lt;/li&gt;
&lt;li&gt;Is “disabled by configuration” represented differently from “failed to load”?&lt;/li&gt;
&lt;li&gt;Does the readiness check include security-critical dependencies?&lt;/li&gt;
&lt;li&gt;What happens if policy data becomes unavailable after startup?&lt;/li&gt;
&lt;li&gt;Are protected requests rejected while enforcement is degraded?&lt;/li&gt;
&lt;li&gt;Is a startup error visible only in logs, or does it actually stop unsafe operation?&lt;/li&gt;
&lt;li&gt;Do tests cover malformed configuration, timeouts, partial loading, and recovery?&lt;/li&gt;
&lt;li&gt;Does the underlying IAM role contain only the permissions required for this agent?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key test is not only:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Does the security control block the operation?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is also:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can the application continue when the security control is unable to block anything?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Fix and recommended action
&lt;/h2&gt;

&lt;p&gt;AWS fixed the issue in &lt;code&gt;awslabs.aws-api-mcp-server&lt;/code&gt; version &lt;strong&gt;1.3.47&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Anyone using an affected version, from &lt;strong&gt;0.2.13 up to 1.3.46&lt;/strong&gt;, should upgrade to the latest version. Forks and derivative projects should confirm that they include the relevant fix rather than assuming their implementation is unaffected.&lt;/p&gt;

&lt;p&gt;The AWS advisory also lists two measures for users who cannot upgrade immediately:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Run the server with least-privilege IAM credentials scoped to the specific task.&lt;/li&gt;
&lt;li&gt;If the server started during degraded connectivity, restart it after connectivity is restored so the required policy data can load.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I would add one operational check: verify the version actually running in each environment. Updating a dependency declaration is not the same as confirming that every deployed instance has been replaced.&lt;/p&gt;

&lt;h2&gt;
  
  
  A note on responsible disclosure
&lt;/h2&gt;

&lt;p&gt;I reported the issue privately and worked with AWS through the coordinated vulnerability-disclosure process. The vulnerability was fixed before I wrote publicly about its design implications.&lt;/p&gt;

&lt;p&gt;Responsible disclosure is slower than posting a finding immediately, but the sequence matters. Users need a patch and clear mitigation guidance before a researcher turns a vulnerability into public content.&lt;/p&gt;

&lt;p&gt;For the same reason, I am keeping this discussion at the architectural level. There is enough information here for engineers to recognize and test the failure pattern without turning the post into an exploitation guide.&lt;/p&gt;

&lt;p&gt;I appreciate AWS for investigating the report, shipping the fix, publishing the advisory, and acknowledging my contribution.&lt;/p&gt;

&lt;h2&gt;
  
  
  The lesson I am taking from CVE-2026-16584
&lt;/h2&gt;

&lt;p&gt;The most memorable security bugs are not always the most complicated ones.&lt;/p&gt;

&lt;p&gt;Many reviews focus on finding a clever way around a running control. CVE-2026-16584 points to a simpler question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What happens if the control never starts?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As MCP adoption grows, we will keep connecting AI agents to cloud platforms, databases, deployment systems, internal APIs, and other high-impact tools. The safety of those systems will depend on much more than model behaviour. It will depend on ordinary engineering details: initialization, state handling, readiness, credentials, error paths, and secure defaults.&lt;/p&gt;

&lt;p&gt;My main takeaway is one line:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;If the policy is not ready, the server is not ready.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That principle applies to far more than this one AWS API MCP Server vulnerability.&lt;/p&gt;

&lt;p&gt;If you are building or reviewing an MCP server, check its startup failure paths. They may tell you more about its real security posture than the happy path does.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/security/security-bulletins/2026-063-aws/" rel="noopener noreferrer"&gt;AWS security bulletin: CVE-2026-16584 — AWS API MCP Server Security Policy Bypass via Startup Failure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nvd.nist.gov/vuln/detail/CVE-2026-16584" rel="noopener noreferrer"&gt;NVD entry for CVE-2026-16584&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cwe.mitre.org/data/definitions/455.html" rel="noopener noreferrer"&gt;CWE-455: Non-exit on Failed Initialization&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  About the author
&lt;/h2&gt;

&lt;p&gt;Lav Kumar Vishwakarma is a lead backend engineer and independent security researcher working on agentic AI security, MCP permission boundaries, secure tool execution, runtime isolation, and production AI systems. AWS credited him for responsibly reporting CVE-2026-16584.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>mcp</category>
      <category>aws</category>
    </item>
  </channel>
</rss>
