{"id":2850,"date":"2026-08-30T02:46:54","date_gmt":"2026-08-30T09:46:54","guid":{"rendered":"https:\/\/www.cycognito.com\/blog\/?p=2850"},"modified":"2026-08-30T03:03:07","modified_gmt":"2026-08-30T10:03:07","slug":"asm-has-a-silent-c-and-it-stands-for-change-management","status":"publish","type":"post","link":"https:\/\/www.cycognito.com\/blog\/asm-has-a-silent-c-and-it-stands-for-change-management\/","title":{"rendered":"ASM Has a Silent C, and It Stands for Change Management"},"content":{"rendered":"\n<p>If you run a security team, a large part of the job is responding to change. Something in the environment moves, and you have to work out whether risk moved with it, and how quickly you need to act. Those changes arrive from two different directions, <strong>external<\/strong> and <strong>internal<\/strong>.<\/p>\n\n\n\n<p>Of course, we&#8217;re all familiar with the external ones. A new CVE drops, a proof of concept goes public, a ransomware group starts naming your sector.<\/p>\n\n\n\n<p>The internal ones start inside your own organization. Someone connects an MCP server to critical data, a product team ships an API change to a public endpoint, a storage bucket loses its access policy.<\/p>\n\n\n\n<p>Attack surface management (ASM) has always tried to cover both ends, but usually in the service of vulnerability management. Not really the best way to look at it, but it is how many saw this category so far.<\/p>\n\n\n\n<p>Thankfully, things are starting to change, and teams are beginning to see ASM in its fuller role: not only protection against the next vulnerability, but also a governance tool for tracking asset proliferation. A sprawl that now gets sprawlier by the day, thanks to AI.<\/p>\n\n\n\n<p>In this post I want to explain why I think that shift is happening. And what an ASM program needs to be, to keep pace.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Exploit Window Nobody Talks About<\/h2>\n\n\n\n<p>Let&#8217;s start with the exploit window we all know about: the time between a vulnerability being disclosed and it being exploited in the wild. The industry tracks that window obsessively, treating it as a benchmark for how attackers grow more sophisticated, and every year brings new reports on how much shorter it has become.<\/p>\n\n\n\n<p>The other exploit window, which doesn&#8217;t get enough attention, is the one running from the moment a misconfiguration goes live to the moment an attacker finds it and goes in.&nbsp;<\/p>\n\n\n\n<p>The misconfiguration here can take many shapes, but the most common scenarios fall into one of two buckets: a new asset appearing, or an existing one becoming less secure. The exact issue is really not important for the purpose of this discussion.&nbsp;<\/p>\n\n\n\n<p>What matters is that, much like the regular exploit window, this one is also shrinking.<\/p>\n\n\n\n<p>On top of that, these gaps are opening more often, simply because the number of people who can deploy to production has gone through the roof. Behind that is a new kind of self-service infrastructure, with AI as the catalyst.<\/p>\n\n\n\n<p>A few years ago, the only ones with a key to production were the development teams. Today everyone in the org can deploy an MCP server just by asking AI to do it, without so much as a pretty please. This turns everyone into an <strong>agent of change<\/strong> and, lacking the appropriate guardrails, they double as <strong>agents of chaos<\/strong>.<\/p>\n\n\n\n<p>Most companies have AI adoption in this year&#8217;s goals, so the people spinning up these tools are following the new North Star. Security is caught in the middle, unwilling to block what the business just prioritized, and accountable for the risk anyway.&nbsp;<\/p>\n\n\n\n<p>All of this chaos is adding up under the surface, building toward more tech debt than organizations are prepared to deal with. Not even close. Reining it in takes an ASM program that stands on five pillars, and the first of those is knowing what you are running against in the first place.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>1. Structural Discovery<\/strong><\/h3>\n\n\n\n<p>An attack surface is often presented as a list of assets, and a list is a comfortable thing to look at. But your attack surface isn&#8217;t a list. It&#8217;s a graph, with dependencies running between the nodes.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default\"><img loading=\"lazy\" decoding=\"async\" width=\"1280\" height=\"624\" src=\"https:\/\/www.cycognito.com\/blog\/wp-content\/uploads\/image-262-1280x624.png\" alt=\"\" class=\"wp-image-2851\" srcset=\"https:\/\/www.cycognito.com\/blog\/wp-content\/uploads\/image-262-1280x624.png 1280w, https:\/\/www.cycognito.com\/blog\/wp-content\/uploads\/image-262-512x250.png 512w, https:\/\/www.cycognito.com\/blog\/wp-content\/uploads\/image-262-768x375.png 768w, https:\/\/www.cycognito.com\/blog\/wp-content\/uploads\/image-262.png 1345w\" sizes=\"auto, (max-width: 1280px) 100vw, 1280px\" \/><figcaption class=\"wp-element-caption\">Y<em>our attack surface is a graph.\u00a0<\/em><\/figcaption><\/figure>\n\n\n\n<p>Discovery starts at the organization, finds the subsidiaries, finds the domains those subsidiaries own, and works its way down to the assets sitting behind them.<\/p>\n\n\n\n<p>Every level of that path is a place where change can enter. A certificate turns up and reveals four more systems using it. An application starts resolving to new infrastructure and takes its dependencies along with it. At the far end of the scale a company gets acquired, and your attack surface grows significantly.<\/p>\n\n\n\n<p>Keeping that graph current requires re-deriving the relationships between the nodes, over and over.<\/p>\n\n\n\n<p>Doing that at the scale of environments running into millions of assets, and keeping the result steady enough that the picture doesn&#8217;t shift under your feet from one day to the next, is a serious engineering undertaking.&nbsp;<\/p>\n\n\n\n<p>Which brings us to the second pillar, which is how often you redraw that picture.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>2. Rapid Run Frequency<\/strong><\/h3>\n\n\n\n<p>To be responsive to changes, the first no-brainer requirement is seeing the change as close as possible to the time in which it occurs. Which means discovery has to run on a rapid cycle. The only question worth arguing about is how rapid that cycle should be, and the answer here largely depends on how often you think changes in your environment occur.<\/p>\n\n\n\n<p>In our own analysis of the surfaces we monitor,<a href=\"https:\/\/www.cycognito.com\/blog\/three-approaches-to-external-attack-surface-management\/\"> the size of an organization&#8217;s attack surface can fluctuate by as much as 10% in a single month<\/a>. Note this is the first key decision to take, since everything downstream inherits that number, which dictates how quickly assets are not only discovered, but also validated, tested and fixed.<\/p>\n\n\n\n<p>The trap to avoid here is to stop at &#8220;continuous&#8221;, which became the marketing message that nearly all ASM vendors adopted, us included. The job you need to do here is to find out what &#8220;continuous&#8221; means in practice. If you dig down you will find that for some platforms it means periodic runs, spaced weeks or more apart and scoped to a portion of the surface. Technically speaking, those partial, spread-out runs still carry the &#8220;continuous&#8221; label, but they probably fall short of what most security teams actually think they need.<\/p>\n\n\n\n<p>Case in point, daily scanning has become the baseline expectation, and the survey data backs us up. In the <a href=\"https:\/\/www.sans.org\/white-papers\/sans-attack-surface-management-survey-2025\">2025 SANS ASM Survey<\/a>, 59% of respondents named daily as their preferred scan frequency, compared with 25% for weekly and 10% for on-demand.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1280\" height=\"948\" src=\"https:\/\/www.cycognito.com\/blog\/wp-content\/uploads\/image-263-1280x948.png\" alt=\"\" class=\"wp-image-2852\" srcset=\"https:\/\/www.cycognito.com\/blog\/wp-content\/uploads\/image-263-1280x948.png 1280w, https:\/\/www.cycognito.com\/blog\/wp-content\/uploads\/image-263-512x379.png 512w, https:\/\/www.cycognito.com\/blog\/wp-content\/uploads\/image-263-768x569.png 768w, https:\/\/www.cycognito.com\/blog\/wp-content\/uploads\/image-263.png 1402w\" sizes=\"auto, (max-width: 1280px) 100vw, 1280px\" \/><figcaption class=\"wp-element-caption\"><em>Preferred scan frequency, 2025 SANS ASM Survey.\u00a0<\/em><\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>3. Business and Stack Context<\/strong><\/h3>\n\n\n\n<p>Once ASM hands you a list of what you have and what has moved, its next task should be to help you work out which of those changes carry real risk.<\/p>\n\n\n\n<p>The good news is that in most environments they turn out to be a small fraction of the total. The problem is that you need a platform that can filter through the noise, and dynamic IPs are the obvious example, since CDNs, load balancers and IaaS\/PaaS providers <a href=\"https:\/\/www.cycognito.com\/blog\/dynamic-ip-volatility-study\/\">rotate them constantly<\/a>.<\/p>\n\n\n\n<p>If your platform doesn&#8217;t know to recognize that change for what it is, this week&#8217;s alerts can end up being last week&#8217;s applications wearing nothing but a fresh set of addresses. What&#8217;s worse, the noise they make can bury the findings that do matter, and over time it leaves teams numb to the alerts in general.<\/p>\n\n\n\n<p>So separating infrastructure churn from the change security needs to track is where this pillar starts. What follows should be a series of deeper questions that help provide additional context:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Is the port open?<\/li>\n\n\n\n<li>Is authentication required?<\/li>\n\n\n\n<li>Does this version have known vulnerabilities?<\/li>\n<\/ul>\n\n\n\n<p>And so on. Some of those answers will raise further red flags, and where it goes wrong next is in mistaking a theoretical issue for an exploitable one.<\/p>\n\n\n\n<p>A classic example is a new application coming online carrying a SQL injection CVE that applies to the version it happens to be running. The easy move here would be to create an alert. The smart play, however, is to check whether a WAF sits in front of that application. A WAF that catches the injection attempt drops the alert far below where it first ranked.<\/p>\n\n\n\n<p>In other words, what it all boils down to is context, and the value of that context climbs with your cadence. Run discovery daily without it and you are just drowning faster.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>4. Change-aware Prioritization<\/strong> <\/h3>\n\n\n\n<p>Some of that context only comes from testing, which is not a capability most ASM platforms offer, and even fewer can execute it at any meaningful scale and rapid cadence.<\/p>\n\n\n\n<p>That leaves two things you need to get right. First, the cadence of security testing has to match what you assumed you need. Next, to test the right assets at full depth, that testing needs to be pointed by a prioritization mechanism that is change aware.<\/p>\n\n\n\n<p>By change aware here I mean a ranking that recalculates every time your environment moves, driven by signals like:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>What are the asset&#8217;s technical attributes?<\/li>\n\n\n\n<li>How attractive and discoverable is it from the outside?<\/li>\n\n\n\n<li>What threats is your industry facing right now?<\/li>\n\n\n\n<li>How valuable is this asset to the business?<\/li>\n<\/ul>\n\n\n\n<p>To demonstrate how these and other signals drive change-aware prioritization, here is a widget that walks through a few scenarios: <\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>\ud83d\udd79\ufe0f Simulator: Changes and Prioritization<\/strong><\/h3>\n\n\n\n<!-- ============================================================\n     Target Graph \u00b7 what moves the score\n     WordPress embed build. Paste the whole thing into a single\n     \"Custom HTML\" block. No <html>\/<head>\/<body>, no page-level\n     styles, every class prefixed tgw-, no element IDs, and the\n     layout responds to the container it is dropped into rather\n     than to the viewport.\n     ============================================================ -->\n\n<style>\n@import url('https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600;700;800;900&family=JetBrains+Mono:wght@400;600&display=swap');\n\n\/* Every declaration below is scoped under .tgw so nothing leaks into the\n   theme, and the reset is scoped too so the theme's p\/button rules cannot\n   leak in. *\/\n.tgw{\n  --tgw-navy:#0C1E4D; --tgw-ink:#0D1424; --tgw-muted:#5B6577;\n  --tgw-line:#E6E9F0; --tgw-bg2:#F7F9FC;\n  --tgw-orange:#FF5A26; --tgw-orange-d:#E8481A;\n  --tgw-green:#1E8A5F;\n  --tgw-mono:'JetBrains Mono',ui-monospace,Menlo,Consolas,monospace;\n\n  container-type:inline-size; container-name:tgw;\n  box-sizing:border-box;\n  position:relative; width:100%; max-width:800px; margin:24px auto;\n  border:1px solid var(--tgw-line); border-radius:14px; overflow:hidden;\n  background:#fff; color:var(--tgw-ink); line-height:1.5; text-align:left;\n  font-family:'Inter',system-ui,-apple-system,'Segoe UI',sans-serif;\n  font-size:16px; font-weight:400; font-style:normal; letter-spacing:normal;\n  -webkit-font-smoothing:antialiased;\n}\n.tgw *,.tgw *::before,.tgw *::after{box-sizing:border-box;margin:0;padding:0}\n.tgw p{margin:0}\n\/* themes that restyle b\/i by element beat inheritance, so both are pinned *\/\n.tgw b{font-weight:700;font-style:normal}\n.tgw i{font-style:normal}\n.tgw button{\n  -webkit-appearance:none;appearance:none;border:0;border-radius:0;\n  background:transparent;box-shadow:none;text-transform:none;\n  letter-spacing:normal;color:inherit;font:inherit;line-height:inherit;\n  min-height:0;width:auto\n}\n.tgw button:hover,.tgw button:focus{background:transparent;box-shadow:none}\n\n.tgw-split{display:grid;grid-template-columns:330px 1fr}\n\n\/* ===================== LEFT: the scenario menu =====================\n   The changes are one vertical list. The selected one opens in place and holds\n   its description, so the cause and its explanation are the same object rather\n   than two places to look. *\/\n.tgw-menu{border-right:1px solid var(--tgw-line);background:var(--tgw-bg2);padding:16px 14px 18px}\n.tgw-mhd{font-size:11px;font-weight:800;letter-spacing:.1em;text-transform:uppercase;\n  color:#9AA3B2;margin-bottom:3px}\n.tgw-msub{font-size:12px;color:var(--tgw-muted);line-height:1.45;margin-bottom:13px}\n.tgw-item{border:1.5px solid var(--tgw-line);background:#fff;border-radius:9px;margin-bottom:6px;\n  overflow:hidden;transition:border-color .16s ease,box-shadow .16s ease}\n.tgw-item:last-child{margin-bottom:0}\n.tgw-item button{display:flex;align-items:flex-start;gap:8px;width:100%;text-align:left;\n  padding:10px 12px;font-size:13px;font-weight:700;line-height:1.3;\n  color:var(--tgw-ink);cursor:pointer}\n.tgw-item button .tgw-cv{flex:0 0 auto;width:7px;height:7px;border-radius:50%;margin-top:5px;\n  background:#CBD3E2;transition:background .2s ease,box-shadow .2s ease}\n.tgw-item:hover{border-color:#B9C6E2}\n.tgw-item button:focus-visible{outline:2px solid var(--tgw-orange);outline-offset:-2px}\n.tgw-item.tgw-open{border-color:var(--tgw-orange);box-shadow:0 0 0 3px rgba(255,90,38,.12)}\n.tgw-item.tgw-open button .tgw-cv{background:var(--tgw-orange);box-shadow:0 0 0 3px rgba(255,90,38,.2)}\n\n\/* the body is height-animated, so opening reads as the item expanding rather\n   than a panel appearing somewhere else *\/\n.tgw-body{max-height:0;overflow:hidden;transition:max-height .3s ease}\n.tgw-item.tgw-open .tgw-body{max-height:340px}\n.tgw-bin{padding:9px 11px 11px;border-top:1px solid #F0F2F7;margin-top:1px}\n\/* the asset being re-scored, in the accent colour, so the same hostname is\n   recognisable when it turns up in the ranking on the right *\/\n.tgw-bin .tgw-as{display:block;font-family:var(--tgw-mono);font-size:10.5px;font-weight:600;\n  color:var(--tgw-orange-d);margin-bottom:6px;overflow:hidden;text-overflow:ellipsis;\n  white-space:nowrap}\n.tgw-bin p{font-size:12px;line-height:1.55;color:var(--tgw-muted)}\n\/* the scenario itself is bold, the consequence is not *\/\n.tgw-bin p b{color:var(--tgw-ink);font-weight:700}\n\n\/* ===================== RIGHT: the Target Graph ===================== *\/\n.tgw-panel{padding:16px 18px 18px;min-width:0}\n.tgw-ph{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin-bottom:2px}\n.tgw-ph .tgw-tag{font-size:10px;font-weight:800;letter-spacing:.11em;text-transform:uppercase;\n  color:#9AA3B2}\n\/* the asset and its composite are one object: the hostname names what is being\n   scored, the number is the score, and the four tiles below are what it is\n   made of *\/\n.tgw-hdr{display:flex;align-items:center;gap:9px;flex-wrap:wrap;margin:9px 0 9px;\n  padding:9px 13px;border-radius:10px;background:var(--tgw-bg2);border:1px solid var(--tgw-line)}\n.tgw-hdr .tgw-dot{width:7px;height:7px;border-radius:50%;background:var(--tgw-orange);flex:0 0 auto}\n\/* what happened to it sits above what it is, so the state reads first and the\n   hostname is the thing being pointed at *\/\n.tgw-hdr .tgw-who{display:flex;flex-direction:column;gap:2px;min-width:0}\n.tgw-hdr .tgw-hn{font-family:var(--tgw-mono);font-size:13px;font-weight:600;color:var(--tgw-orange-d)}\n.tgw-hdr .tgw-lb{font-size:9px;font-weight:800;letter-spacing:.1em;text-transform:uppercase;\n  color:#9AA3B2}\n\/* the composite reads top-down like the asset does on the left: what it is,\n   then the number, with the delta trailing the number it belongs to *\/\n.tgw-hdr .tgw-comp{margin-left:auto;display:flex;flex-direction:column;align-items:flex-end;gap:4px}\n.tgw-hdr .tgw-cl{font-size:9px;font-weight:800;letter-spacing:.09em;\n  text-transform:uppercase;color:#8B94A6}\n.tgw-hdr .tgw-cnum{display:flex;align-items:baseline;gap:7px}\n.tgw-hdr .tgw-cn{font-size:26px;font-weight:900;letter-spacing:-.03em;line-height:1;\n  font-variant-numeric:tabular-nums}\n.tgw-hdr .tgw-cd{font-size:11px;font-weight:800;opacity:0;transition:opacity .25s ease}\n.tgw-hdr .tgw-cd.tgw-on{opacity:1}\n.tgw-hdr .tgw-cd.tgw-up{color:var(--tgw-orange-d)}\n.tgw-hdr .tgw-cd.tgw-dn{color:var(--tgw-green)}\n.tgw-hdr .tgw-cd.tgw-new{color:var(--tgw-navy);background:#9FE9C8;border-radius:4px;padding:2px 6px;\n  font-size:9px;letter-spacing:.06em;text-transform:uppercase}\n\n\/* the four signals, at the size the point deserves *\/\n.tgw-tiles{display:grid;grid-template-columns:repeat(4,1fr);gap:6px}\n.tgw-tile{border:1.5px solid var(--tgw-line);border-radius:10px;background:#fff;padding:10px 7px 11px;\n  transition:background .3s ease,border-color .3s ease,box-shadow .3s ease}\n.tgw-tile .tgw-tl{display:block;font-size:8px;font-weight:800;letter-spacing:.03em;\n  line-height:1.25;min-height:20px;text-transform:uppercase;color:#8B94A6;\n  margin-bottom:2px}\n.tgw-tile .tgw-nums{display:flex;align-items:baseline;gap:5px}\n.tgw-tile .tgw-was{font-size:13px;font-weight:700;color:#B4BCCB;font-variant-numeric:tabular-nums}\n.tgw-tile .tgw-ar{font-size:11px;font-weight:800;color:#C3CAD8}\n.tgw-tile .tgw-now{font-size:27px;font-weight:900;letter-spacing:-.03em;line-height:1;\n  font-variant-numeric:tabular-nums;color:var(--tgw-ink)}\n.tgw-tile .tgw-dl{display:block;margin-top:5px;font-size:10px;font-weight:800;color:#A9B1C0;\n  letter-spacing:.02em;opacity:0;transition:opacity .25s ease}\n.tgw-tile .tgw-dl.tgw-on{opacity:1}\n.tgw-tile.tgw-mv{background:#FFF4EF;border-color:rgba(255,90,38,.55);\n  box-shadow:0 0 0 3px rgba(255,90,38,.09)}\n.tgw-tile.tgw-mv .tgw-now,.tgw-tile.tgw-mv .tgw-dl{color:var(--tgw-orange-d)}\n.tgw-tile.tgw-dn.tgw-mv{background:#EFFBF5;border-color:rgba(30,138,95,.45);\n  box-shadow:0 0 0 3px rgba(30,138,95,.09)}\n.tgw-tile.tgw-dn.tgw-mv .tgw-now,.tgw-tile.tgw-dn.tgw-mv .tgw-dl{color:var(--tgw-green)}\n\n\/* ===================== THE RANKING =====================\n   The Target Graph does not have a score. It assigns one to every asset and\n   ranks them, and the ranking is what decides where testing goes. Only the\n   re-scored asset moves: the rest hold the scores they had, which is what makes\n   the one that moves worth watching. *\/\n.tgw-rankwrap{margin-top:13px;border:1px solid var(--tgw-navy);border-radius:11px;background:#16295C;\n  padding:11px 12px 12px;transition:background .45s ease,box-shadow .45s ease}\n.tgw-rankwrap.tgw-warm{background:#26417F;box-shadow:0 0 0 4px rgba(255,90,38,.14)}\n.tgw-rankwrap .tgw-rh{display:flex;align-items:baseline;gap:8px;margin-bottom:6px}\n.tgw-rankwrap .tgw-rh b{font-size:11.5px;font-weight:900;color:#fff;letter-spacing:-.01em}\n.tgw-rankwrap .tgw-rh span{font-size:8.5px;font-weight:800;letter-spacing:.1em;\n  text-transform:uppercase;color:#7C90C4}\n.tgw-cap{display:block;font-size:8px;font-weight:800;letter-spacing:.09em;\n  text-transform:uppercase;color:#FF9E7A;padding:0 4px 3px}\n\n\/* rows are positioned rather than stacked, so a change of rank is a transform\n   the browser can animate instead of a re-render that jumps *\/\n.tgw-rank{position:relative;transition:height .5s cubic-bezier(.4,0,.2,1)}\n.tgw-rk{position:absolute;left:0;right:0;top:0;height:26px;display:flex;align-items:center;\n  gap:8px;padding:0 6px;border-radius:5px;\n  transition:transform .55s cubic-bezier(.4,0,.2,1),background .45s ease,\n             box-shadow .45s ease,opacity .3s ease}\n.tgw-rk .tgw-h{flex:1;min-width:0;font-family:var(--tgw-mono);font-size:10.5px;font-weight:600;\n  color:#C2CFE8;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.tgw-rk .tgw-s{font-size:12.5px;font-weight:800;color:#EAF0FA;font-variant-numeric:tabular-nums;\n  display:flex;align-items:baseline;gap:4px}\n.tgw-rk .tgw-s i{font-style:normal;font-size:9.5px;font-weight:900;opacity:0;\n  transition:opacity .25s ease}\n.tgw-rk .tgw-s i.tgw-on{opacity:1}\n.tgw-rk .tgw-s i.tgw-up{color:#FFA98C}\n.tgw-rk .tgw-s i.tgw-dn{color:#5FEFB4}\n.tgw-rk .tgw-s i.tgw-new{color:#0C1E4D;background:#9FE9C8;border-radius:3px;padding:1px 4px;\n  font-size:8px;letter-spacing:.05em;text-transform:uppercase}\n\/* the targeted group gets a tint rather than the rest getting dimmed. Fading\n   the assets below the line reads as \"these do not matter\", which is the wrong\n   claim: they matter, they are just not in this cycle. *\/\n.tgw-rk.tgw-in{background:rgba(255,255,255,.055)}\n\/* the moving asset travels over the rows it passes, opaque, so a swap does not\n   leave two hostnames printed on top of each other mid-flight *\/\n.tgw-rk.tgw-subjrow{background:#46507E;box-shadow:inset 2.5px 0 0 var(--tgw-orange);z-index:5}\n.tgw-rk.tgw-subjrow .tgw-h,.tgw-rk.tgw-subjrow .tgw-s{color:#fff}\n.tgw-rk.tgw-hide{opacity:0;pointer-events:none}\n.tgw-cut{position:absolute;left:6px;right:6px;top:0;height:1.5px;border-radius:1px;\n  background:rgba(255,90,38,.75);transition:transform .55s cubic-bezier(.4,0,.2,1)}\n.tgw-rank.tgw-noanim,.tgw-rank.tgw-noanim .tgw-rk,.tgw-rank.tgw-noanim .tgw-cut{transition:none}\n\n.tgw-loop{font-size:10.5px;color:#9AA3B2;margin-top:9px;text-align:right}\n\n@media(prefers-reduced-motion:reduce){\n  .tgw-tile,.tgw-rankwrap,.tgw-rk,.tgw-cut,.tgw-rank,.tgw-body,.tgw-item{transition:none}\n}\n\n\/* The widget sizes off its own container, not the viewport, because inside a\n   post the content column is narrower than the window. Below 800px the four\n   signal names have no room, so they fall to a 2x2 grid; below 729px the menu\n   stops sitting beside the panel. *\/\n@container tgw (max-width:799px){\n  .tgw-tiles{grid-template-columns:repeat(2,1fr)}\n}\n@container tgw (max-width:728px){\n  .tgw-split{grid-template-columns:1fr}\n  .tgw-menu{border-right:0;border-bottom:1px solid var(--tgw-line)}\n  .tgw-tile .tgw-now{font-size:26px}\n}\n\/* Fallback for browsers without container queries (pre-2023): the original\n   viewport breakpoints. *\/\n@supports not (container-type:inline-size){\n  @media(max-width:832px){\n    .tgw-tiles{grid-template-columns:repeat(2,1fr)}\n  }\n  @media(max-width:760px){\n    .tgw-split{grid-template-columns:1fr}\n    .tgw-menu{border-right:0;border-bottom:1px solid var(--tgw-line)}\n    .tgw-tile .tgw-now{font-size:26px}\n  }\n}\n<\/style>\n\n<div class=\"tgw\" data-tgw-root>\n  <div class=\"tgw-split\">\n\n    <div class=\"tgw-menu\" data-tgw=\"menu\">\n      <div class=\"tgw-mhd\">Pick a change<\/div>\n      <p class=\"tgw-msub\">Each one re-scores a single asset.<\/p>\n\n      <div class=\"tgw-item\" data-s=\"grow\"><\/div>\n      <div class=\"tgw-item\" data-s=\"biz\"><\/div>\n      <div class=\"tgw-item\" data-s=\"class\"><\/div>\n      <div class=\"tgw-item\" data-s=\"fixed\"><\/div>\n    <\/div>\n\n    <div class=\"tgw-panel\">\n      <div class=\"tgw-ph\"><span class=\"tgw-tag\">Score per asset<\/span><\/div>\n\n      <div class=\"tgw-hdr\">\n        <span class=\"tgw-dot\"><\/span>\n        <span class=\"tgw-who\">\n          <span class=\"tgw-lb\" data-tgw=\"lb\">re-scored<\/span>\n          <span class=\"tgw-hn\" data-tgw=\"as\"><\/span>\n        <\/span>\n        <span class=\"tgw-comp\">\n          <span class=\"tgw-cl\">Composite score<\/span>\n          <span class=\"tgw-cnum\"><span class=\"tgw-cn\" data-tgw=\"cn\">0<\/span><span class=\"tgw-cd\" data-tgw=\"cd\"><\/span><\/span>\n        <\/span>\n      <\/div>\n\n      <div class=\"tgw-tiles\" data-tgw=\"tiles\"><\/div>\n\n      <div class=\"tgw-rankwrap\" data-tgw=\"rankwrap\">\n        <div class=\"tgw-rh\"><b>Ranked assets<\/b><span>testing order<\/span><\/div>\n        <span class=\"tgw-cap\">Targeted this cycle<\/span>\n        <div class=\"tgw-rank\" data-tgw=\"rank\"><div class=\"tgw-cut\" data-tgw=\"cut\"><\/div><\/div>\n      <\/div>\n\n      <p class=\"tgw-loop\">Re-scored each cycle<\/p>\n    <\/div>\n\n  <\/div>\n<\/div>\n\n<script>\n(function(){\n  \/* ================= THE FOUR CHANGES =================\n     Between them the signals move in both directions, and the ranking gains an\n     asset, loses one, and reorders around one. Each scenario moves only the\n     signals it actually changes, which is the whole point: exploitability is a\n     tested property, so it holds until a test moves it. *\/\n  var SC={\n    'class':{\n      label:'A new technique goes into use',\n      as:'agents.example.ai', subj:'agents',\n      pre:{T:66,A:52,E:58,B:68}, post:{T:72,A:86,E:58,B:68}, mv:['A','T'],\n      txt:'<b>Indirect prompt injection against agent endpoints is in active use.<\/b> No CVE to '+\n          'match on. The endpoint did not change, its stack became the target.'\n    },\n    grow:{\n      label:'Exposed MCP server discovered',\n      as:'mcp.example.ai', subj:'mcp', isNew:true,\n      pre:{T:0,A:0,E:0,B:0}, post:{T:78,A:94,E:82,B:88}, mv:[],\n      txt:'<b>An unauthenticated MCP server under your domain, on nobody\\'s asset list.<\/b> '+\n          'Potentially high-value production system, no auth to bypass, likely deployed outside '+\n          'security review.'\n    },\n    fixed:{\n      label:'You apply a patch',\n      as:'contracts.example.net', subj:'contracts',\n      pre:{T:60,A:78,E:62,B:48}, post:{T:60,A:46,E:14,B:48}, mv:['E','A'],\n      txt:'<b>Your team patched the component and the test no longer reproduces.<\/b> Proven path '+\n          'closed, CVEs gone. Exploitability and attractiveness both fall.'\n    },\n    biz:{\n      label:'An asset becomes critical',\n      as:'exports.example.com', subj:'exports',\n      pre:{T:55,A:60,E:71,B:42}, post:{T:55,A:60,E:71,B:92}, mv:['B'],\n      txt:'<b>This data store has been reclassified as holding regulated data.<\/b> Nothing '+\n          'technical changed. The blast radius of a breach did.'\n    }\n  };\n\n  \/* The four sub-scores that make up the composite, named as the model names\n     them. Exploitability is not reachability: it is whether a path to impact\n     has been proven, which is why testing is what moves it. *\/\n  var K=['A','E','T','B'],\n      NM={A:'Tech attractiveness', E:'Exploitability', T:'Threat context',\n          B:'Business importance'};\n  function comp(o){ return Math.round((o.T+o.A+o.E+o.B)\/4); }\n\n  \/* Five assets with fixed scores, plus one that only exists once discovered.\n     Three assets are tested per cycle, so an asset crossing the line displaces\n     another. *\/\n  var ASSETS=[\n    {id:'build',    h:'build.example.net'},\n    {id:'contracts',h:'contracts.example.net'},\n    {id:'agents',   h:'agents.example.ai'},\n    {id:'vpn',      h:'vpn-emea.example.com'},\n    {id:'exports',  h:'exports.example.com'},\n    {id:'mcp',      h:'mcp.example.ai'}\n  ];\n  var BASE={build:63, contracts:62, agents:61, vpn:59, exports:57, mcp:null};\n  var SLOTS=3, ROWH=27, CUTH=11;\n\n  \/* Arrows and the minus sign go in as escapes rather than literal characters,\n     so a mis-declared page charset cannot turn them into mojibake. *\/\n  var UP='\\u2191', DOWN='\\u2193', MINUS='\\u2212';\n\n  var REDUCE=window.matchMedia&&window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\n  \/* Everything below is per-instance, so more than one copy of the widget can\n     sit on the same page without sharing state or colliding on selectors. *\/\n  function init(root){\n    if(root.getAttribute('data-tgw-init')){ return; }\n    root.setAttribute('data-tgw-init','1');\n\n    var q=function(n){ return root.querySelector('[data-tgw=\"'+n+'\"]'); };\n    var items=root.querySelectorAll('.tgw-item');\n    var rankEl=q('rank'), cutEl=q('cut'), tilesEl=q('tiles'), rowEl={};\n\n    \/* ---------- menu ---------- *\/\n    Array.prototype.forEach.call(items,function(it){\n      var s=SC[it.getAttribute('data-s')];\n      it.innerHTML='<button type=\"button\" aria-expanded=\"false\"><span class=\"tgw-cv\"><\/span>'+\n        s.label+'<\/button><div class=\"tgw-body\"><div class=\"tgw-bin\">'+\n        '<span class=\"tgw-as\">'+s.as+'<\/span><p>'+s.txt+'<\/p><\/div><\/div>';\n    });\n\n    \/* ---------- the asset list ---------- *\/\n    ASSETS.forEach(function(a){\n      var d=document.createElement('div');\n      d.className='tgw-rk'; d.setAttribute('data-id',a.id);\n      d.innerHTML='<span class=\"tgw-h\">'+a.h+'<\/span><span class=\"tgw-s\"><span class=\"tgw-v\">0'+\n        '<\/span><i><\/i><\/span>';\n      rankEl.appendChild(d); rowEl[a.id]=d;\n    });\n    function rowY(i){ return i*ROWH + (i>=SLOTS?CUTH:0); }\n\n    \/* ---------- number tweens ----------\n       A generation counter retires in-flight tweens, so switching faster than\n       the animation completes cannot leave a previous run's numbers to land on\n       top of the new ones. *\/\n    var gen=0, timers=[];\n    function tween(el, from, to, ms, g, done){\n      if(REDUCE||from===to){ el.textContent=to; if(done){done();} return; }\n      var t0=0;\n      function step(ts){\n        if(g!==gen){ return; }\n        if(!t0){ t0=ts; }\n        var p=Math.min(1,(ts-t0)\/ms), e=1-Math.pow(1-p,3);\n        el.textContent=Math.round(from+(to-from)*e);\n        if(p<1){ requestAnimationFrame(step); } else if(done){ done(); }\n      }\n      requestAnimationFrame(step);\n    }\n\n    function run(k, instant){\n      var s=SC[k];\n      gen++; var g=gen;\n      timers.forEach(clearTimeout); timers=[];\n      var wait=function(fn,ms){ if(instant||REDUCE){ fn(); } else { timers.push(setTimeout(fn,ms)); } };\n\n      Array.prototype.forEach.call(items,function(it){\n        var on=it.getAttribute('data-s')===k;\n        it.classList.toggle('tgw-open',on);\n        it.querySelector('button').setAttribute('aria-expanded',String(on));\n      });\n      q('as').textContent=s.as;\n      q('lb').textContent=s.isNew ? 'newly discovered' : 're-scored';\n\n      \/* --- tiles, drawn on the pre-change values --- *\/\n      tilesEl.innerHTML=K.map(function(x){\n        var a=s.pre[x], b=s.post[x], shown=(s.isNew||a===b);\n        return '<div class=\"tgw-tile\" data-k=\"'+x+'\"><span class=\"tgw-tl\">'+NM[x]+'<\/span>'+\n          '<div class=\"tgw-nums\">'+\n            (shown ? '' : '<span class=\"tgw-was\">'+a+'<\/span><span class=\"tgw-ar\">&#8594;<\/span>')+\n            '<span class=\"tgw-now\">'+a+'<\/span><\/div>'+\n          '<span class=\"tgw-dl\">&nbsp;<\/span><\/div>';\n      }).join('');\n\n      q('cn').textContent=comp(s.pre);\n      q('cd').textContent=''; q('cd').className='tgw-cd';\n      q('rankwrap').classList.remove('tgw-warm');\n\n      \/* --- the ranking opens on the scores as they stand. The re-scored asset\n             is the only one that moves; a newly discovered one enters at 0. --- *\/\n      var pre={}; for(var id0 in BASE){ pre[id0]=BASE[id0]; }\n      if(s.isNew){ pre[s.subj]=0; }\n      var visible=ASSETS.filter(function(a){ return pre[a.id]!=null; })\n        .sort(function(x,y){ return pre[y.id]-pre[x.id]; });\n\n      rankEl.classList.add('tgw-noanim');\n      rankEl.style.height=(visible.length*ROWH+CUTH)+'px';\n      cutEl.style.transform='translateY('+(SLOTS*ROWH+4.75)+'px)';\n      ASSETS.forEach(function(a){ rowEl[a.id].classList.add('tgw-hide'); });\n      visible.forEach(function(a,i){\n        var r=rowEl[a.id];\n        r.className='tgw-rk'+(i<SLOTS?' tgw-in':'');\n        r.style.transform='translateY('+rowY(i)+'px)';\n        r.querySelector('.tgw-v').textContent=pre[a.id];\n        r.querySelector('i').className='';\n        r.querySelector('i').textContent='';\n      });\n      void rankEl.offsetHeight;                       \/\/ land the reset before animating\n      rankEl.classList.remove('tgw-noanim');\n\n      wait(function(){\n        if(g!==gen){ return; }\n\n        \/* --- signals count to their new values --- *\/\n        K.forEach(function(x){\n          var a=s.pre[x], b=s.post[x], moved=s.mv.indexOf(x)>-1;\n          var t=tilesEl.querySelector('.tgw-tile[data-k=\"'+x+'\"]');\n          if(!t){ return; }\n          var dl=t.querySelector('.tgw-dl');\n          if(moved){ t.classList.add('tgw-mv'); if(b<a){ t.classList.add('tgw-dn'); } }\n          tween(t.querySelector('.tgw-now'), a, b, 780, g, function(){\n            dl.textContent = moved ? (b>a?UP+' +':DOWN+' '+MINUS)+Math.abs(b-a)\n                                   : (s.isNew ? '' : 'unchanged');\n            dl.classList.add('tgw-on');\n          });\n        });\n\n        var cPre=comp(s.pre), cPost=comp(s.post), d=s.isNew?0:cPost-cPre;\n        tween(q('cn'), cPre, cPost, 780, g, function(){\n          if(s.isNew){ q('cd').className='tgw-cd tgw-new tgw-on'; q('cd').textContent='new'; }\n          else if(d){ q('cd').className='tgw-cd tgw-on '+(d>0?'tgw-up':'tgw-dn');\n            q('cd').textContent=(d>0?UP+' +':DOWN+' '+MINUS)+Math.abs(d); }\n        });\n\n        \/* --- only the re-scored asset counts; the ranking re-sorts around it --- *\/\n        var scores={}; for(var id in pre){ scores[id]=pre[id]; }\n        scores[s.subj]=cPost;\n        var sorted=visible.slice().sort(function(x,y){ return scores[y.id]-scores[x.id]; });\n\n        sorted.forEach(function(a,i){\n          var r=rowEl[a.id];\n          r.style.transform='translateY('+rowY(i)+'px)';\n          r.className='tgw-rk'+(i<SLOTS?' tgw-in':'')+(a.id===s.subj?' tgw-subjrow':'');\n        });\n        var sr=rowEl[s.subj];\n        tween(sr.querySelector('.tgw-v'), pre[s.subj], cPost, 780, g, function(){\n          var ic=sr.querySelector('i');\n          if(s.isNew){ ic.className='tgw-new tgw-on'; ic.textContent='new'; }\n          else if(d){ ic.className=(d>0?'tgw-up':'tgw-dn')+' tgw-on';\n            ic.textContent=(d>0?UP:DOWN)+Math.abs(d); }\n        });\n        q('rankwrap').classList.add('tgw-warm');\n      },480);   \/\/ the before-state gets a beat to be read, then it moves\n    }\n\n    q('menu').addEventListener('click',function(e){\n      var b=e.target.closest ? e.target.closest('button') : null;\n      if(!b||!root.contains(b)){ return; }\n      run(b.parentNode.getAttribute('data-s'));\n    });\n\n    \/* First change open on load, and it runs rather than snapping: the count and\n       the reorder are the explanation. *\/\n    run('grow');\n  }\n\n  function boot(){\n    var roots=document.querySelectorAll('.tgw[data-tgw-root]');\n    Array.prototype.forEach.call(roots, init);\n  }\n  if(document.readyState==='loading'){\n    document.addEventListener('DOMContentLoaded',boot);\n  } else {\n    boot();\n  }\n})();\n<\/script>\n\n\n\n<p>This is an oversimplification of course, but it does a good job of showing the prioritization decisions our own ASM makes in response to external and internal shifts. It is also the foundational logic behind our new <a href=\"https:\/\/www.cycognito.com\/blog\/new-continuous-ai-pentesting\/\">Target Graph\u2122<\/a>, now used for the more complex task of delegating objectives to AI pentesting agents.<\/p>\n\n\n\n<p>Notice that the widget shows the reasoning and not just the score. That is the evolution of change-aware prioritization, and what AI opened up here, because change is dynamic and unpredictable, and interpreting it flexibly holds up where rigid scoring does not.<\/p>\n\n\n\n<p>Context is the mechanism that builds that trust, and it also moves a team off the handful of priority assets they picked themselves. What they get instead is an awareness of the underlying changes happening across the perimeter, and a better basis for allocating resources than any list drawn up in advance.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>5. Confirmed Remediation\u00a0<\/strong><\/h3>\n\n\n\n<p>Once risk is validated, the issue has to reach the right owner with enough evidence attached for them to act on it. But this is not where the job ends, since the one final change you need to observe is the moment that fix lands.<\/p>\n\n\n\n<p>The reason we watch for it is that roughly 25% of issues marked resolved still leave the underlying risk wide open. That is 1 in 4 tickets telling you a story that is not true.<\/p>\n\n\n\n<p>The fix may have been incomplete, applied in the wrong environment (staging instead of production), or closed out because the owner could not reproduce the issue on their own system.<\/p>\n\n\n\n<p>Of course, the reason doesn&#8217;t really matter. What matters is that a closed ticket with an unresolved issue creates a particularly dangerous gap, a ticking timebomb wrapped in a false sense of security.<\/p>\n\n\n\n<p>To avoid those, closing the loop means re-validating the issue and raising the red flag if it can still be reproduced.<\/p>\n\n\n\n<p>From a change management perspective, this means covering the whole process end to end, which starts with spotting the change and ends only once you have confirmed the fix actually held.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>TLDR; Build a Program Around Change Management<\/strong><\/h2>\n\n\n\n<p>If you stuck with me this far, or just skipped down to this section, here are the four questions worth asking about your current ASM solution, or your next one.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>What kinds of change do\u00a0 you see?<\/li>\n\n\n\n<li>How quickly do you see a change?<\/li>\n\n\n\n<li>What tells you which changes matter?<\/li>\n\n\n\n<li>What decides where deeper testing goes?<\/li>\n\n\n\n<li>How do you know a fix actually held?<\/li>\n<\/ul>\n\n\n\n<p>And let me close with some shameless self-promotion. At CyCognito we run that whole loop continuously (discovery, assessment, validation, prioritization and remediation) at a daily cadence, and at whatever scale you need it.<\/p>\n\n\n\n<p>We work with some of the world&#8217;s largest organizations, many of them holding millions of assets, keeping up with change in the most complex environments there are. If you&#8217;d like to see it run against your own surface, <a href=\"https:\/\/www.cycognito.com\/demo\/\">book a tech demo<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Attack surface management has served the vulnerability management program for years, and it now has a second job, governing the asset sprawl that AI makes sprawlier by the day.<\/p>\n","protected":false},"author":16,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-2850","post","type-post","status-publish","format-standard","hentry","category-perspectives"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.7 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>ASM Has a Silent C, and It Stands for Change Management | CyCognito Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.cycognito.com\/blog\/asm-has-a-silent-c-and-it-stands-for-change-management\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"ASM Has a Silent C, and It Stands for Change Management | CyCognito Blog\" \/>\n<meta property=\"og:description\" content=\"Attack surface management has served the vulnerability management program for years, and it now has a second job, governing the asset sprawl that AI makes sprawlier by the day.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.cycognito.com\/blog\/asm-has-a-silent-c-and-it-stands-for-change-management\/\" \/>\n<meta property=\"og:site_name\" content=\"CyCognito Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-30T09:46:54+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-30T10:03:07+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.cycognito.com\/blog\/wp-content\/uploads\/image-262.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1345\" \/>\n\t<meta property=\"og:image:height\" content=\"656\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Dima Potekhin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Dima Potekhin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.cycognito.com\/blog\/asm-has-a-silent-c-and-it-stands-for-change-management\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.cycognito.com\/blog\/asm-has-a-silent-c-and-it-stands-for-change-management\/\"},\"author\":{\"name\":\"Dima Potekhin\",\"@id\":\"https:\/\/www.cycognito.com\/blog\/#\/schema\/person\/16f807dc6fbdae9ce6a73a160267d550\"},\"headline\":\"ASM Has a Silent C, and It Stands for Change Management\",\"datePublished\":\"2026-08-30T09:46:54+00:00\",\"dateModified\":\"2026-08-30T10:03:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.cycognito.com\/blog\/asm-has-a-silent-c-and-it-stands-for-change-management\/\"},\"wordCount\":2012,\"publisher\":{\"@id\":\"https:\/\/www.cycognito.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.cycognito.com\/blog\/asm-has-a-silent-c-and-it-stands-for-change-management\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.cycognito.com\/blog\/wp-content\/uploads\/image-262-1280x624.png\",\"articleSection\":[\"Perspectives\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.cycognito.com\/blog\/asm-has-a-silent-c-and-it-stands-for-change-management\/\",\"url\":\"https:\/\/www.cycognito.com\/blog\/asm-has-a-silent-c-and-it-stands-for-change-management\/\",\"name\":\"ASM Has a Silent C, and It Stands for Change Management | CyCognito Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.cycognito.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.cycognito.com\/blog\/asm-has-a-silent-c-and-it-stands-for-change-management\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.cycognito.com\/blog\/asm-has-a-silent-c-and-it-stands-for-change-management\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.cycognito.com\/blog\/wp-content\/uploads\/image-262-1280x624.png\",\"datePublished\":\"2026-08-30T09:46:54+00:00\",\"dateModified\":\"2026-08-30T10:03:07+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.cycognito.com\/blog\/asm-has-a-silent-c-and-it-stands-for-change-management\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.cycognito.com\/blog\/asm-has-a-silent-c-and-it-stands-for-change-management\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.cycognito.com\/blog\/asm-has-a-silent-c-and-it-stands-for-change-management\/#primaryimage\",\"url\":\"https:\/\/www.cycognito.com\/blog\/wp-content\/uploads\/image-262.png\",\"contentUrl\":\"https:\/\/www.cycognito.com\/blog\/wp-content\/uploads\/image-262.png\",\"width\":1345,\"height\":656},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.cycognito.com\/blog\/asm-has-a-silent-c-and-it-stands-for-change-management\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.cycognito.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"ASM Has a Silent C, and It Stands for Change Management\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.cycognito.com\/blog\/#website\",\"url\":\"https:\/\/www.cycognito.com\/blog\/\",\"name\":\"Cycognito Blog\",\"description\":\"Research, Product News and Latest Updates\",\"publisher\":{\"@id\":\"https:\/\/www.cycognito.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.cycognito.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.cycognito.com\/blog\/#organization\",\"name\":\"Cycognito\",\"url\":\"https:\/\/www.cycognito.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.cycognito.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.cycognito.com\/blog\/wp-content\/uploads\/logo-1720x550-1.png\",\"contentUrl\":\"https:\/\/www.cycognito.com\/blog\/wp-content\/uploads\/logo-1720x550-1.png\",\"width\":1720,\"height\":550,\"caption\":\"Cycognito\"},\"image\":{\"@id\":\"https:\/\/www.cycognito.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.cycognito.com\/blog\/#\/schema\/person\/16f807dc6fbdae9ce6a73a160267d550\",\"name\":\"Dima Potekhin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.cycognito.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/c2f15d6780fd8a5dba15935bf013363b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/c2f15d6780fd8a5dba15935bf013363b?s=96&d=mm&r=g\",\"caption\":\"Dima Potekhin\"},\"description\":\"CTO and Co-Founder\",\"url\":\"https:\/\/www.cycognito.com\/blog\/author\/dima-potekhin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"ASM Has a Silent C, and It Stands for Change Management | CyCognito Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.cycognito.com\/blog\/asm-has-a-silent-c-and-it-stands-for-change-management\/","og_locale":"en_US","og_type":"article","og_title":"ASM Has a Silent C, and It Stands for Change Management | CyCognito Blog","og_description":"Attack surface management has served the vulnerability management program for years, and it now has a second job, governing the asset sprawl that AI makes sprawlier by the day.","og_url":"https:\/\/www.cycognito.com\/blog\/asm-has-a-silent-c-and-it-stands-for-change-management\/","og_site_name":"CyCognito Blog","article_published_time":"2026-08-30T09:46:54+00:00","article_modified_time":"2026-08-30T10:03:07+00:00","og_image":[{"width":1345,"height":656,"url":"https:\/\/www.cycognito.com\/blog\/wp-content\/uploads\/image-262.png","type":"image\/png"}],"author":"Dima Potekhin","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Dima Potekhin","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.cycognito.com\/blog\/asm-has-a-silent-c-and-it-stands-for-change-management\/#article","isPartOf":{"@id":"https:\/\/www.cycognito.com\/blog\/asm-has-a-silent-c-and-it-stands-for-change-management\/"},"author":{"name":"Dima Potekhin","@id":"https:\/\/www.cycognito.com\/blog\/#\/schema\/person\/16f807dc6fbdae9ce6a73a160267d550"},"headline":"ASM Has a Silent C, and It Stands for Change Management","datePublished":"2026-08-30T09:46:54+00:00","dateModified":"2026-08-30T10:03:07+00:00","mainEntityOfPage":{"@id":"https:\/\/www.cycognito.com\/blog\/asm-has-a-silent-c-and-it-stands-for-change-management\/"},"wordCount":2012,"publisher":{"@id":"https:\/\/www.cycognito.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.cycognito.com\/blog\/asm-has-a-silent-c-and-it-stands-for-change-management\/#primaryimage"},"thumbnailUrl":"https:\/\/www.cycognito.com\/blog\/wp-content\/uploads\/image-262-1280x624.png","articleSection":["Perspectives"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.cycognito.com\/blog\/asm-has-a-silent-c-and-it-stands-for-change-management\/","url":"https:\/\/www.cycognito.com\/blog\/asm-has-a-silent-c-and-it-stands-for-change-management\/","name":"ASM Has a Silent C, and It Stands for Change Management | CyCognito Blog","isPartOf":{"@id":"https:\/\/www.cycognito.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.cycognito.com\/blog\/asm-has-a-silent-c-and-it-stands-for-change-management\/#primaryimage"},"image":{"@id":"https:\/\/www.cycognito.com\/blog\/asm-has-a-silent-c-and-it-stands-for-change-management\/#primaryimage"},"thumbnailUrl":"https:\/\/www.cycognito.com\/blog\/wp-content\/uploads\/image-262-1280x624.png","datePublished":"2026-08-30T09:46:54+00:00","dateModified":"2026-08-30T10:03:07+00:00","breadcrumb":{"@id":"https:\/\/www.cycognito.com\/blog\/asm-has-a-silent-c-and-it-stands-for-change-management\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.cycognito.com\/blog\/asm-has-a-silent-c-and-it-stands-for-change-management\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.cycognito.com\/blog\/asm-has-a-silent-c-and-it-stands-for-change-management\/#primaryimage","url":"https:\/\/www.cycognito.com\/blog\/wp-content\/uploads\/image-262.png","contentUrl":"https:\/\/www.cycognito.com\/blog\/wp-content\/uploads\/image-262.png","width":1345,"height":656},{"@type":"BreadcrumbList","@id":"https:\/\/www.cycognito.com\/blog\/asm-has-a-silent-c-and-it-stands-for-change-management\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.cycognito.com\/blog\/"},{"@type":"ListItem","position":2,"name":"ASM Has a Silent C, and It Stands for Change Management"}]},{"@type":"WebSite","@id":"https:\/\/www.cycognito.com\/blog\/#website","url":"https:\/\/www.cycognito.com\/blog\/","name":"Cycognito Blog","description":"Research, Product News and Latest Updates","publisher":{"@id":"https:\/\/www.cycognito.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.cycognito.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.cycognito.com\/blog\/#organization","name":"Cycognito","url":"https:\/\/www.cycognito.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.cycognito.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.cycognito.com\/blog\/wp-content\/uploads\/logo-1720x550-1.png","contentUrl":"https:\/\/www.cycognito.com\/blog\/wp-content\/uploads\/logo-1720x550-1.png","width":1720,"height":550,"caption":"Cycognito"},"image":{"@id":"https:\/\/www.cycognito.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.cycognito.com\/blog\/#\/schema\/person\/16f807dc6fbdae9ce6a73a160267d550","name":"Dima Potekhin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.cycognito.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/c2f15d6780fd8a5dba15935bf013363b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c2f15d6780fd8a5dba15935bf013363b?s=96&d=mm&r=g","caption":"Dima Potekhin"},"description":"CTO and Co-Founder","url":"https:\/\/www.cycognito.com\/blog\/author\/dima-potekhin\/"}]}},"_links":{"self":[{"href":"https:\/\/www.cycognito.com\/blog\/wp-json\/wp\/v2\/posts\/2850","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.cycognito.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.cycognito.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.cycognito.com\/blog\/wp-json\/wp\/v2\/users\/16"}],"replies":[{"embeddable":true,"href":"https:\/\/www.cycognito.com\/blog\/wp-json\/wp\/v2\/comments?post=2850"}],"version-history":[{"count":7,"href":"https:\/\/www.cycognito.com\/blog\/wp-json\/wp\/v2\/posts\/2850\/revisions"}],"predecessor-version":[{"id":2861,"href":"https:\/\/www.cycognito.com\/blog\/wp-json\/wp\/v2\/posts\/2850\/revisions\/2861"}],"wp:attachment":[{"href":"https:\/\/www.cycognito.com\/blog\/wp-json\/wp\/v2\/media?parent=2850"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.cycognito.com\/blog\/wp-json\/wp\/v2\/categories?post=2850"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.cycognito.com\/blog\/wp-json\/wp\/v2\/tags?post=2850"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}