<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/">
	<channel>
		<title>Cybersecurity Insights, Trends &amp; Best Practices | Infinum</title>
		<atom:link href="https://infinum.com/blog/category/cybersecurity/feed/" rel="self" type="application/rss+xml" />
		<link>https://infinum.com/blog/category/cybersecurity/</link>
		<description>Building digital products</description>
		<lastBuildDate>Fri, 24 Apr 2026 14:02:14 +0000</lastBuildDate>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>

					<item>
				<image>
					<url>19278787https://infinum.com/uploads/2026/04/img-anthropic-mythos-breach.webp</url>
				</image>
				<title>The Most Dangerous AI Tool Got Breached. What is an Adequate Disclosure Strategy?</title>
				<link>https://infinum.com/blog/anthropic-mythos-breach/</link>
				<pubDate>Fri, 24 Apr 2026 10:53:21 +0000</pubDate>
				<dc:creator>Blanka Bogdanović</dc:creator>
				<guid isPermaLink="false">https://infinum.com/?p=19278787</guid>
				<description>
					<![CDATA[<p>Anthropic's handling of the Mythos breach is a useful case study of where disclosure practices for security breaches still need to catch up.</p>
<p>The post <a href="https://infinum.com/blog/anthropic-mythos-breach/">The Most Dangerous AI Tool Got Breached. What is an Adequate Disclosure Strategy?</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[

<div
	class="wrapper"
	data-id="es-131"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-92">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-95"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-93">
	<p	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-94'
	>
	<strong>When an AI model capable of finding zero-day vulnerabilities at machine speed gets accessed without authorization, the incident response has to match the threat profile. Anthropic&#8217;s handling of the Mythos breach is a useful case study of where disclosure practices for security breaches still need to catch up.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-98"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-96">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-97'
	>
	Anthropic built Claude Mythos Preview as something it explicitly said the world wasn&#8217;t ready for.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-101"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-99">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-100'
	>
	The model finds zero-day vulnerabilities at machine speed, demonstrated the ability to escape its own sandbox, and in at least one test, posted details of its own exploit to public websites without being asked.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-104"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-102">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-103'
	>
	We’ve already covered how Anthropic&#8217;s response was to keep it locked behind <a href="https://infinum.com/blog/anthropic-project-glasswing/">Project Glasswing</a> – a tightly controlled initiative limited to a handful of vetted partners: AWS, Microsoft, Cisco, major banks, and critical infrastructure operators.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-107"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-105">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-106'
	>
	But exactly that is what makes what happened instructive.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-110"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-108">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-109'
	>
	Reports emerged this week that an unauthorized group accessed Mythos Preview through a third-party vendor environment connected to the rollout.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-113"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-111">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-112'
	>
	The group – part of a private Discord community that tracks unreleased AI models gained access on the same day Anthropic announced the model.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-115"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-114'
	>
	<strong>They didn&#8217;t break into Anthropic directly. They pieced together naming conventions exposed in a prior breach at an AI contractor, guessed the model&#8217;s URL, and used credentials from a third-party vendor that were still active. Three low-sophistication steps that together were enough.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-118"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-116">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-117'
	>
	This mechanism of access is worth sitting with.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-121"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-119">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-120'
	>
	<a href="https://infinum.com/blog/software-supply-chain-security/">Supply chain security</a> is no longer a background concern for procurement teams. It is a front-line risk for anyone deploying AI in environments that touch source code, internal systems, or critical infrastructure.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-123"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-122'
	>
	<strong>The question to ask is not just whether your AI provider is secure. It is whether every vendor, contractor, and subprocessor in the deployment chain is held to the same standard – because attackers will find the weakest link, and in an AI deployment, the weakest link may not be the model itself.</strong><br></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-129"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<a	class="card-simple js-card-simple card-simple--is-ad block-card__card-simple card-simple--has-link js-card-simple-link card-simple__content-align--left"
	data-id="es-124"
	 href='https://infinum.com/cybersecurity/#form'>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
					</div>

		<p	class='typography typography--size-24-text js-typography card-simple__paragraph'
	data-id='es-125'
	 id='es-124-paragraph'>
	Want to learn more about supply chain security? Talk to our certified experts who can help you protect your organization from attacks and regulatory consequences.</p><button	class="btn btn--color-infinum btn--size-small btn--width-default btn__icon-position--right card-simple__btn js-block-card-btn js-card-simple-link"
	data-id="es-126"
	 tabindex='-1'>
		<div class="btn__inner">
					<div	class='typography typography--size-none js-typography btn__label'
	data-id='es-127'
	>
	<strong><strong>Contact us</strong></strong></div>		
		<i
	class="icon btn__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='arrow-right-16' data-id='es-128'>
	<svg fill='none' height='16' viewBox='0 0 17 16' width='17' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'><g stroke='currentColor' stroke-width='2'><path d='m.5 7.99999 14 .00001'/><path d='m9.23352 2.7251 5.97848 5.97852'/><path d='m9.23352 13.2744 5.97848-5.9785'/></g></svg></i>	</div>
	</button>	</div>
</a>	</div>
</div>
</div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-215"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-132">
	

</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-135"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-133">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-134'
	>
	<strong>The disclosure question</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-138"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-136">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-137'
	>
	Anthropic <em>has</em> confirmed the reports and said its investigation is ongoing. It has found no evidence of impact on its core systems, and activity appears limited to the vendor environment. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-141"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-139">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-140'
	>
	But the scope, duration, and what was done with the model <em>the world wasn&#8217;t ready for</em> during that access remain unconfirmed.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-143"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-142'
	>
	The disclosure question is where the situation gets more complex – and where there are useful lessons for any organisation deploying advanced AI.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-146"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-144">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-145'
	>
	Anthropic is a private company.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-149"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-147">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-148'
	>
	The SEC&#8217;s four-business-day disclosure rule for material cybersecurity incidents applies to public companies – Anthropic doesn&#8217;t qualify. CIRCIA&#8217;s 72-hour critical infrastructure reporting framework is still being phased in and may not apply here.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-152"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-150">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-151'
	>
	The EU AI Act does apply to Anthropic – Claude is available in the EU, and the Act has extraterritorial reach – and for a model with Mythos&#8217;s capabilities, incident reporting obligations to the EU AI Office are likely already active. But the Commission&#8217;s enforcement powers over GPAI providers don&#8217;t arrive until August 2026.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-154"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-153'
	>
	<strong>All in all, from a strict legal standpoint, Anthropic is operating in a grey zone where disclosure is largely voluntary. But the regulatory question is, in some ways, the wrong one. The more useful question is: what does good practice look like, and what can other organisations learn from this?</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-157"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-155">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-156'
	>
	<strong>What best practice actually requires</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-160"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-158">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-159'
	>
	Every major cybersecurity framework – NIST, ISO 27001, SANS – is unambiguous on this point: notify early, disclose what you know, and update as the picture becomes clearer.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-162"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-161'
	>
	<strong>The reasoning is practical. Affected parties cannot protect themselves from information they don&#8217;t have. The standard is not to wait for a complete picture before saying anything. The standard is to say something immediately and complete the picture as you go.&nbsp;</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-165"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-163">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-164'
	>
	Waiting for certainty before notifying is how contained incidents become larger ones.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-167"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-166'
	>
	<strong>The specific challenge here – and it is a genuine one – is that Anthropic had publicly framed Mythos as a tool requiring exceptional access controls because of its offensive potential. That framing raises the stakes for disclosure in both directions.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-170"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-168">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-169'
	>
	On one hand, it makes the case for fast, proactive communication stronger: if partners have been told they are working with something uniquely sensitive, they need to know quickly when something goes wrong.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-173"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-171">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-172'
	>
	On the other hand, it makes the cost of a premature or inaccurate disclosure higher – a false alarm about a tool of this profile carries its own reputational and operational risk.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-176"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-174">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-175'
	>
	That tension is real, and it is not unique to Anthropic. Any organisation deploying advanced AI in sensitive environments will face it.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-179"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-177">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-178'
	>
	There&#8217;s also the partner angle.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-181"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-180'
	>
	<strong>The Project Glasswing members – major banks, critical infrastructure operators, technology companies – all have their own incident response programmes and regulatory obligations. They can&#8217;t act on information they don&#8217;t have.&nbsp;</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-184"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-182">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-183'
	>
	Every hour of delay is an hour those teams aren&#8217;t assessing whether their own environments were touched.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-187"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-185">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-186'
	>
	Anthropic has not publicly confirmed whether partners were notified directly ahead of or separately from its public statement – and given the two-week gap between access and disclosure, that is a question worth asking.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-190"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-188">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-189'
	>
	<strong>The broader lesson</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-193"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-191">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-192'
	>
	The weakest link in the Mythos breach wasn&#8217;t Anthropic&#8217;s core infrastructure. It was a contractor&#8217;s credentials and a predictable URL. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-196"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-194">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-195'
	>
	That is a supply chain governance failure, and it is one that most organisations haven&#8217;t fully accounted for in their vendor contracts, partner agreements, or incident response plans.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-199"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-197">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-198'
	>
	This incident is a useful prompt to ask some basic questions: </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-202"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-200">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-201'
	>
	<li><strong>Do your vendor contracts require notification within a defined timeframe? </strong></li><li><strong>Do your partners know they will be told directly, not via a press report? </strong></li><li><strong>Is your incident response plan built around the sensitivity of the AI tools involved, or around more generic breach protocols?</strong></li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-205"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-203">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-204'
	>
	The regulatory framework for advanced AI incidents is still being built.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-207"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-206'
	>
	<strong>The EU AI Act&#8217;s enforcement powers are arriving in phases. CIRCIA is still being implemented. That grey zone will not last indefinitely – but in the meantime, the organisations that build trust are the ones that move faster than the rules require, not slower.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-210"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-208">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-209'
	>
	The gap between what the law currently demands and what good practice looks like is the space where reputations are made or lost. For companies working with the most capable AI tools available, that gap is worth closing proactively.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-213"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-211">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-212'
	>
	<em>Supply chain security is complex. Our certified experts can help you assess your exposure and stay ahead of the regulatory and operational risks that come with AI deployment. </em><a href="https://infinum.com/cybersecurity/#form" target="_blank" rel="noreferrer noopener"><em>Let’s chat.</em></a></p></div>	</div>
</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/anthropic-mythos-breach/">The Most Dangerous AI Tool Got Breached. What is an Adequate Disclosure Strategy?</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
					<item>
				<image>
					<url>19278577https://infinum.com/uploads/2026/04/img-hero-glasswing.webp</url>
				</image>
				<title>Project Glasswing Proves Frontier AI Can Break – and Fix – Software</title>
				<link>https://infinum.com/blog/anthropic-project-glasswing/</link>
				<pubDate>Fri, 17 Apr 2026 13:12:58 +0000</pubDate>
				<dc:creator>Blanka Bogdanović</dc:creator>
				<guid isPermaLink="false">https://infinum.com/?p=19278577</guid>
				<description>
					<![CDATA[<p>Anthropic's Project Glasswing signals a new era where frontier AI hunts vulnerabilities at scale. Here's what security teams need to understand – and do – right now. </p>
<p>The post <a href="https://infinum.com/blog/anthropic-project-glasswing/">Project Glasswing Proves Frontier AI Can Break – and Fix – Software</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[<div
	class="wrapper"
	data-id="es-448"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-216">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-219"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-217">
	<p	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-218'
	>
	<strong>Anthropic just launched Project Glasswing – a major initiative to hunt vulnerabilities in critical open-source software using its most capable AI model. The implications for defenders and attackers alike are significant, and most organisations are not ready for either.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-222"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-220">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-221'
	>
	On 7 April 2026, Anthropic launched <a href="https://www.anthropic.com/glasswing" target="_blank" rel="noreferrer noopener">Project Glasswing</a> – a coordinated effort to give key technology providers early access to Claude Mythos Preview with one goal: find and fix long-hidden vulnerabilities in critical open-source software before attackers do.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-225"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-223">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-224'
	>
	It is the clearest signal yet that frontier AI has crossed a threshold. It is no longer just a productivity tool bolted onto existing security workflows. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-227"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-226'
	>
	It is becoming an active participant in the vulnerability lifecycle, capable of reasoning across vast codebases, identifying subtle logic flaws, and chaining issues into exploitable paths that would take a human researcher weeks to uncover.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-230"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-228">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-229'
	>
	That is worth taking seriously. Not because of the marketing, but because credible institutions are paying attention. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-233"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-231">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-232'
	>
	The AI Security Institute and the UK National Cyber Security Centre have both<a href="https://www.aisi.gov.uk/research/measuring-ai-agents-progress-on-multi-step-cyber-attack-scenarios"> documented measurable progress</a> in AI agents completing multi-step cyber attack scenarios. The NCSC has<a href="https://www.ncsc.gov.uk/blogs/why-cyber-defenders-need-to-be-ready-for-frontier-ai"> called on defenders to prepare</a> for a world in which frontier AI amplifies attacker capabilities at pace.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-236"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-234">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-235'
	>
	Glasswing is a concrete attempt to tilt that balance back toward defence. The early findings suggest it is working.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-239"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-237">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-238'
	>
	<strong>The two-sided ledger of AI-assisted security</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-242"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-240">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-241'
	>
	For most of computing history, finding and <a href="https://infinum.com/third-party-cyber-risk-management/" id="https://infinum.com/third-party-cyber-risk-management/">exploiting software vulnerabilities</a> required rare expertise. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-245"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-243">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-244'
	>
	The people who could do it reliably numbered in the thousands globally. That constraint mattered – it was a practical limit on how fast attackers could operate and how broadly they could target. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-248"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-246">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-247'
	>
	Over the past year, that constraint has eroded sharply.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-251"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-249">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-250'
	>
	AI models have become increasingly effective at reading and reasoning about code, showing a particular ability to spot vulnerabilities and work out how to exploit them. The cost, effort, and level of expertise required have all dropped dramatically.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-253"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-252'
	>
	<strong>Here is the uncomfortable truth: the same capabilities that make a frontier model useful for vulnerability discovery make it useful for exploitation.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-256"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-254">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-255'
	>
	Claude Mythos Preview, Anthropic&#8217;s unreleased frontier model behind Glasswing, has reached a level of coding capability where it can <strong>surpass all but the most skilled humans</strong> at finding and exploiting software vulnerabilities. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-259"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-257">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-258'
	>
	That is not a marketing claim – it is the assessment Anthropic has published alongside the initiative. The AISI&#8217;s<a href="https://www.aisi.gov.uk/blog/our-evaluation-of-claude-mythos-previews-cyber-capabilities" target="_blank" rel="noreferrer noopener"> evaluation of Claude Mythos Preview&#8217;s cyber capabilities</a> tracks the same capability curve and reaches similar conclusions.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-262"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-260">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-261'
	>
	And it is not only expert hands that can wield it. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-264"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-263'
	>
	Anthropic&#8217;s own Red Team blog reports that engineers with no formal security training asked Mythos Preview to find remote code execution vulnerabilities overnight, and woke up the following morning to a complete, working exploit.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-267"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-265">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-266'
	>
	An AI that can read a codebase, reason about execution paths, and identify edge cases in authentication logic can do that work for a defender running a bug bounty programme or for an attacker building an exploit chain. <strong>The model does not care which side of the firewall it is on. </strong>And given the rate of AI progress, these capabilities will not remain confined to actors committed to deploying them safely.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-270"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-268">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-269'
	>
	The question for security teams is not whether to engage with this shift. It is – how fast.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-273"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-271">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-272'
	>
	<strong>What Glasswing tells us about where this is heading</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-276"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-274">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-275'
	>
	Anthropic&#8217;s approach with Glasswing is instructive beyond the specific initiative. A few things stand out.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-279"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-277">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-278'
	>
	<strong>The focus on open-source infrastructure is deliberate</strong></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-282"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-280">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-281'
	>
	Open-source software underpins almost every critical system in operation today – cloud platforms, financial infrastructure, healthcare systems, industrial controls. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-285"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-283">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-284'
	>
	Vulnerabilities in widely used libraries do not stay contained. When one surfaces, the blast radius is enormous and the window between disclosure and exploitation has compressed to hours in many cases. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-288"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-286">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-287'
	>
	The <a href="https://infinum.com/blog/axios-npm-supply-chain-attack/" target="_blank" rel="noreferrer noopener">Axios npm supply chain attack in March 2026</a> – where two malicious versions of one of JavaScript&#8217;s most-used libraries were quietly published – is a recent example of exactly how fast that window closes.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-291"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-289">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-290'
	>
	<strong>The results are concrete </strong></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-294"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-292">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-293'
	>
	Mythos Preview has already found <strong>thousands of zero-day vulnerabilities</strong> –  flaws previously unknown even to the software&#8217;s own developers – including some in <strong>every major operating system and web browser</strong>. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-297"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-295">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-296'
	>
	Some of the specific findings illustrate just how significant the capability leap is:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-300"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-298">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-299'
	>
	<li><strong>A 27-year-old vulnerability in OpenBSD</strong> – one of the most security-hardened operating systems in the world, widely used to run firewalls and critical infrastructure – that allowed an attacker to remotely crash any machine running the OS simply by connecting to it.</li><li><strong>A 16-year-old vulnerability in FFmpeg</strong>, the video encoding library used by an enormous range of software, in a line of code that automated testing tools had hit five million times without catching the problem.</li><li><strong>A chain of vulnerabilities in the Linux kernel</strong> – the software running most of the world&#8217;s servers – that the model found and linked autonomously to escalate from ordinary user access to full control of the machine.</li><li>A web browser exploit that <strong>chained together four separate vulnerabilities,</strong> writing a complex attack that escaped both the browser&#8217;s renderer sandbox and the operating system sandbox beneath it.</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-303"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-301">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-302'
	>
	The gap between Mythos Preview and the previous generation of models is also stark. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-306"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-304">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-305'
	>
	When tested against known vulnerabilities in Mozilla&#8217;s Firefox JavaScript engine, the previous best model – Claude Opus 4.6 – turned those vulnerabilities into working exploits <strong>twice</strong> out of several hundred attempts. <strong>Mythos Preview did it 181 times.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-309"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-307">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-308'
	>
	These are not theoretical weaknesses. They are exploitable flaws that survived decades of human review and millions of automated tests. The model found them.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-312"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-310">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-311'
	>
	<strong>The initiative is coordinated by design </strong></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-315"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-313">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-314'
	>
	Early access, structured disclosure, defined scope – Glasswing is built to funnel findings into responsible remediation rather than onto a paste site.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-317"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<div	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-316'
	>
	<strong>Anthropic&#8217;s position is that the same capabilities that make AI dangerous in the wrong hands make it invaluable for finding and fixing flaws in critical software, and for producing new software with fewer security bugs from the start.&nbsp;</strong></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-320"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-318">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-319'
	>
	That framing is worth taking at face value, because the alternative – waiting for these capabilities to proliferate without a coordinated defensive response – is considerably worse.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-323"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-321">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-322'
	>
	For organisations watching from the outside, the implication is direct: if a frontier model can find vulnerabilities in your dependencies that survived decades of human review and millions of automated tests, you cannot rely on existing scanning and review processes to give you confidence that your attack surface is clean.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-326"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-324">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-325'
	>
	<strong>The attacker&#8217;s advantage – and how to close it</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-329"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-327">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-328'
	>
	Defenders have always operated at a structural disadvantage. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-331"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-330'
	>
	An attacker needs to find one way in. A defender needs to close every path. AI widens that gap if defenders do not move.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-334"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-332">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-333'
	>
	The realistic near-term threat is not yet a fully autonomous AI attacker operating without human direction. But it is human attackers using AI to operate faster, at a greater scale, and with less specialised knowledge than was previously required. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-337"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-335">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-336'
	>
	A moderately skilled attacker with access to a capable model can accelerate reconnaissance, generate targeted phishing content, identify patch-gap windows, and synthesise public vulnerability research into working attack chains. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-342"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="blockquote block-blockquote__blockquote" data-id="es-338">
	
	<div class="blockquote__content">
		<i
	class="icon blockquote__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='blockquote-24' data-id='es-339'>
	<svg fill='none' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path clip-rule='evenodd' d='m12 24c6.6274 0 12-5.3726 12-12 0-2.79685-.9568-5.37021-2.561-7.41062-.581.22951-1.0832.60583-1.5069 1.12898-.5132.60844-.7698 1.41969-.7698 2.43375v.07605h2.5789v5.59004h-5.6197v-5.01962c0-1.11547.154-2.06616.4619-2.85205.3336-.81125.757-1.48307 1.2702-2.01545.528-.52161 1.1175-.92155 1.7687-1.1998-2.0728-1.70651-4.7279-2.73128-7.6223-2.73128-6.62742 0-12 5.37258-12 12 0 6.6274 5.37258 12 12 12zm-3.53811-18.05347c-.30793.78589-.46189 1.73658-.46189 2.85205v5.01962h5.6197v-5.59004h-2.5789v-.07605c0-1.01406.2566-1.82531.7698-2.43375.5389-.63379 1.1804-1.05209 1.9245-1.2549v-2.28164c-.7441.07605-1.4626.25351-2.1555.53238-.6928.27887-1.3086.68449-1.84752 1.21688-.51321.53238-.9366 1.2042-1.27019 2.01545z' fill='currentColor' fill-rule='evenodd'/></svg></i><p	class='typography typography--size-36-text js-typography blockquote__quote'
	data-id='es-340'
	>
	Attacks that previously required specialist knowledge are now within reach of far more people.</p>
		<div class="blockquote__caption-wrap">
			<div	class='typography typography--size-12-text-roman js-typography blockquote__caption'
	data-id='es-341'
	>
	SEAN MCCARTHY, HEAD OF CYBERSECURITY TESTING, AMR CYBERSECURITY &#8211; PART OF INFINUM</div>		</div>
	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-345"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-343">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-344'
	>
	We explored a version of this problem in our <a href="https://infinum.com/blog/security-gaps-in-vibe-coded-applications/" target="_blank" rel="noreferrer noopener">analysis of security gaps in vibe-coded applications</a>. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-348"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-346">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-347'
	>
	AI-generated code introduces vulnerabilities not because the model is careless but because it optimises for functional correctness, not security depth. An attacker using the same models to probe those applications has a natural advantage over a developer who did not think adversarially when prompting.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-351"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-349">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-350'
	>
	<strong>The answer is not to avoid AI in development. </strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-354"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-352">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-353'
	>
	It is to apply <a href="https://infinum.com/blog/ssdlc-application-security/" target="_blank" rel="noreferrer noopener">deliberate security discipline at every stage</a> – including to the AI-generated output itself. That means combining automated scanning with <a href="https://infinum.com/cybersecurity/penetration-testing/" target="_blank" rel="noreferrer noopener">human-led testing</a> rather than assuming one replaces the other.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-357"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-355">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-356'
	>
	<strong>What organisations should do before the surge hits</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-360"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-358">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-359'
	>
	Glasswing is likely to accelerate vulnerability disclosures across the open-source ecosystem. Organisations that are unprepared for a sudden increase in security advisories affecting their dependencies will struggle to respond at pace.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-363"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-361">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-362'
	>
	<strong>Martin Walsham, Director of Cybersecurity at AMR Cybersecurity</strong> <strong>– Part of Infinum</strong>, has been tracking this shift closely: &#8220;Frontier AI models are progressing at pace, and the same technologies that defenders can use to increase overall security posture can equally be used by attackers to amplify their capabilities. This heightens the need for organisations to implement strong security baselines, defence in depth, and robust secure code, and to patch at pace to make them less susceptible to attacks.”</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-368"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="blockquote block-blockquote__blockquote" data-id="es-364">
	
	<div class="blockquote__content">
		<i
	class="icon blockquote__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='blockquote-24' data-id='es-365'>
	<svg fill='none' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path clip-rule='evenodd' d='m12 24c6.6274 0 12-5.3726 12-12 0-2.79685-.9568-5.37021-2.561-7.41062-.581.22951-1.0832.60583-1.5069 1.12898-.5132.60844-.7698 1.41969-.7698 2.43375v.07605h2.5789v5.59004h-5.6197v-5.01962c0-1.11547.154-2.06616.4619-2.85205.3336-.81125.757-1.48307 1.2702-2.01545.528-.52161 1.1175-.92155 1.7687-1.1998-2.0728-1.70651-4.7279-2.73128-7.6223-2.73128-6.62742 0-12 5.37258-12 12 0 6.6274 5.37258 12 12 12zm-3.53811-18.05347c-.30793.78589-.46189 1.73658-.46189 2.85205v5.01962h5.6197v-5.59004h-2.5789v-.07605c0-1.01406.2566-1.82531.7698-2.43375.5389-.63379 1.1804-1.05209 1.9245-1.2549v-2.28164c-.7441.07605-1.4626.25351-2.1555.53238-.6928.27887-1.3086.68449-1.84752 1.21688-.51321.53238-.9366 1.2042-1.27019 2.01545z' fill='currentColor' fill-rule='evenodd'/></svg></i><p	class='typography typography--size-36-text js-typography blockquote__quote'
	data-id='es-366'
	>
	<strong>Ahead of an anticipated surge in vulnerability reporting, organisations should be assessing and investing in advanced tooling and enhanced services to continually protect, detect, and respond to cyber threats – because the pace at which attackers operate will only increase.</strong></p>
		<div class="blockquote__caption-wrap">
			<div	class='typography typography--size-12-text-roman js-typography blockquote__caption'
	data-id='es-367'
	>
	MARTIN WALSHAM, DIRECTOR OF CYBERSECURITY, AMR CYBERSECURITY &#8211; PART OF INFINUM. </div>		</div>
	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-371"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-369">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-370'
	>
	The precautionary steps below are not dramatic departures from good security hygiene. They are the foundations that make rapid response possible when it is needed.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-374"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-372">
	<h3	class='typography typography--size-24-text js-typography block-typography__typography'
	data-id='es-373'
	>
	<strong>Review and test your incident response plan now.&nbsp;</strong></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-377"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-375">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-376'
	>
	Not the version that was written two years ago and has not been touched since. Run a tabletop exercise against a realistic scenario – a critical CVE in a dependency you cannot patch immediately, combined with active exploitation attempts.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-380"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-378">
	<h3	class='typography typography--size-24-text js-typography block-typography__typography'
	data-id='es-379'
	>
	<strong>Prepare for increased advisory volume.&nbsp;</strong></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-383"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-381">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-382'
	>
	If AI-assisted vulnerability research delivers on its promise, the rate of disclosures in widely used open-source libraries will increase. Security and engineering teams need the capacity to triage and prioritise that volume without dropping everything else. Build that capacity before the surge, not during it.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-386"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-384">
	<h3	class='typography typography--size-24-text js-typography block-typography__typography'
	data-id='es-385'
	>
	<strong>Get your asset management list accurate.&nbsp;</strong></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-389"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-387">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-388'
	>
	You cannot patch what you do not know you are running. This is the most consistent gap we see in organisations that have otherwise mature security programmes. A dependency buried four levels deep in your supply chain is still your problem when a CVE drops against it. Our <a href="https://infinum.com/blog/software-supply-chain-security/" id="https://infinum.com/blog/software-supply-chain-security/" target="_blank" rel="noreferrer noopener">step-by-step software supply chain security framework</a> covers how to map and manage that exposure systematically.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-392"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-390">
	<h3	class='typography typography--size-24-text js-typography block-typography__typography'
	data-id='es-391'
	>
	<strong>Monitor updates and advisories actively.&nbsp;</strong></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-395"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-393">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-394'
	>
	Subscribe to feeds for the libraries and platforms you depend on. Automated dependency scanning tools have improved significantly – if you are not running one, start.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-398"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-396">
	<h3	class='typography typography--size-24-text js-typography block-typography__typography'
	data-id='es-397'
	>
	<strong>Review third-party agreements with critical suppliers.&nbsp;</strong></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-401"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-399">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-400'
	>
	If a vulnerability surfaces in a service you depend on and your contract does not specify patching SLAs, you have no lever to apply. Review those agreements and open conversations with suppliers about their response posture before you need to have that conversation under pressure.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-404"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-402">
	<h3	class='typography typography--size-24-text js-typography block-typography__typography'
	data-id='es-403'
	>
	<strong>Test your external perimeter.&nbsp;</strong></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-407"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-405">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-406'
	>
	If your last penetration test was more than twelve months ago, you do not have an accurate picture of your exposure. This is especially true for organisations that have made infrastructure changes, onboarded new services, or shipped significant product updates since the last test.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-410"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-408">
	<h3	class='typography typography--size-24-text js-typography block-typography__typography'
	data-id='es-409'
	>
	<strong>Have a plan for enhanced monitoring at short notice.&nbsp;</strong></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-413"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-411">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-412'
	>
	Not all threats give you advance warning. Know what elevated monitoring looks like for your environment and how quickly you can activate it.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-416"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-414">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-415'
	>
	<strong>Security baselines matter more, not less</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-419"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-417">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-418'
	>
	There is a temptation to frame AI-powered threats as something categorically new that requires a categorically new response.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-422"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-420">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-421'
	>
	In some respects, that is true – the <strong>speed and scale</strong> at which AI-assisted attacks can operate does change the calculus. But the vulnerabilities being exploited are mostly the same ones that have always existed: missing input validation, broken access control, insecure defaults, and unpatched dependencies. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-425"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-423">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-424'
	>
	Our <a href="https://infinum.com/blog/cybersecurity-trends-2026/" target="_blank" rel="noreferrer noopener">cybersecurity trends outlook for 2026</a> covers how AI-driven attacks, stricter compliance requirements, and supply chain exposure are converging into a single pressure point for security teams.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-428"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-426">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-427'
	>
	The <a href="https://infinum.com/blog/eu-cybersecurity-legislation-nis2-dora/" target="_blank" rel="noreferrer noopener">NIS2 and DORA frameworks</a> that came into force across the EU reflect this same reality. The technical requirements they mandate – multi-factor authentication, incident reporting, supply chain risk management, regular penetration testing – are not responses to AI-powered threats specifically. They are the baseline hygiene that makes an organisation resilient regardless of what the attacker is using. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-431"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-429">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-430'
	>
	If your organisation is not meeting that baseline, the sophistication of the threat is almost beside the point.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-434"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-432">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-433'
	>
	<strong>Strong foundations beat reactive firefighting</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-437"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-435">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-436'
	>
	Project Glasswing is a meaningful development in the responsible use of frontier AI for defence. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-440"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-438">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-439'
	>
	The AISI and NCSC assessments confirm what security practitioners have been observing in practice: <strong>capability is advancing faster than most organisations have adjusted for.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-443"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-441">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-442'
	>
	The right response is not to wait and see how the landscape settles. It is to invest in the defences that reduce exposure across the board – sound architecture, secure development practices, regular testing, and the operational readiness to respond when something goes wrong.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-446"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-444">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-445'
	>
	<em>Infinum&#8217;s <a href="https://infinum.com/cybersecurity/penetration-testing/" target="_blank" rel="noreferrer noopener">penetration testing</a> and <a href="https://infinum.com/cybersecurity/" target="_blank" rel="noreferrer noopener">cybersecurity services</a> are built around exactly that kind of proactive posture. If you want to understand your current exposure before the next wave of disclosures hits, talk to our security team.</em></p></div>	</div>
</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/anthropic-project-glasswing/">Project Glasswing Proves Frontier AI Can Break – and Fix – Software</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
					<item>
				<image>
					<url>19278542https://infinum.com/uploads/2026/04/img-GRC-article2.webp</url>
				</image>
				<title>Why GRC Fails – and What a Framework That Actually Works Looks Like</title>
				<link>https://infinum.com/blog/grc-framework/</link>
				<pubDate>Fri, 17 Apr 2026 11:46:06 +0000</pubDate>
				<dc:creator>Tom Miller</dc:creator>
				<guid isPermaLink="false">https://infinum.com/?p=19278542</guid>
				<description>
					<![CDATA[<p>Most GRC programs fail not because the framework is wrong, but because it's built to satisfy auditors, not protect businesses. Here's what that costs you – and how to do it differently.</p>
<p>The post <a href="https://infinum.com/blog/grc-framework/">Why GRC Fails – and What a Framework That Actually Works Looks Like</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[<div
	class="wrapper"
	data-id="es-472"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-449">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-452"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-450">
	<p	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-451'
	>
	<strong>Most GRC programs fail not because the framework is wrong, but because it&#8217;s built to satisfy auditors, not protect businesses. Here&#8217;s what that costs you – and how to do it differently.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-455"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-453">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-454'
	>
	Most organisations have some version of GRC in place. Policies exist. Compliance boxes get ticked. A risk register lives somewhere in a shared drive, last updated before anyone currently on the team joined. And then a breach happens, or an audit goes badly, and everyone is surprised.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-458"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-456">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-457'
	>
	They shouldn&#8217;t be. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-461"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-459">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-460'
	>
	The most common GRC failure isn&#8217;t ignorance of the framework – it&#8217;s treating it as an administrative exercise rather than a decision-making system. You end up with documentation that describes security rather than delivers it.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-464"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-462">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-463'
	>
	That distinction matters more than most security conversations acknowledge.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-467"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-465">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-466'
	>
	<strong>Why GRC exists – and why it usually gets implemented wrong</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-470"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-468">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-469'
	>
	GRC – governance, risk, and compliance – is a system for making security decisions that support a business rather than obstruct it. Not rules imposed from above, but a framework built around what the organisation is actually trying to achieve.</p></div>	</div>
</div>
</div>		</div>
	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-483"
	 data-animation-target='inner-items'>
		
			<div class="block-columns" data-id="es-482">
	
<div class="block-column" data-id="es-481">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-480"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="grid block-grid__grid" data-id="es-479">
	
<div class="block-grid-item" data-id="es-478">
	
<a	class="card-simple js-card-simple block-card__card-simple card-simple--has-link js-card-simple-link card-simple__content-align--left"
	data-id="es-473"
	 href='https://infinum.com/blog/what-is-grc/'>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<div	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-474'
	>
	<strong>If you want a deeper grounding in GRC fundamentals before going further, start with our GRC explainer – it covers the full framework from first principles.</strong></div>		</div>

		<button	class="btn btn--color-infinum btn--size-medium btn--width-default btn__icon-position--right card-simple__btn js-block-card-btn js-card-simple-link"
	data-id="es-475"
	 tabindex='-1'>
		<div class="btn__inner">
					<div	class='typography typography--size-none js-typography btn__label'
	data-id='es-476'
	>
	Start here</div>		
		<i
	class="icon btn__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='arrow-right-16' data-id='es-477'>
	<svg fill='none' height='16' viewBox='0 0 17 16' width='17' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'><g stroke='currentColor' stroke-width='2'><path d='m.5 7.99999 14 .00001'/><path d='m9.23352 2.7251 5.97848 5.97852'/><path d='m9.23352 13.2744 5.97848-5.9785'/></g></svg></i>	</div>
	</button>	</div>
</a>
</div>
</div>	</div>
</div>
</div>	</div>

<div
	class="wrapper"
	data-id="es-649"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-484">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-487"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-485">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-486'
	>
	The problem is that most implementations start from the wrong end. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-490"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-488">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-489'
	>
	They start with a compliance requirement, <strong>reverse-engineer the policies needed to satisfy it</strong>, and call that a GRC program. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-493"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-491">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-492'
	>
	The risk register gets populated because ISO 27001 requires one, not because anyone is actively using it. Policies get written because auditors want to see them, not because they reflect how the business actually operates.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-495"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-494'
	>
	This is checkbox compliance. And it&#8217;s not just ineffective – it&#8217;s actively dangerous. It creates the appearance of security maturity without the substance. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-498"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-496">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-497'
	>
	When something goes wrong, the documentation says the right things. The reality doesn&#8217;t match.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-501"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-499">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-500'
	>
	A GRC framework that works starts with a different question: what is this business trying to achieve, and what could prevent it? <strong>Risk is the answer. </strong>Governance and compliance are how you respond to it.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-504"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-502">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-503'
	>
	<strong>Start with risk – and be honest about it</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-507"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-505">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-506'
	>
	Risk sits at the centre of GRC. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-512"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="blockquote block-blockquote__blockquote" data-id="es-508">
	
	<div class="blockquote__content">
		<i
	class="icon blockquote__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='blockquote-24' data-id='es-509'>
	<svg fill='none' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path clip-rule='evenodd' d='m12 24c6.6274 0 12-5.3726 12-12 0-2.79685-.9568-5.37021-2.561-7.41062-.581.22951-1.0832.60583-1.5069 1.12898-.5132.60844-.7698 1.41969-.7698 2.43375v.07605h2.5789v5.59004h-5.6197v-5.01962c0-1.11547.154-2.06616.4619-2.85205.3336-.81125.757-1.48307 1.2702-2.01545.528-.52161 1.1175-.92155 1.7687-1.1998-2.0728-1.70651-4.7279-2.73128-7.6223-2.73128-6.62742 0-12 5.37258-12 12 0 6.6274 5.37258 12 12 12zm-3.53811-18.05347c-.30793.78589-.46189 1.73658-.46189 2.85205v5.01962h5.6197v-5.59004h-2.5789v-.07605c0-1.01406.2566-1.82531.7698-2.43375.5389-.63379 1.1804-1.05209 1.9245-1.2549v-2.28164c-.7441.07605-1.4626.25351-2.1555.53238-.6928.27887-1.3086.68449-1.84752 1.21688-.51321.53238-.9366 1.2042-1.27019 2.01545z' fill='currentColor' fill-rule='evenodd'/></svg></i><p	class='typography typography--size-36-text js-typography blockquote__quote'
	data-id='es-510'
	>
	<strong>Most organisations are far better at documenting risk than they are at being honest about it.</strong></p>
		<div class="blockquote__caption-wrap">
			<div	class='typography typography--size-12-text-roman js-typography blockquote__caption'
	data-id='es-511'
	>
	TOM MILLER, HEAD OF ASSURANCE, AMR CYBERSECURITY – PART OF INFINUM</div>		</div>
	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-515"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-513">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-514'
	>
	The starting point is asset classification – understanding what you&#8217;re actually trying to protect. Critical data, intellectual property, operational systems, customer-facing services. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-518"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-516">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-517'
	>
	Not everything is equal, and treating it as if it is means you&#8217;ll over-invest in protecting things that don&#8217;t matter and under-invest in protecting things that do.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-521"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-519">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-520'
	>
	Once assets are mapped, the threat picture becomes clearer. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-524"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-522">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-523'
	>
	<li><strong>Sensitive customer data attracts financially motivated attackers.</strong></li><li><strong>Source code repositories attract competitors and state actors. </strong></li><li><strong>Physical sites face different exposure entirely.</strong></li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-527"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-525">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-526'
	>
	The threats facing each asset differ in nature, method, and likely impact – and that shapes how risk should be assessed.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-530"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-528">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-529'
	>
	<span class='screen-reader-text'>Risk assessment comes down to two dimensions: impact and likelihood. </span><span aria-hidden='true'>Risk assessment comes down to two dimensions: <strong>impact and likelihood. </strong></span></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-533"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-531">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-532'
	>
	<span class='screen-reader-text'>How damaging would this event be – financially, operationally, reputationally? And how likely is it to occur given your current controls and environment? </span><span aria-hidden='true'><em>How damaging would this event be – financially, operationally, reputationally? And how likely is it to occur given your current controls and environment? </em></span></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-536"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-534">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-535'
	>
	Plot those two on a matrix, score them consistently, and you get a risk level you can act on.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-539"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-537">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-538'
	>
	The scoring methodology matters less than its consistent application. An organisation that assesses risk differently each quarter produces data that can&#8217;t be trended or compared. The value of a risk register is cumulative – it shows you how risk is changing over time, which controls are working, and where new exposure is emerging.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-541"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-540'
	>
	<strong>Risk reviews should happen at least annually for the full register, and quarterly for anything rated high.</strong> </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-544"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-542">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-543'
	>
	Each risk needs a named owner – a senior person responsible for accepting that the risk level is appropriate and for escalating it if it changes. Without ownership, risks get logged and forgotten.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-547"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-545">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-546'
	>
	<strong>What to do when a control isn&#8217;t working</strong></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-550"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-548">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-549'
	>
	This is where most GRC programs go quiet. A control gets implemented, it gets checked off, and nobody asks whether it actually changed anything.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-552"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-551'
	>
	When a control isn&#8217;t working – when the risk level hasn&#8217;t moved, or when incidents keep recurring in the same area – the answer isn&#8217;t to add more controls. It&#8217;s to go back to the risk assessment and ask whether you&#8217;ve correctly understood the threat.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-555"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-553">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-554'
	>
	Often, the control addresses the symptom rather than the cause. A phishing training module doesn&#8217;t solve a culture that punishes people for reporting mistakes. A firewall rule doesn&#8217;t fix misconfigured cloud permissions.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-560"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="blockquote block-blockquote__blockquote" data-id="es-556">
	
	<div class="blockquote__content">
		<i
	class="icon blockquote__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='blockquote-24' data-id='es-557'>
	<svg fill='none' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path clip-rule='evenodd' d='m12 24c6.6274 0 12-5.3726 12-12 0-2.79685-.9568-5.37021-2.561-7.41062-.581.22951-1.0832.60583-1.5069 1.12898-.5132.60844-.7698 1.41969-.7698 2.43375v.07605h2.5789v5.59004h-5.6197v-5.01962c0-1.11547.154-2.06616.4619-2.85205.3336-.81125.757-1.48307 1.2702-2.01545.528-.52161 1.1175-.92155 1.7687-1.1998-2.0728-1.70651-4.7279-2.73128-7.6223-2.73128-6.62742 0-12 5.37258-12 12 0 6.6274 5.37258 12 12 12zm-3.53811-18.05347c-.30793.78589-.46189 1.73658-.46189 2.85205v5.01962h5.6197v-5.59004h-2.5789v-.07605c0-1.01406.2566-1.82531.7698-2.43375.5389-.63379 1.1804-1.05209 1.9245-1.2549v-2.28164c-.7441.07605-1.4626.25351-2.1555.53238-.6928.27887-1.3086.68449-1.84752 1.21688-.51321.53238-.9366 1.2042-1.27019 2.01545z' fill='currentColor' fill-rule='evenodd'/></svg></i><p	class='typography typography--size-36-text js-typography blockquote__quote'
	data-id='es-558'
	>
	Controls should reduce either the likelihood or the impact of a risk. If neither is moving, something is wrong with the control, the assessment, or both. </p>
		<div class="blockquote__caption-wrap">
			<div	class='typography typography--size-12-text-roman js-typography blockquote__caption'
	data-id='es-559'
	>
	TOM MILLER, HEAD OF ASSURANCE, AMR CYBERSECURITY – PART OF INFINUM</div>		</div>
	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-563"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-561">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-562'
	>
	For technical controls specifically,<a href="https://infinum.com/blog/why-penetration-testing-is-important/"> penetration testing</a> is one of the most direct ways to find out whether a control is actually doing what you think it is.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-566"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-564">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-565'
	>
	<strong>Why security policies fail – and what to do about it</strong>?</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-569"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-567">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-568'
	>
	Governance is what makes risk management repeatable. Documented policies, defined responsibilities, clear ownership – the infrastructure that ensures security doesn&#8217;t live in one person&#8217;s head and doesn&#8217;t fall apart when someone leaves.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-572"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-570">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-571'
	>
	But governance has a failure mode that organisations consistently underestimate: policies that nobody follows.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-575"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-573">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-574'
	>
	<li><strong>Lock down laptops too tightly, and people find workarounds.  </strong></li><li><strong>Require complex passwords to be changed every 30 days, and they get written on sticky notes. </strong></li><li><strong>Mandate a slow, bureaucratic approval process for software tools, and teams start using personal accounts for work data.</strong></li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-578"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-576">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-577'
	>
	If staff are bypassing a control, that is not a compliance problem. It is a design problem. The control is wrong. It&#8217;s asking people to choose between doing their job and following the rules, and unsurprisingly, they choose their job.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-580"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-579'
	>
	The irony is that overly strict controls often create more risk than they prevent – because the workarounds are almost always less secure than whatever the policy was trying to enforce.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-583"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-581">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-582'
	>
	The fix isn&#8217;t stricter enforcement. It&#8217;s redesigning the control to be compatible with how work actually gets done. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-586"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-584">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-585'
	>
	<strong>Security that works with people is more effective than security that works against them, even if it looks less rigorous on paper.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-589"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-587">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-588'
	>
	Metrics are how you catch this early.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-592"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-590">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-591'
	>
	Security training completion rates, phishing simulation results, patch compliance rates, incident trends – these tell you whether the governance framework is working in practice, not just on paper. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-595"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-593">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-594'
	>
	Patterns in that data are diagnostic. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-598"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-596">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-597'
	>
	If phishing click rates stay flat after multiple training rounds, the training isn&#8217;t the solution. If patch compliance drops in one team, there&#8217;s a resourcing or tooling problem to fix, not a people problem to escalate.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-601"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-599">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-600'
	>
	Incident reporting culture sits underneath all of it </h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-604"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-602">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-603'
	>
	Teams that punish mistakes get underreporting. Underreporting means the same vulnerabilities recur because nobody connected the dots between incidents. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-606"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-605'
	>
	An environment where people report phishing clicks, near misses, and process failures without fear is not a soft environment – it&#8217;s one that learns faster than its attackers. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-609"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-607">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-608'
	>
	For teams building software, the same principle applies to the development process itself: embedding security from the start is cheaper and more effective than bolting it on later.<a href="https://infinum.com/blog/ssdlc-application-security/"> Here&#8217;s what that shift looks like in practice.</a></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-612"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-610">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-611'
	>
	<strong>How to decide whether to comply with a regulation</strong>?</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-615"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-613">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-614'
	>
	Compliance is the most visible part of GRC, and the most frequently misunderstood. The default assumption is that compliance requirements are obligations to be met. Some are. Many aren&#8217;t.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-618"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-616">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-617'
	>
	There are three distinct categories worth separating:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-621"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-619">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-620'
	>
	<li><strong>Mandatory compliance</strong> – legal requirements that apply to your organisation based on sector, geography, or the nature of the data you handle. GDPR for organisations processing EU personal data.<a href="https://infinum.com/blog/eu-cybersecurity-legislation-nis2-dora/"> NIS2 and DORA</a> for financial services and critical sectors across the EU. Non-compliance here isn&#8217;t a business decision – it&#8217;s a legal exposure.</li><li><strong>Commercial compliance</strong> – certifications and frameworks that aren&#8217;t legally required but open doors. ISO 27001 is the most common example: many enterprise customers and regulated-industry partners won&#8217;t sign contracts with vendors who can&#8217;t demonstrate it. The compliance decision here is a sales and market access question as much as a security one.</li><li><strong>Voluntary frameworks</strong> – standards like NIST or CIS Controls that provide useful structure without any external mandate. The value is in the methodology, not the certification.</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-624"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-622">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-623'
	>
	Treating all three categories the same way produces bad decisions. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-627"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-625">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-626'
	>
	Spending significant resources on a voluntary framework while ignoring a mandatory obligation is a governance failure. So is pursuing an expensive certification that none of your target customers will ever ask for.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-630"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-628">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-629'
	>
	<strong>Outcome-based regulation changes the calculation</strong></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-633"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-631">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-632'
	>
	Increasingly, regulators define what good looks like rather than prescribing exactly how to get there. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-636"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-634">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-635'
	>
	<a href="https://infinum.com/cybersecurity/nis2-compliance-services/" target="_blank" rel="noreferrer noopener">NIS2</a> is a clear example – it specifies required capabilities and outcomes across risk management, incident handling, and supply chain security, but leaves implementation to the organisation.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-639"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-637">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-638'
	>
	This is good policy design. It acknowledges that a one-size-fits-all technical prescription can&#8217;t account for the diversity of organisations in scope. But it <strong>shifts the burden onto organisations</strong> to genuinely interpret what compliance means for their context, rather than following a checklist.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-642"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-640">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-641'
	>
	That interpretation requires security judgment, not just legal review. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-644"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-643'
	>
	A small professional services firm and a hospital group might both fall under NIS2, but the controls that constitute appropriate risk management for each look very different. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-647"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-645">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-646'
	>
	Getting that translation right is the work – and it can&#8217;t be delegated entirely to a compliance team.</p></div>	</div>
</div>
</div>		</div>
	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-660"
	 data-animation-target='inner-items'>
		
			<div class="block-columns" data-id="es-659">
	
<div class="block-column" data-id="es-658">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-657"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="grid block-grid__grid" data-id="es-656">
	
<div class="block-grid-item" data-id="es-655">
	
<a	class="card-simple js-card-simple block-card__card-simple card-simple--has-link js-card-simple-link card-simple__content-align--left"
	data-id="es-650"
	 href='https://infinum.com/blog/cybersecurity-trends-2026/'>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<div	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-651'
	>
	<strong><strong><strong><strong>For a current view of which regulatory shifts are having the most practical impact on security teams right now,</strong><a href="https://infinum.com/blog/cybersecurity-trends-2026/"><strong> our 2026 cybersecurity trends piece</strong></a><strong> covers the landscape.</strong></strong></strong></strong></div>		</div>

		<button	class="btn btn--color-infinum btn--size-medium btn--width-default btn__icon-position--right card-simple__btn js-block-card-btn js-card-simple-link"
	data-id="es-652"
	 tabindex='-1'>
		<div class="btn__inner">
					<div	class='typography typography--size-none js-typography btn__label'
	data-id='es-653'
	>
	Learn more here</div>		
		<i
	class="icon btn__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='arrow-right-16' data-id='es-654'>
	<svg fill='none' height='16' viewBox='0 0 17 16' width='17' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'><g stroke='currentColor' stroke-width='2'><path d='m.5 7.99999 14 .00001'/><path d='m9.23352 2.7251 5.97848 5.97852'/><path d='m9.23352 13.2744 5.97848-5.9785'/></g></svg></i>	</div>
	</button>	</div>
</a>
</div>
</div>	</div>
</div>
</div>	</div>

<div
	class="wrapper"
	data-id="es-692"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-661">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-664"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-662">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-663'
	>
	<strong>Vendor risk: the risk you let in without realising it</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-667"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-665">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-666'
	>
	Your own security posture is only part of the picture. Every supplier onboarded, every tool deployed, every third party with any form of access to your systems extends your attack surface. In most organisations, that surface is considerably larger than anyone has formally mapped.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-669"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-668'
	>
	Vendor risk management isn&#8217;t about being suspicious of suppliers. It&#8217;s about not assuming trust where it hasn&#8217;t been established. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-672"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-670">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-671'
	>
	The questions worth asking before any significant vendor relationship:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-675"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-673">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-674'
	>
	<li>Do they hold relevant certifications (ISO 27001, Cyber Essentials, SOC 2)?</li><li>Has their product been independently penetration tested, and will they share the findings?</li><li>How do they manage vulnerabilities in their own software and infrastructure?</li><li>What access will they have to your systems – and is that access scoped correctly?</li><li>What happens to your data if the relationship ends?</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-678"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-676">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-677'
	>
	These aren&#8217;t bureaucratic hurdles. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-681"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-679">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-680'
	>
	They&#8217;re the minimum basis for making an informed decision about the risk a vendor introduces. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-684"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-682">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-683'
	>
	An organisation that can&#8217;t answer these questions about its critical suppliers has a <strong>material gap in its risk picture,</strong> regardless of how well-managed its internal controls are.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-687"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-685">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-686'
	>
	Supply chain compromise is one of the highest-impact attack vectors in the current threat landscape, precisely because it bypasses the controls organisations invest in protecting their own perimeter.<a href="https://infinum.com/blog/software-supply-chain-security/"> </a></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-690"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-688">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-689'
	>
	 </p></div>	</div>
</div>
</div>		</div>
	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-703"
	 data-animation-target='inner-items'>
		
			<div class="block-columns" data-id="es-702">
	
<div class="block-column" data-id="es-701">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-700"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="grid block-grid__grid" data-id="es-699">
	
<div class="block-grid-item" data-id="es-698">
	
<a	class="card-simple js-card-simple block-card__card-simple card-simple--has-link js-card-simple-link card-simple__content-align--left"
	data-id="es-693"
	 href='https://infinum.com/blog/software-supply-chain-security/'>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<div	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-694'
	>
	The software supply chain security problem is worth understanding in detail if your organisation builds or depends on software from third parties.</div>		</div>

		<button	class="btn btn--color-infinum btn--size-medium btn--width-default btn__icon-position--right card-simple__btn js-block-card-btn js-card-simple-link"
	data-id="es-695"
	 tabindex='-1'>
		<div class="btn__inner">
					<div	class='typography typography--size-none js-typography btn__label'
	data-id='es-696'
	>
	Learn more</div>		
		<i
	class="icon btn__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='arrow-right-16' data-id='es-697'>
	<svg fill='none' height='16' viewBox='0 0 17 16' width='17' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'><g stroke='currentColor' stroke-width='2'><path d='m.5 7.99999 14 .00001'/><path d='m9.23352 2.7251 5.97848 5.97852'/><path d='m9.23352 13.2744 5.97848-5.9785'/></g></svg></i>	</div>
	</button>	</div>
</a>
</div>
</div>	</div>
</div>
</div>	</div>

<div
	class="wrapper"
	data-id="es-729"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-704">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-707"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-705">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-706'
	>
	<strong>The loop that most organisations miss</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-710"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-708">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-709'
	>
	The reason GRC works – when it works – is that governance, risk, and compliance aren&#8217;t separate programmes running in parallel. They&#8217;re a loop.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-712"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-711'
	>
	Risk assessment drives what governance policies need to exist. Governance structures ensure risks are owned and monitored. Compliance requirements feed back into risk, because falling foul of a regulation is itself a risk with an impact and a likelihood that needs to be assessed and managed.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-715"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-713">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-714'
	>
	Break any link in that loop and the system degrades. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-718"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-716">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-717'
	>
	Risk managed without governance produces decisions that live in spreadsheets and get forgotten. Governance without risk produces policies disconnected from the actual threats. Compliance without either produces documentation that satisfies auditors and protects no one.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-721"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-719">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-720'
	>
	The organisations that do this well aren&#8217;t the ones with the most sophisticated tools or the thickest policy libraries. They&#8217;re the ones where security decisions are made deliberately, with clear ownership, against a shared understanding of what the business is trying to protect.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-724"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-722">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-723'
	>
	That&#8217;s a cultural outcome as much as a process one. And it&#8217;s harder to fake than any compliance certificate.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-727"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-725">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-726'
	>
	<em>Security that works with your business rather than against it starts with the right foundations. Infinum&#8217;s security practice helps organisations build GRC frameworks grounded in real risk, not just audit readiness.</em><a href="https://infinum.com/cybersecurity/" id="https://infinum.com/cybersecurity/"><em> Explore our cybersecurity services</em></a><em> to see where we can help.</em></p></div>	</div>
</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/grc-framework/">Why GRC Fails – and What a Framework That Actually Works Looks Like</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
					<item>
				<image>
					<url>19278431https://infinum.com/uploads/2026/04/img-GRC-article1.webp</url>
				</image>
				<title>What Is GRC? Governance, Risk, and Compliance Explained</title>
				<link>https://infinum.com/blog/what-is-grc/</link>
				<pubDate>Fri, 17 Apr 2026 11:46:02 +0000</pubDate>
				<dc:creator>Tom Miller</dc:creator>
				<guid isPermaLink="false">https://infinum.com/?p=19278431</guid>
				<description>
					<![CDATA[<p>GRC connects governance, risk, and compliance into a single decision-making system. Here's what each pillar means, how they interact, and how businesses apply them in practice.</p>
<p>The post <a href="https://infinum.com/blog/what-is-grc/">What Is GRC? Governance, Risk, and Compliance Explained</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[<div
	class="wrapper"
	data-id="es-750"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-730">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-733"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-731">
	<p	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-732'
	>
	<strong>GRC connects governance, risk, and compliance into a single decision-making system. Here&#8217;s what each pillar means, how they interact, and how businesses apply them in practice.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-736"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-734">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-735'
	>
	Most organizations already manage<strong> <a href="https://infinum.com/governance-risk-compliance-services/" id="https://infinum.com/governance-risk-compliance-services/">governance, risk, and compliance</a></strong> in some form – they just do it in separate silos, with different teams, different tools, and no shared language. GRC formalizes that into a single, connected system.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-739"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-737">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-738'
	>
	When governance, risk, and compliance operate independently, decisions get made without context. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-742"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-740">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-741'
	>
	An IT team patches vulnerabilities without knowing which ones actually threaten business-critical systems. A compliance team checks boxes without understanding the underlying risk. Leadership approves budgets without visibility into what they&#8217;re actually protecting.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-745"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-743">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-744'
	>
	GRC fixes that – not by adding process overhead, but by aligning security decisions with business goals. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-748"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-746">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-747'
	>
	And in an environment where the regulatory landscape keeps expanding, the number of threat vectors keeps growing, and senior leadership is increasingly held personally accountable for security failures, that alignment is no longer optional.</p></div>	</div>
</div>
</div>		</div>
	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-761"
	 data-animation-target='inner-items'>
		
			<div class="block-columns" data-id="es-760">
	
<div class="block-column" data-id="es-759">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-758"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="grid block-grid__grid" data-id="es-757">
	
<div class="block-grid-item" data-id="es-756">
	
<a	class="card-simple js-card-simple block-card__card-simple card-simple--has-link js-card-simple-link card-simple__content-align--left"
	data-id="es-751"
	 href='https://infinum.com/blog/grc-framework/'>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<div	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-752'
	>
	<strong>Already familiar with GRC but want a more practical perspective on how it should work in real businesses</strong>? Check out our blog on the GRC framework for modern organizations. </div>		</div>

		<button	class="btn btn--color-infinum btn--size-medium btn--width-default btn__icon-position--right card-simple__btn js-block-card-btn js-card-simple-link"
	data-id="es-753"
	 tabindex='-1'>
		<div class="btn__inner">
					<div	class='typography typography--size-none js-typography btn__label'
	data-id='es-754'
	>
	Learn more here</div>		
		<i
	class="icon btn__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='arrow-right-16' data-id='es-755'>
	<svg fill='none' height='16' viewBox='0 0 17 16' width='17' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'><g stroke='currentColor' stroke-width='2'><path d='m.5 7.99999 14 .00001'/><path d='m9.23352 2.7251 5.97848 5.97852'/><path d='m9.23352 13.2744 5.97848-5.9785'/></g></svg></i>	</div>
	</button>	</div>
</a>
</div>
</div>	</div>
</div>
</div>	</div>

<div
	class="wrapper"
	data-id="es-948"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-762">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-765"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-763">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-764'
	>
	<strong>What does GRC stand for?</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-768"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-766">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-767'
	>
	GRC stands for Governance, Risk, and Compliance. Each term names a distinct discipline, but the value of GRC comes from how they interact.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-771"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-769">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-770'
	>
	<strong>Governance</strong> defines how an organization makes decisions – its policies, roles, responsibilities, and the processes that keep security practices consistent as the business grows or changes.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-774"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-772">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-773'
	>
	<strong>Risk</strong> is the analytical core. Risk management identifies what matters most to the business, assesses what could go wrong, and determines how much uncertainty the organization is willing to accept.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-777"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-775">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-776'
	>
	<strong>Compliance</strong> ensures the organization meets its legal, regulatory, contractual, and framework-based obligations – whether that&#8217;s GDPR,<a href="https://infinum.com/blog/eu-cybersecurity-legislation-nis2-dora/" target="_blank" rel="noreferrer noopener"> NIS2 and DORA</a>, <a href="https://infinum.com/pci-dss-compliance-guide/" target="_blank" rel="noreferrer noopener">PCI DSS</a>, ISO/IEC 27001, or requirements imposed by a customer.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-780"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-778">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-779'
	>
	The three are not parallel tracks – they form a loop. Governance defines how things should work, risk explains why controls are needed, compliance confirms that external expectations are met. Strip any one of them out and the system breaks down.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-783"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-781">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-782'
	>
	<strong>Why GRC matters for business</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-786"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-784">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-785'
	>
	The case for GRC goes well beyond avoiding fines, though the fines alone are significant. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-789"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-787">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-788'
	>
	<li>Under <a href="https://infinum.com/cybersecurity/nis2-compliance-services/" target="_blank" rel="noreferrer noopener">NIS2</a>, essential entities face penalties of up to €10 million or 2% of global turnover. </li><li>Under GDPR, major violations carry fines of up to €20 million or 4% of annual worldwide revenue. </li><li>Failure to comply with the Payment Card Industry Data Security Standard (PCI DSS) can result in suspension of card processing rights for non-compliant organisations. </li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-792"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-790">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-791'
	>
	These aren&#8217;t edge cases – they&#8217;re the baseline exposure for businesses operating in regulated environments.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-795"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-793">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-794'
	>
	But the more durable argument for GRC isn&#8217;t the downside. It&#8217;s the operational benefit.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-800"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="blockquote block-blockquote__blockquote" data-id="es-796">
	
	<div class="blockquote__content">
		<i
	class="icon blockquote__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='blockquote-24' data-id='es-797'>
	<svg fill='none' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path clip-rule='evenodd' d='m12 24c6.6274 0 12-5.3726 12-12 0-2.79685-.9568-5.37021-2.561-7.41062-.581.22951-1.0832.60583-1.5069 1.12898-.5132.60844-.7698 1.41969-.7698 2.43375v.07605h2.5789v5.59004h-5.6197v-5.01962c0-1.11547.154-2.06616.4619-2.85205.3336-.81125.757-1.48307 1.2702-2.01545.528-.52161 1.1175-.92155 1.7687-1.1998-2.0728-1.70651-4.7279-2.73128-7.6223-2.73128-6.62742 0-12 5.37258-12 12 0 6.6274 5.37258 12 12 12zm-3.53811-18.05347c-.30793.78589-.46189 1.73658-.46189 2.85205v5.01962h5.6197v-5.59004h-2.5789v-.07605c0-1.01406.2566-1.82531.7698-2.43375.5389-.63379 1.1804-1.05209 1.9245-1.2549v-2.28164c-.7441.07605-1.4626.25351-2.1555.53238-.6928.27887-1.3086.68449-1.84752 1.21688-.51321.53238-.9366 1.2042-1.27019 2.01545z' fill='currentColor' fill-rule='evenodd'/></svg></i><p	class='typography typography--size-36-text js-typography blockquote__quote'
	data-id='es-798'
	>
	<strong>Organizations with mature GRC programs make better decisions faster. Risk appetite is defined, so teams don&#8217;t have to relitigate every security investment. Compliance obligations are mapped, so the answer to &#8220;do we need to do this?&#8221; is documented rather than guessed. Governance structures are in place, so accountability doesn&#8217;t evaporate when the person who knew something leaves.</strong></p>
		<div class="blockquote__caption-wrap">
			<div	class='typography typography--size-12-text-roman js-typography blockquote__caption'
	data-id='es-799'
	>
	TOM MILLER, HEAD OF ASSURANCE, AMR CYBERSECURITY – PART OF INFINUM</div>		</div>
	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-803"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-801">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-802'
	>
	There&#8217;s also a commercial dimension. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-806"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-804">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-805'
	>
	Enterprise customers and regulated-sector partners regularly require evidence of security maturity before signing contracts. SOC 2 attestation, ISO/IEC 27001 certification, and documented compliance management systems are increasingly prerequisites rather than differentiators. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-809"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-807">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-808'
	>
	A strong GRC posture opens doors; the absence of one closes them.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-812"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-810">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-811'
	>
	<strong>How does risk management work in GRC?</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-815"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-813">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-814'
	>
	Risk management is where most GRC programs begin, and for good reason. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-818"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-816">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-817'
	>
	Without a clear picture of what you&#8217;re protecting and what threatens it, governance produces arbitrary rules and compliance becomes theater.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-821"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-819">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-820'
	>
	<strong>Step one: identify and classify your assets</strong></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-824"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-822">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-823'
	>
	You cannot manage risk to assets you haven&#8217;t mapped. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-827"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-825">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-826'
	>
	Those assets may include customer data, intellectual property, operational systems, physical infrastructure, or vendor relationships. Classification matters because not all assets warrant the same level of protection – and trying to protect everything equally usually means protecting nothing well.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-830"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-828">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-829'
	>
	<strong>Step two: understand the threat landscape</strong></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-833"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-831">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-832'
	>
	Different assets face different threats. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-836"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-834">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-835'
	>
	Personal data is targeted for financial gain. Critical infrastructure faces operational disruption. Source code may attract industrial espionage. Understanding the nature of threats – not just their existence – shapes how you assess and respond to them.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-839"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-837">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-838'
	>
	<strong>Step three: assess impact and likelihood</strong></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-842"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-840">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-841'
	>
	This is where the risk matrix comes in. Risk is typically evaluated across two dimensions:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-845"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-843">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-844'
	>
	<li><strong>Impact</strong> – how damaging an incident would be, in terms of financial loss, reputational harm, regulatory penalties, or operational disruption</li><li><strong>Likelihood</strong> – how probable it is that the event occurs, given existing controls and the threat environment</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-848"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-846">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-847'
	>
	These are plotted on a matrix, commonly a 5×5 grid, to produce a risk score. The exact numbers are less important than the consistency of the methodology. Organizations that assess risks differently each time they run the exercise produce data that can&#8217;t be compared or trended. Continuous monitoring through defined key risk indicators (KRIs) keeps the picture current between formal review cycles.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-851"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-849">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-850'
	>
	<strong>Step four: decide how to treat the risk</strong></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-854"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-852">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-853'
	>
	Once a risk level is established, the business chooses how to respond. The standard options are:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-857"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-855">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-856'
	>
	<li><strong>Reduce</strong> the risk through controls – security training, technical safeguards, process changes</li><li><strong>Accept</strong> the risk if it falls within the organization&#8217;s risk appetite</li><li><strong>Avoid</strong> the risk by changing or discontinuing the activity that creates it</li><li><strong>Transfer</strong> the risk – through insurance, contracts, or third-party arrangements</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-860"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-858">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-859'
	>
	Controls should be matched to risks specifically. Generic controls applied uniformly are expensive and often ineffective against the actual threats an organization faces. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-863"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-861">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-862'
	>
	For technical risks in particular,<a href="https://infinum.com/cybersecurity/penetration-testing/" target="_blank" rel="noreferrer noopener"> penetration testing</a> is one of the most direct ways to validate whether your controls actually hold up.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-866"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-864">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-865'
	>
	<strong>Risk assessment &amp; management is ongoing, not periodic</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-869"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-867">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-868'
	>
	Threats change. Businesses evolve. Acquisitions, new product lines, cloud migrations, and regulatory changes all shift the risk assessment. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-872"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-870">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-871'
	>
	Most organizations review their full risk register at least annually. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-875"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-873">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-874'
	>
	High-risk areas warrant more frequent reassessment. Assigning clear risk owners – people accountable for monitoring and managing specific risks – is what prevents risks from being noted once and then quietly forgotten.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-878"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-876">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-877'
	>
	<strong>What is governance in a GRC framework?</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-881"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-879">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-880'
	>
	Governance is the operational skeleton of GRC. It translates risk decisions into repeatable practice.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-884"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-882">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-883'
	>
	That includes</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-887"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-885">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-886'
	>
	<li><strong>documented policies</strong> covering data handling, access control, incident response plans, acceptable use, and other security-critical areas</li><li><strong>defined roles</strong> – from senior leadership accountability at board level down to team-level ownership – so that security doesn&#8217;t depend on any single individual</li><li><strong>processes </strong>for reviewing and updating those policies as the business changes</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-890"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-888">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-889'
	>
	One design failure that consistently undermines governance programs: rules that are too strict for people to follow. Overly restrictive policies don&#8217;t eliminate risk – they push it underground. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-893"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-891">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-892'
	>
	Employees find workarounds. Shadow IT proliferates. Data ends up in personal accounts because the approved tools are too slow or too inconvenient.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-895"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-894'
	>
	<strong>Effective governance balances protection with usability. Policies should make it easier to work securely, not harder to work at all.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-898"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-896">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-897'
	>
	Governance frameworks also need scheduled reviews. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-901"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-899">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-900'
	>
	A policy written before your organization moved to cloud infrastructure, onboarded a major enterprise customer, or doubled headcount is likely obsolete in places. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-904"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-902">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-903'
	>
	Incident data, employee feedback, and internal audit results should all feed into governance updates – not sit in a report that nobody reads.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-907"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-905">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-906'
	>
	<strong>What compliance frameworks do businesses need?</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-910"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-908">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-909'
	>
	The answer depends on the industry, the markets served, and the nature of customer relationships. But the typical compliance picture for a modern business covers several layers:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-913"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-911">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-912'
	>
	<li><strong>Legal and regulatory requirements</strong> – data protection laws, cybersecurity regulations, sector-specific legislation (NIS2 and DORA in the EU, for example)</li><li><strong>Industry frameworks</strong> – ISO/IEC 27001, Payment Card Industry Data Security Standard (<a href="https://infinum.com/cybersecurity/pci-dss-compliance-services/" target="_blank" rel="noreferrer noopener">PCI DSS</a>), SOC 2, NIST, CIS Controls</li><li><strong>Regional data protection regulations</strong> – the General Data Protection Regulation (GDPR) for organizations handling EU personal data; the California Consumer Privacy Act (CCPA) for those serving US consumers; the Health Insurance Portability and Accountability Act (HIPAA) for healthcare; the Sarbanes-Oxley Act (SOX) for US-listed companies</li><li><strong>Anti-corruption and financial crime frameworks</strong> – the Foreign Corrupt Practices Act (FCPA), the UK Bribery Act, and EU Money Laundering Directives for relevant sectors</li><li><strong>Contractual obligations</strong> – security requirements imposed by enterprise customers or partners, often as conditions of doing business</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-916"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-914">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-915'
	>
	It&#8217;s important to note that these often overlap. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-919"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-917">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-918'
	>
	A financial services company serving EU customers may simultaneously need to comply with DORA, NIS2, GDPR, and the security requirements of its largest institutional clients. GRC provides the structure to manage these demands coherently rather than spinning up separate workstreams for each.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-922"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-920">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-921'
	>
	<strong>What is outcome-based regulation?</strong></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-925"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-923">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-924'
	>
	A significant portion of modern compliance frameworks – including NIS2 and many data protection regimes – define outcomes rather than prescribing specific security controls. They tell you what you need to achieve, not exactly how to achieve it.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-928"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-926">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-927'
	>
	This creates flexibility. It also creates interpretation work. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-931"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-929">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-930'
	>
	&#8220;Implement appropriate technical and organizational measures&#8221; means different things for a 20-person SaaS company and a multinational bank. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-934"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-932">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-933'
	>
	Understanding your specific risk profile, business context, and the regulator&#8217;s expectations for your sector is what makes outcome-based regulatory compliance meaningful rather than aspirational.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-937"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-935">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-936'
	>
	<strong>Compliance is itself a risk decision</strong></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-940"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-938">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-939'
	>
	Not every framework that exists is mandatory for your organization. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-943"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-941">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-942'
	>
	Some are legally required. Others are commercially beneficial – certain enterprise customers won&#8217;t sign contracts with vendors who can&#8217;t demonstrate ISO/IEC 27001 certification, for example. Others are optional but signal maturity to the market.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-946"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-944">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-945'
	>
	Deciding which standards to pursue should follow the same logic as any risk assessment follow-up decision: what are the obligations, what is the business value, and what does it cost?</p></div>	</div>
</div>
</div>		</div>
	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-959"
	 data-animation-target='inner-items'>
		
			<div class="block-columns" data-id="es-958">
	
<div class="block-column" data-id="es-957">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-956"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="grid block-grid__grid" data-id="es-955">
	
<div class="block-grid-item" data-id="es-954">
	
<a	class="card-simple js-card-simple block-card__card-simple card-simple--has-link js-card-simple-link card-simple__content-align--left"
	data-id="es-949"
	 href='https://infinum.com/blog/cybersecurity-trends-2026/'>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<div	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-950'
	>
	<strong>For an up-to-date view of which regulatory obligations are currently driving the most change, our 2026 cybersecurity trends piece is a useful companion read.</strong></div>		</div>

		<button	class="btn btn--color-infinum btn--size-medium btn--width-default btn__icon-position--right card-simple__btn js-block-card-btn js-card-simple-link"
	data-id="es-951"
	 tabindex='-1'>
		<div class="btn__inner">
					<div	class='typography typography--size-none js-typography btn__label'
	data-id='es-952'
	>
	Learn more here</div>		
		<i
	class="icon btn__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='arrow-right-16' data-id='es-953'>
	<svg fill='none' height='16' viewBox='0 0 17 16' width='17' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'><g stroke='currentColor' stroke-width='2'><path d='m.5 7.99999 14 .00001'/><path d='m9.23352 2.7251 5.97848 5.97852'/><path d='m9.23352 13.2744 5.97848-5.9785'/></g></svg></i>	</div>
	</button>	</div>
</a>
</div>
</div>	</div>
</div>
</div>	</div>

<div
	class="wrapper"
	data-id="es-982"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-960">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-963"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-961">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-962'
	>
	<strong>Culture, metrics, and the feedback loop</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-966"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-964">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-965'
	>
	GRC doesn&#8217;t run on documents alone. It runs on people.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-968"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-967'
	>
	Security training participation rates, phishing simulation results, system patching cadence, and incident trends are all metrics that reveal how the governance framework is performing in practice – not just on paper. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-971"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-969">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-970'
	>
	Organizations that track these consistently identify weaknesses before they become incidents. Regular training sessions and awareness programs matter here not as regulatory compliance checkboxes, but as data sources: if phishing click rates don&#8217;t move after repeated training rounds, the training isn&#8217;t working.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-974"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-972">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-973'
	>
	The other half of this is incident reporting culture. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-977"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-975">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-976'
	>
	Employees need to feel safe raising concerns, reporting mistakes, and escalating near misses. Blame discourages reporting. Underreporting makes risk data unreliable and leaves the same vulnerabilities recurring across incidents that could have been connected.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-980"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-978">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-979'
	>
	Every incident that gets reported and analyzed is a direct feed into the risk register, the governance framework, and the next training cycle &#8211; that feedback loop is what makes GRC a living system rather than a compliance filing exercise.</p></div>	</div>
</div>
</div>		</div>
	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-993"
	 data-animation-target='inner-items'>
		
			<div class="block-columns" data-id="es-992">
	
<div class="block-column" data-id="es-991">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-990"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="grid block-grid__grid" data-id="es-989">
	
<div class="block-grid-item" data-id="es-988">
	
<a	class="card-simple js-card-simple block-card__card-simple card-simple--has-link js-card-simple-link card-simple__content-align--left"
	data-id="es-983"
	 href='https://infinum.com/blog/ssdlc-application-security/'>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<div	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-984'
	>
	If your organization builds software, embedding security into the development lifecycle is where that loop starts – here&#8217;s how to make that shift.</div>		</div>

		<button	class="btn btn--color-infinum btn--size-medium btn--width-default btn__icon-position--right card-simple__btn js-block-card-btn js-card-simple-link"
	data-id="es-985"
	 tabindex='-1'>
		<div class="btn__inner">
					<div	class='typography typography--size-none js-typography btn__label'
	data-id='es-986'
	>
	Explore SSDLC</div>		
		<i
	class="icon btn__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='arrow-right-16' data-id='es-987'>
	<svg fill='none' height='16' viewBox='0 0 17 16' width='17' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'><g stroke='currentColor' stroke-width='2'><path d='m.5 7.99999 14 .00001'/><path d='m9.23352 2.7251 5.97848 5.97852'/><path d='m9.23352 13.2744 5.97848-5.9785'/></g></svg></i>	</div>
	</button>	</div>
</a>
</div>
</div>	</div>
</div>
</div>	</div>

<div
	class="wrapper"
	data-id="es-1018"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-994">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-997"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-995">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-996'
	>
	<strong>GRC tools: what actually matters</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1000"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-998">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-999'
	>
	The market for GRC platforms – compliance management systems, risk registers, policy libraries, audit tracking tools – is large and varied, ranging from enterprise-grade systems with automated controls mapping and real-time dashboards to simpler internal documentation and spreadsheet-based approaches.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1002"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-1001'
	>
	Sophisticated tooling can be valuable – but only if it&#8217;s properly configured, actively maintained, and matched to organizational maturity. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1005"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1003">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1004'
	>
	A platform that requires significant customization and ongoing administration may create more overhead than it removes for a smaller organization.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1010"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="blockquote block-blockquote__blockquote" data-id="es-1006">
	
	<div class="blockquote__content">
		<i
	class="icon blockquote__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='blockquote-24' data-id='es-1007'>
	<svg fill='none' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path clip-rule='evenodd' d='m12 24c6.6274 0 12-5.3726 12-12 0-2.79685-.9568-5.37021-2.561-7.41062-.581.22951-1.0832.60583-1.5069 1.12898-.5132.60844-.7698 1.41969-.7698 2.43375v.07605h2.5789v5.59004h-5.6197v-5.01962c0-1.11547.154-2.06616.4619-2.85205.3336-.81125.757-1.48307 1.2702-2.01545.528-.52161 1.1175-.92155 1.7687-1.1998-2.0728-1.70651-4.7279-2.73128-7.6223-2.73128-6.62742 0-12 5.37258-12 12 0 6.6274 5.37258 12 12 12zm-3.53811-18.05347c-.30793.78589-.46189 1.73658-.46189 2.85205v5.01962h5.6197v-5.59004h-2.5789v-.07605c0-1.01406.2566-1.82531.7698-2.43375.5389-.63379 1.1804-1.05209 1.9245-1.2549v-2.28164c-.7441.07605-1.4626.25351-2.1555.53238-.6928.27887-1.3086.68449-1.84752 1.21688-.51321.53238-.9366 1.2042-1.27019 2.01545z' fill='currentColor' fill-rule='evenodd'/></svg></i><p	class='typography typography--size-36-text js-typography blockquote__quote'
	data-id='es-1008'
	>
	What matters is not the sophistication of the tool but the quality of the thinking behind it. A GRC spreadsheet used rigorously beats an enterprise platform treated as a checkbox.</p>
		<div class="blockquote__caption-wrap">
			<div	class='typography typography--size-12-text-roman js-typography blockquote__caption'
	data-id='es-1009'
	>
	TOM MILLER, HEAD OF ASSURANCE, AMR CYBERSECURITY &#8211; PART OF INFINUM</div>		</div>
	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1013"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1011">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1012'
	>
	<a href="https://infinum.com/enterprise-cyber-risk-management/" id="19275077">Vendor risk management</a> deserves specific attention. Every supplier introduced into your environment extends your attack surface, and that includes cloud providers, managed service providers, software vendors, and any third party with access to your systems or data. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1016"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1014">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1015'
	>
	Trust should be verified through due diligence, not assumed. When evaluating vendors, prioritize demonstrated experience, relevant credentials, and a clear approach to their own GRC.</p></div>	</div>


</div>
</div>		</div>
	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1029"
	 data-animation-target='inner-items'>
		
			<div class="block-columns" data-id="es-1028">
	
<div class="block-column" data-id="es-1027">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1026"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="grid block-grid__grid" data-id="es-1025">
	
<div class="block-grid-item" data-id="es-1024">
	
<a	class="card-simple js-card-simple block-card__card-simple card-simple--has-link js-card-simple-link card-simple__content-align--left"
	data-id="es-1019"
	 href='https://infinum.com/blog/software-supply-chain-security/'>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<div	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-1020'
	>
	<strong>For a practical framework on how to assess and manage that exposure, our guide to software supply chain security</strong> <strong>covers it step by step.</strong></div>		</div>

		<button	class="btn btn--color-infinum btn--size-medium btn--width-default btn__icon-position--right card-simple__btn js-block-card-btn js-card-simple-link"
	data-id="es-1021"
	 tabindex='-1'>
		<div class="btn__inner">
					<div	class='typography typography--size-none js-typography btn__label'
	data-id='es-1022'
	>
	Learn more here</div>		
		<i
	class="icon btn__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='arrow-right-16' data-id='es-1023'>
	<svg fill='none' height='16' viewBox='0 0 17 16' width='17' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'><g stroke='currentColor' stroke-width='2'><path d='m.5 7.99999 14 .00001'/><path d='m9.23352 2.7251 5.97848 5.97852'/><path d='m9.23352 13.2744 5.97848-5.9785'/></g></svg></i>	</div>
	</button>	</div>
</a>
</div>
</div>	</div>
</div>
</div>	</div>

<div
	class="wrapper"
	data-id="es-1089"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-1030">
	</div>

<div class="block-blog-content-main">
	


<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1033"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1031">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1032'
	>
	<strong>How to build a GRC framework: where to start</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1036"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1034">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1035'
	>
	The most common mistake when building a GRC program is starting with the tools or the compliance checklist rather than the risk picture. The sequence matters.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1039"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1037">
	<h3	class='typography typography--size-24-text js-typography block-typography__typography'
	data-id='es-1038'
	>
	<strong>Start with an honest assessment of where you are.</strong> </h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1042"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1040">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1041'
	>
	Map your assets, identify your regulatory obligations, and evaluate whether your current governance structures and compliance programs are actually functioning or just documented. Gaps between what the policies say and what teams do are the most important findings at this stage.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1045"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1043">
	<h3	class='typography typography--size-24-text js-typography block-typography__typography'
	data-id='es-1044'
	>
	<strong>Define your risk appetite.</strong> </h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1048"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1046">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1047'
	>
	Senior leadership needs to agree – explicitly, on paper – on how much risk the organization is willing to accept in different areas. Without that anchor, every risk treatment decision becomes a negotiation.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1051"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1049">
	<h3	class='typography typography--size-24-text js-typography block-typography__typography'
	data-id='es-1050'
	>
	<strong>Prioritize by impact.</strong> </h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1054"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1052">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1053'
	>
	You cannot fix everything at once. Address the highest-risk areas first, assign owners, and set measurable targets. A chief compliance officer or equivalent role provides the continuity needed to drive this process – someone whose job it is to track progress across the organization, not just within a single team.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1057"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1055">
	<h3	class='typography typography--size-24-text js-typography block-typography__typography'
	data-id='es-1056'
	>
	<strong>Build compliance management into operations, not alongside them.</strong></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1060"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1058">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1059'
	>
	Compliance programs that exist in parallel to how work actually gets done produce documentation and little else. The goal is to integrate compliance requirements into everyday workflows so that adherence is the path of least resistance, not an additional burden.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1063"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1061">
	<h3	class='typography typography--size-24-text js-typography block-typography__typography'
	data-id='es-1062'
	>
	<strong>Review regularly.</strong> </h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1066"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1064">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1065'
	>
	A GRC program that isn&#8217;t updated is a liability. Set a cadence for risk register reviews, policy updates, and internal audit cycles. The specific intervals matter less than committing to them.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1069"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1067">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1068'
	>
	<strong>Why GRC builds business trust</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1072"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1070">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1071'
	>
	The organizations that handle security incidents badly are rarely those with the weakest technical controls. They&#8217;re often the ones that didn&#8217;t know what they were protecting, couldn&#8217;t communicate clearly with stakeholders, or had no documented process for responding.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1075"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1073">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1074'
	>
	GRC addresses all of that. It forces honest conversations about risk that many organizations avoid until something goes wrong. It creates accountability at the leadership level. And it produces the documentation and evidence that regulators, customers, and partners increasingly expect as a baseline condition of doing business.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1078"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1076">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1077'
	>
	No organization eliminates risk entirely. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1081"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1079">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1080'
	>
	What GRC provides is something more practical: the ability to understand it, manage it deliberately, and learn from it when things don&#8217;t go according to plan.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1084"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1082">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1083'
	>
	<em>Security decisions made without a governance and risk foundation tend to be reactive, inconsistent, and hard to justify when things go wrong. </em></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1087"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1085">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1086'
	>
	<em>Infinum&#8217;s security practice helps organizations build GRC frameworks that work in the real world – connected to business goals, not just compliance checklists.</em><a href="https://infinum.com/cybersecurity/" id="https://infinum.com/cybersecurity/"><em> Explore our cybersecurity services</em></a><em> to see where we can help.</em></p></div>	</div>
</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/what-is-grc/">What Is GRC? Governance, Risk, and Compliance Explained</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
					<item>
				<image>
					<url>19277675https://infinum.com/uploads/2026/04/pen-vs-red.webp</url>
				</image>
				<title>Pen Testing, Red Teaming, and Why No Scanner Can Replace Either</title>
				<link>https://infinum.com/blog/pen-testing-red-teaming/</link>
				<pubDate>Wed, 01 Apr 2026 14:02:28 +0000</pubDate>
				<dc:creator>Sean McCarthy</dc:creator>
				<guid isPermaLink="false">https://infinum.com/?p=19277675</guid>
				<description>
					<![CDATA[<p>Pen testing and red teaming are often used interchangeably. They're not. Here's what each actually does, when you need which, and why automated scanners can't replace either.</p>
<p>The post <a href="https://infinum.com/blog/pen-testing-red-teaming/">Pen Testing, Red Teaming, and Why No Scanner Can Replace Either</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[

<div
	class="wrapper"
	data-id="es-1215"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-1090">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1093"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1091">
	<p	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-1092'
	>
	<strong>Pen testing and red teaming are often used interchangeably. Both probe your defences. Both find what&#8217;s broken. But they ask fundamentally different questions, and the one you choose shapes how wide you assess your business security.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1096"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1094">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1095'
	>
	<a href="https://infinum.com/cybersecurity/penetration-testing/" id="https://infinum.com/cybersecurity/penetration-testing/" target="_blank" rel="noreferrer noopener">Penetration testing</a> and <a href="https://infinum.com/cybersecurity/red-teaming/" target="_blank" rel="noreferrer noopener">red teaming</a> both start from the same premise: hire someone to break in before the bad guys do. But they&#8217;re different tools for different problems, and conflating them is one of the more common mistakes organisations make.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1099"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1097">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1098'
	>
	Two approaches, similar goal</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1102"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1100">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1101'
	>
	Penetration testing is focused. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1105"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1103">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1104'
	>
	You define the scope – a specific application, a network segment, a set of systems – and testers use the <a href="https://infinum.com/blog/penetration-testing-steps/" target="_blank" rel="noreferrer noopener">penetration testing methodology step by step</a> in an attempt to find and exploit vulnerabilities within it. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1108"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1106">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1107'
	>
	Most engagements use a gray box approach: testers are given enough context to work efficiently. Credentials, access, scope. Enough to find what matters within a fixed timeframe.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1110"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-1109'
	>
	<strong>Red teaming is the opposite of narrow. It&#8217;s intelligence-led and scenario-driven, built to simulate a sophisticated adversary targeting your organisation specifically. </strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1113"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1111">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1112'
	>
	The approach changes depending on who you are – <a href="https://infinum.com/red-team-services/" id="https://infinum.com/red-team-services/">a red team</a> targeting a bank crafts different phishing emails, chooses different attack vectors, and pursues different objectives than one targeting a logistics company. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1116"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1114">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1115'
	>
	The whole exercise is shaped by what real threat actors are actually doing to organisations like yours.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1119"
	 data-animation-target='inner-items'>
		
			<div class="block-group" data-id=es-1118>
	
<div
	class="wrapper"
	data-id="es-1117"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			
<figure class="wp-block-table is-style-first-column-strong"><table class="has-fixed-layout"><thead><tr><th>Pen testing</th><th><strong>Red teaming</strong></th></tr></thead><tbody><tr><td>Narrow, system-focused scope</td><td><strong>Whole-organisation scope</strong></td></tr><tr><td>Often gray box by default</td><td><strong>Intelligence-led, scenario-based</strong></td></tr><tr><td>Time-boxed engagement</td><td><strong>Simulates a real, tailored adversary</strong></td></tr><tr><td>Finds specific technical vulnerabilities</td><td><strong>Tests people, process, technology</strong></td></tr></tbody></table></figure>
		</div>
	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1122"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1120">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1121'
	>
	Penetration Testing vs Red Teaming: Key Differences</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1125"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1123">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1124'
	>
	The simplest way to tell them apart: pen testing answers &#8220;is this system secure?&#8221;, red teaming answers &#8220;could a determined attacker get into our organisation?&#8221;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1128"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1126">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1127'
	>
	Scope is the biggest practical difference. Pen testing is bounded — a specific application, network segment, or set of APIs. The tester works within those limits, finds what&#8217;s exploitable, and reports it. Red teaming has no such boundary. The adversary simulation can move across applications, people, and physical premises, using whatever combination of vectors a real attacker would.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1131"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1129">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1130'
	>
	The objectives differ, too. Pen testing produces a list of technical vulnerabilities with severity ratings and remediation steps. Red teaming produces something more like a case study: here is how an attacker targeting your organisation could move from initial access to their end goal, and here is what your people, processes, and technology did, or didn&#8217;t do to stop them.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1134"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1132">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1133'
	>
	Cost and time reflect this. A pen test might run for a week or two. A red team engagement is typically measured in weeks to months, and requires significantly more planning on both sides.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1137"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1135">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1136'
	>
	When Do You Need Pen Testing vs Red Teaming?</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1140"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1138">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1139'
	>
	Pen testing is right for checking specific systems — after a new build, before a release, or as part of a compliance cycle. TIBER-EU and<a href="https://infinum.com/blog/eu-cybersecurity-legislation-nis2-dora/" id="https://infinum.com/blog/eu-cybersecurity-legislation-nis2-dora/"> DORA</a> both require it. If you&#8217;re running one annually and after major changes, you&#8217;re doing the basics right.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1143"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1141">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1142'
	>
	Red teaming is for organisations that have already done the basics. You need mature security processes in place first — incident detection, response playbooks, trained staff — otherwise a red team engagement mostly finds that your foundations are weak, which a pen test would have told you for a fraction of the cost. When that foundation is there, red teaming stress-tests the whole picture: not just whether systems are patched, but whether your people, processes, and assumptions hold up under a realistic attack.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1146"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1144">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1145'
	>
	The other factor is the threat model. If you handle sensitive data, operate critical infrastructure, or are the kind of target sophisticated threat actors actively pursue, red teaming answers a question pen testing can&#8217;t: not &#8220;is this system secure?&#8221; but &#8220;could a determined adversary get into our organisation?&#8221;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1149"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1147">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1148'
	>
	If you&#8217;re not sure which fits, start with a pen test. And if you want to understand what a red team engagement actually involves, <a href="https://infinum.com/red-team-services/" id="https://infinum.com/red-team-services/">explore our red team services</a>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1152"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1150">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1151'
	>
	Technical depth isn&#8217;t enough</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1155"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1153">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1154'
	>
	The best pen testers and red teamers share two things: deep technical expertise and genuine creativity. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1158"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1156">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1157'
	>
	The technical side is obvious – you need to understand how systems behave under pressure, and how to adapt when a vector doesn&#8217;t work as expected. But creativity is what separates good from exceptional.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1161"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1159">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1160'
	>
	Testing isn&#8217;t a checklist. When a system reacts unexpectedly, the question isn&#8217;t &#8220;what does the tool say next?&#8221; – it&#8217;s &#8220;what does this tell me, and where does it lead?&#8221; That kind of thinking can&#8217;t be scripted. It has to be developed.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1165"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="blockquote block-blockquote__blockquote" data-id="es-1162">
	
	<div class="blockquote__content">
		<i
	class="icon blockquote__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='blockquote-24' data-id='es-1163'>
	<svg fill='none' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path clip-rule='evenodd' d='m12 24c6.6274 0 12-5.3726 12-12 0-2.79685-.9568-5.37021-2.561-7.41062-.581.22951-1.0832.60583-1.5069 1.12898-.5132.60844-.7698 1.41969-.7698 2.43375v.07605h2.5789v5.59004h-5.6197v-5.01962c0-1.11547.154-2.06616.4619-2.85205.3336-.81125.757-1.48307 1.2702-2.01545.528-.52161 1.1175-.92155 1.7687-1.1998-2.0728-1.70651-4.7279-2.73128-7.6223-2.73128-6.62742 0-12 5.37258-12 12 0 6.6274 5.37258 12 12 12zm-3.53811-18.05347c-.30793.78589-.46189 1.73658-.46189 2.85205v5.01962h5.6197v-5.59004h-2.5789v-.07605c0-1.01406.2566-1.82531.7698-2.43375.5389-.63379 1.1804-1.05209 1.9245-1.2549v-2.28164c-.7441.07605-1.4626.25351-2.1555.53238-.6928.27887-1.3086.68449-1.84752 1.21688-.51321.53238-.9366 1.2042-1.27019 2.01545z' fill='currentColor' fill-rule='evenodd'/></svg></i><p	class='typography typography--size-36-text js-typography blockquote__quote'
	data-id='es-1164'
	>
	<strong>You need to think like an attacker – then explain the risk in language a board member can act on.</strong></p>
		<div class="blockquote__caption-wrap">
					</div>
	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1168"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1166">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1167'
	>
	The second half of that matters as much as the first. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1171"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1169">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1170'
	>
	A brilliant technical finding is worthless if it can&#8217;t be translated into plain language. The job isn&#8217;t just to find vulnerabilities – it&#8217;s to help the organisation understand what they mean and what to do about them.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1174"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1172">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1173'
	>
	Why no scanner replaces this</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1177"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1175">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1176'
	>
	<a href="https://infinum.com/blog/security-gaps-in-vibe-coded-applications/" target="_blank">Our research into AI-generated code security</a> found that automated tools are good at cataloging CVEs, misconfigured headers, and outdated libraries. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1180"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1178">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1179'
	>
	They&#8217;re fast, they&#8217;re consistent, and they&#8217;re useful. But they operate on fixed logic. They flag what they&#8217;re programmed to flag, and they stop there.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1183"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1181">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1182'
	>
	A skilled tester doesn&#8217;t stop there. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1186"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1184">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1185'
	>
	They notice how a system reacts, chain together findings that no single tool would connect, and pursue lines of attack that require judgment – not just pattern matching. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1188"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-1187'
	>
	<strong>Automated scanners also can&#8217;t walk through your front door pretending to be IT support, or craft a phishing email convincing enough to fool a trained employee.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1191"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1189">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1190'
	>
	Nine times out of ten, <a href="https://infinum.com/blog/how-do-phishing-simulations-contribute-to-enterprise-security/">real attackers get in through people, not ports</a>. A scanner has nothing to say about that. Manual testing does.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1194"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1192">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1193'
	>
	This is why organisations that rely on automated tools as their primary security layer end up with a false sense of coverage. The scanner ran clean – but that&#8217;s only true for the things the scanner knows how to look for. The cost of finding out too late is well-documented in our breakdown of <a href="https://infinum.com/blog/cyberattack-cost/">the real cost of a cyberattack</a>, which shows what&#8217;s actually at stake.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1197"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1195">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1196'
	>
	Attackers aren&#8217;t limited by that constraint. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1200"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1198">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1199'
	>
	A vendor with a quiet network connection into your environment, a help desk employee who clicks the wrong attachment – these don&#8217;t show up on a dashboard. They show up when it&#8217;s too late.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1207"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<a	class="card-simple js-card-simple card-simple--is-ad block-card__card-simple card-simple--has-link js-card-simple-link card-simple__content-align--left"
	data-id="es-1201"
	 href='https://infinum.com/cybersecurity/'>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<p	class='typography typography--size-36-text js-typography card-simple__heading'
	data-id='es-1202'
	>
	<strong>Want to discover security vulnerabilities before attackers do? </strong></p>		</div>

		<p	class='typography typography--size-16-text-roman js-typography card-simple__paragraph'
	data-id='es-1203'
	 id='es-1201-paragraph'>
	Explore the full list of our cybersecurity services. </p><button	class="btn btn--color-infinum btn--size-small btn--width-default btn__icon-position--right card-simple__btn js-block-card-btn js-card-simple-link"
	data-id="es-1204"
	 tabindex='-1'>
		<div class="btn__inner">
					<div	class='typography typography--size-none js-typography btn__label'
	data-id='es-1205'
	>
	<strong><strong>Learn more</strong></strong></div>		
		<i
	class="icon btn__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='arrow-right-16' data-id='es-1206'>
	<svg fill='none' height='16' viewBox='0 0 17 16' width='17' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'><g stroke='currentColor' stroke-width='2'><path d='m.5 7.99999 14 .00001'/><path d='m9.23352 2.7251 5.97848 5.97852'/><path d='m9.23352 13.2744 5.97848-5.9785'/></g></svg></i>	</div>
	</button>	</div>
</a>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1210"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1208">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1209'
	>
	So, the question isn&#8217;t whether to test. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1213"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1211">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1212'
	>
	It&#8217;s whether you&#8217;re testing the right things, in the right way, with people who can tell the difference. Automated tools have their place – but they&#8217;re a floor, not a ceiling.</p></div>	</div>
</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/pen-testing-red-teaming/">Pen Testing, Red Teaming, and Why No Scanner Can Replace Either</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
					<item>
				<image>
					<url>19277691https://infinum.com/uploads/2026/04/axios-npm-attack.webp</url>
				</image>
				<title>The Axios npm Attack: What It Means for Every JavaScript Project</title>
				<link>https://infinum.com/blog/axios-npm-supply-chain-attack/</link>
				<pubDate>Wed, 01 Apr 2026 13:00:03 +0000</pubDate>
				<dc:creator>Hrvoje Filaković</dc:creator>
				<guid isPermaLink="false">https://infinum.com/?p=19277691</guid>
				<description>
					<![CDATA[<p>axios is the JavaScript library most apps use to talk to the internet. On March 31, two malicious versions were quietly published to npm — and anyone who ran npm install during a three-hour window may have a remote access trojan on their machine. Full technical breakdown inside.</p>
<p>The post <a href="https://infinum.com/blog/axios-npm-supply-chain-attack/">The Axios npm Attack: What It Means for Every JavaScript Project</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[<div
	class="wrapper"
	data-id="es-1412"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-1216">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1219"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1217">
	<p	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-1218'
	>
	On March 31, attackers compromised axios — a JavaScript library downloaded roughly 100 million times a week. Here&#8217;s what happened, who&#8217;s affected, and what to do now.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1222"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1220">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1221'
	>
	If you&#8217;ve never heard of axios, here&#8217;s the short version: it&#8217;s the library that most JavaScript applications use to talk to the internet. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1225"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1223">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1224'
	>
	Fetching data from an API, submitting a form, making a request to a backend service – axios handles it. It&#8217;s in frontend apps, backend services, CI pipelines, and internal tools. Chances are it&#8217;s somewhere in your stack right now, possibly several places.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1228"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1226">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1227'
	>
	<span class='screen-reader-text'>On March 31, 2026, axios—with roughly 100 million weekly downloads—became the vector for one of the most significant npm supply chain attacks in recent memory.</span><span aria-hidden='true'><strong>On March 31, 2026, axios—with roughly 100 million weekly downloads—became the vector for one of the most significant npm supply chain attacks in recent memory.</strong></span></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1230"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-1229'
	>
	Two malicious versions of axios were published to npm: axios@1.14.1 and axios@0.30.4. Both contained a hidden dependency designed to install a cross-platform remote access trojan on any developer machine that ran npm install. The window was under three hours — but given axios&#8217;s scale, that was enough. If your team ships JavaScript and installed either version during that period, treat the affected machine as compromised.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1233"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1231">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1232'
	>
	<strong>You don’t need to have installed axios directly to be at risk. </strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1236"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1234">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1235'
	>
	Any package in your dependency tree that lists axios with a floating version range (<code>^1.x</code>) and was rebuilt during the exposure window may have pulled in the malicious version automatically. This also includes AI coding assistants and automated tooling — anything that ran <code>npm install</code> on your behalf yesterday should be treated the same as a manual install.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1239"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1237">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1238'
	>
	We&#8217;ve written before about <a href="https://infinum.com/blog/software-supply-chain-security/">software supply chain security</a> and the systemic risks that come with modern dependency management. This attack is exactly the scenario we described – not a theoretical edge case, but a live incident affecting one of the most widely used libraries in the JavaScript ecosystem. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1242"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1240">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1241'
	>
	<a href="https://cloud.google.com/blog/topics/threat-intelligence/north-korea-threat-actor-targets-axios-npm-package" id="https://cloud.google.com/blog/topics/threat-intelligence/north-korea-threat-actor-targets-axios-npm-package">Google&#8217;s Threat Intelligence Group</a> has attributed the attack to UNC1069, a North Korean group previously active in cryptocurrency theft. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1245"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1243">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1244'
	>
	Here&#8217;s what happened, how it worked, and what you should check right now.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1248"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1246">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1247'
	>
	<strong>What happened</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1251"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1249">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1250'
	>
	The attacker didn&#8217;t touch a single line of axios source code. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1254"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1252">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1253'
	>
	Instead, they compromised a long-lived npm access token belonging to jasonsaayman, the project&#8217;s lead maintainer. With that token, they published two new releases – one for the 1.x branch and one for the legacy 0.x branch – 39 minutes apart, covering both release lines simultaneously.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1257"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1255">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1256'
	>
	Both releases modified exactly one file: package.json. The only substantive change was adding plain-crypto-js@4.2.1 as a runtime dependency. That package was pre-staged 18 hours earlier, under a separate attacker-controlled account, with a clean version first to build registry history before the malicious update was pushed.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1259"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-1258'
	>
	Why this matters: When you run npm install, you&#8217;re not just downloading the package you asked for — you&#8217;re downloading everything it depends on, including any setup scripts those dependencies declare. The attacker&#8217;s package declared one. Most developers never see this happening. It runs silently, by design. By the time npm install finished, the script had already executed, phoned home, and delivered its payload.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1262"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1260">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1261'
	>
	plain-crypto-js contains a full copy of the legitimate crypto-js library – every source file identical, bit-for-bit. The only difference is a postinstall hook: &#8220;node setup.js&#8221;. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1265"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1263">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1264'
	>
	When npm resolves the dependency tree and runs that hook, the dropper fires. It contacts the attacker&#8217;s command-and-control server, delivers a platform-specific payload for macOS, Windows, or Linux, then deletes itself and replaces package.json with a clean stub reporting version 4.2.0.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1268"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1266">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1267'
	>
	By the time npm install finishes, there&#8217;s no error, no warning, no obvious trace. The directory node_modules/plain-crypto-js/ exists, but npm list shows version 4.2.0 – not the malicious 4.2.1 that actually ran. Standard npm audit finds nothing.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1271"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1269">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1270'
	>
	<strong>Why this specific attack is worth studying</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1274"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1272">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1273'
	>
	Most supply chain incidents involve obvious red flags – a zero-history package, a suspicious name, a sudden maintainer change. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1277"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1275">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1276'
	>
	This one was deliberately engineered to avoid all of them.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1282"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="blockquote block-blockquote__blockquote" data-id="es-1278">
	
	<div class="blockquote__content">
		<i
	class="icon blockquote__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='blockquote-24' data-id='es-1279'>
	<svg fill='none' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path clip-rule='evenodd' d='m12 24c6.6274 0 12-5.3726 12-12 0-2.79685-.9568-5.37021-2.561-7.41062-.581.22951-1.0832.60583-1.5069 1.12898-.5132.60844-.7698 1.41969-.7698 2.43375v.07605h2.5789v5.59004h-5.6197v-5.01962c0-1.11547.154-2.06616.4619-2.85205.3336-.81125.757-1.48307 1.2702-2.01545.528-.52161 1.1175-.92155 1.7687-1.1998-2.0728-1.70651-4.7279-2.73128-7.6223-2.73128-6.62742 0-12 5.37258-12 12 0 6.6274 5.37258 12 12 12zm-3.53811-18.05347c-.30793.78589-.46189 1.73658-.46189 2.85205v5.01962h5.6197v-5.59004h-2.5789v-.07605c0-1.01406.2566-1.82531.7698-2.43375.5389-.63379 1.1804-1.05209 1.9245-1.2549v-2.28164c-.7441.07605-1.4626.25351-2.1555.53238-.6928.27887-1.3086.68449-1.84752 1.21688-.51321.53238-.9366 1.2042-1.27019 2.01545z' fill='currentColor' fill-rule='evenodd'/></svg></i><p	class='typography typography--size-36-text js-typography blockquote__quote'
	data-id='es-1280'
	>
	<strong>Put plainly: most security tools work by recognising known bad things – a flagged domain, a suspicious file, a package with no history. This attack had none of those signals. It arrived under a trusted name, from a legitimate account, with clean source code and a registry history. The tools that were supposed to catch it passed it through.</strong></p>
		<div class="blockquote__caption-wrap">
			<div	class='typography typography--size-12-text-roman js-typography blockquote__caption'
	data-id='es-1281'
	>
	HRVOJE FILAKOVIC, CYBERSECURITY ENGINEER</div>		</div>
	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1285"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1283">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1284'
	>
	That&#8217;s what makes it worth paying attention to, even if axios isn&#8217;t in your stack – the technique will be reused.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1288"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1286">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1287'
	>
	The attacker published a clean decoy package 18 hours before activating the payload – long enough to avoid &#8220;brand new account&#8221; alerts from registry scanners. The malicious axios releases were signed by the legitimate maintainer&#8217;s account. No corresponding commit or tag appeared on GitHub (that gap is the forensic signal, in hindsight), but most CI systems don&#8217;t verify OIDC provenance on pull.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1290"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-1289'
	>
	The plain-crypto-js package was designed to survive a human code review. The library files were identical to the legitimate crypto-js. A developer diffing the package against its stated source would find nothing. The malicious payload lived in package.json and setup.js – a postinstall script that looks, at a glance, like a standard build step.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1293"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1291">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1292'
	>
	This is the attack pattern that <a href="https://infinum.com/blog/eu-cybersecurity-legislation-nis2-dora/">NIS2</a> and <a href="https://infinum.com/blog/cyber-resilience-act/">CRA</a> regulations are increasingly focused on: not a breach of your perimeter, but a compromise of the supply chain your code depends on. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1296"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1294">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1295'
	>
	Your code didn&#8217;t have a vulnerability. Your tooling did.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1299"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1297">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1298'
	>
	<strong>The OIDC misconfiguration that made it possible</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1302"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1300">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1301'
	>
	Axios had OIDC Trusted Publishing configured for its release workflow. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1305"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1303">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1304'
	>
	In theory, this should have made a token-based publish impossible – OIDC ties releases to specific GitHub Actions runs, and the ephemeral token can&#8217;t be stolen.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1308"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1306">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1307'
	>
	In practice, the GitHub Actions workflow passed both the OIDC credentials and a classic NPM_TOKEN environment variable. When both are present, npm defaults to the token. The long-lived token – which can be exfiltrated – was effectively the only authentication method that mattered.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1311"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1309">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1310'
	>
	This is a common misconfiguration. Many projects enable OIDC Trusted Publishing and consider the job done, without removing or rotating the classic token that overrides it.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1314"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1312">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1313'
	>
	<strong>Check if you&#8217;re affected – right now</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1317"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1315">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-1316'
	>
	<strong>Step 1 – Check your lockfile for the malicious versions</strong></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1319"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-php github-light" data-language="php" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #005cc5;">grep</span><span class="token"> </span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #005cc5;">E</span><span class="token"> </span><span class="token" style="color: #032f62;">&#039;</span><span class="token" style="color: #032f62;">&quot;axios&quot;</span><span class="token" style="color: #032f62;">&#039;</span><span class="token"> </span><span class="token" style="color: #005cc5;">package</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #005cc5;">lock</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">json</span><span class="token"> </span><span class="token" style="color: #d73a49;">|</span><span class="token"> </span><span class="token" style="color: #005cc5;">grep</span><span class="token"> </span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #005cc5;">E</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">1\.14\.1|0\.30\.4</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #005cc5;">npm</span><span class="token"> </span><span class="token" style="color: #005cc5;">list</span><span class="token"> </span><span class="token" style="color: #005cc5;">axios</span><span class="token"> </span><span class="token" style="color: #005cc5;">2</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token" style="color: #d73a49;">/</span><span class="token" style="color: #005cc5;">dev</span><span class="token" style="color: #d73a49;">/</span><span class="token" style="color: #005cc5;">null</span><span class="token"> </span><span class="token" style="color: #d73a49;">|</span><span class="token"> </span><span class="token" style="color: #005cc5;">grep</span><span class="token"> </span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #005cc5;">E</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">1\.14\.1|0\.30\.4</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1322"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1320">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-1321'
	>
	<strong>Step 2 – Check for the malicious dependency in node_modules</strong></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1325"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1323">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1324'
	>
	The presence of this directory – regardless of what version package.json now reports – means the dropper executed.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1327"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-php github-light" data-language="php" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #005cc5;">ls</span><span class="token"> </span><span class="token" style="color: #005cc5;">node_modules</span><span class="token" style="color: #d73a49;">/</span><span class="token" style="color: #005cc5;">plain</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #005cc5;">crypto</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #005cc5;">js</span><span class="token"> </span><span class="token" style="color: #005cc5;">2</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token" style="color: #d73a49;">/</span><span class="token" style="color: #005cc5;">dev</span><span class="token" style="color: #d73a49;">/</span><span class="token" style="color: #005cc5;">null</span><span class="token"> </span><span class="token" style="color: #d73a49;">&amp;&amp;</span><span class="token"> </span><span class="token" style="color: #005cc5;">echo</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">DROPPER RAN</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1330"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1328">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-1329'
	>
	<strong>Step 3 – Check for persistent artifacts</strong></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1332"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-php github-light" data-language="php" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #6a737d;">#</span><span class="token" style="color: #6a737d;"> macOS</span><span class="token" style="color: #6a737d;">
</span></span><span class="line"><span class="token" style="color: #005cc5;">ls</span><span class="token"> </span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #005cc5;">la</span><span class="token"> </span><span class="token" style="color: #d73a49;">/</span><span class="token" style="color: #005cc5;">Library</span><span class="token" style="color: #d73a49;">/</span><span class="token" style="color: #005cc5;">Caches</span><span class="token" style="color: #d73a49;">/</span><span class="token" style="color: #005cc5;">com</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">apple</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">act</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">mond</span><span class="token"> </span><span class="token" style="color: #005cc5;">2</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token" style="color: #d73a49;">/</span><span class="token" style="color: #005cc5;">dev</span><span class="token" style="color: #d73a49;">/</span><span class="token" style="color: #005cc5;">null</span><span class="token"> </span><span class="token" style="color: #d73a49;">&amp;&amp;</span><span class="token"> </span><span class="token" style="color: #005cc5;">echo</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">COMPROMISED</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #6a737d;">#</span><span class="token" style="color: #6a737d;"> Linux</span><span class="token" style="color: #6a737d;">
</span></span><span class="line"><span class="token" style="color: #005cc5;">ls</span><span class="token"> </span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #005cc5;">la</span><span class="token"> </span><span class="token" style="color: #d73a49;">/</span><span class="token" style="color: #005cc5;">tmp</span><span class="token" style="color: #d73a49;">/</span><span class="token" style="color: #005cc5;">ld</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">py</span><span class="token"> </span><span class="token" style="color: #005cc5;">2</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token" style="color: #d73a49;">/</span><span class="token" style="color: #005cc5;">dev</span><span class="token" style="color: #d73a49;">/</span><span class="token" style="color: #005cc5;">null</span><span class="token"> </span><span class="token" style="color: #d73a49;">&amp;&amp;</span><span class="token"> </span><span class="token" style="color: #005cc5;">echo</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">COMPROMISED</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #6a737d;">#</span><span class="token" style="color: #6a737d;"> Windows (cmd.exe)</span><span class="token" style="color: #6a737d;">
</span></span><span class="line"><span class="token" style="color: #005cc5;">dir</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">%PROGRAMDATA%\wt.exe</span><span class="token" style="color: #032f62;">&quot;</span><span class="token"> </span><span class="token" style="color: #005cc5;">2</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token" style="color: #005cc5;">nul</span><span class="token"> </span><span class="token" style="color: #d73a49;">&amp;&amp;</span><span class="token"> </span><span class="token" style="color: #005cc5;">echo</span><span class="token"> </span><span class="token" style="color: #005cc5;">COMPROMISED</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1335"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1333">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-1334'
	>
	<strong>If you find any of these</strong></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1338"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1336">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1337'
	>
	The response depends on where the install ran. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1341"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1339">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1340'
	>
	For <strong>ephemeral CI runners</strong> (e.g. GitHub-hosted), the runner is destroyed after each job — rotate any secrets that were injected during the affected run and move on. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1344"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1342">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1343'
	>
	For <strong>developer machines and self-hosted runners</strong>, treat the system as fully compromised: isolate it from the network immediately and re-image it or restore from a verified clean backup taken before March 30. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1346"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-1345'
	>
	<strong>Do not attempt to clean in place — the RAT deploys persistence mechanisms that survive a reboot, so credential rotation on a live system is not sufficient.</strong> </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1349"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1347">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1348'
	>
	Once you have a clean machine, rotate everything that was accessible from it: npm tokens, SSH keys, cloud credentials (AWS, GCP, Azure), CI/CD secrets, and any values in <code>.env</code> files present at install time.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1352"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1350">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-1351'
	>
	<strong>To downgrade cleanly</strong></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1354"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-php github-light" data-language="php" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #005cc5;">npm</span><span class="token"> </span><span class="token" style="color: #005cc5;">install</span><span class="token"> </span><span class="token" style="color: #005cc5;">axios</span><span class="token" style="color: #d73a49;">@</span><span class="token" style="color: #005cc5;">1</span><span class="token" style="color: #005cc5;">.</span><span class="token" style="color: #005cc5;">14</span><span class="token" style="color: #005cc5;">.</span><span class="token" style="color: #005cc5;">0</span><span class="token">  </span><span class="token" style="color: #6a737d;">#</span><span class="token" style="color: #6a737d;"> for 1.x users</span><span class="token" style="color: #6a737d;">
</span></span><span class="line"><span class="token" style="color: #005cc5;">npm</span><span class="token"> </span><span class="token" style="color: #005cc5;">install</span><span class="token"> </span><span class="token" style="color: #005cc5;">axios</span><span class="token" style="color: #d73a49;">@</span><span class="token" style="color: #005cc5;">0</span><span class="token" style="color: #005cc5;">.</span><span class="token" style="color: #005cc5;">30</span><span class="token" style="color: #005cc5;">.</span><span class="token" style="color: #005cc5;">3</span><span class="token">  </span><span class="token" style="color: #6a737d;">#</span><span class="token" style="color: #6a737d;"> for 0.x users</span><span class="token" style="color: #6a737d;">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1357"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1355">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1356'
	>
	<strong>What to change in your CI/CD configuration</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1360"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1358">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1359'
	>
	Beyond the immediate incident, this attack exposes a few controls worth auditing across your pipelines.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1363"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-1361">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-1362'
	>
	<li><strong>Remove or rotate long-lived npm tokens. </strong>If your publish workflow uses a classic NPM_TOKEN alongside OIDC, the token wins. Either remove it from the workflow entirely, or rotate it and restrict it to the minimum necessary scope.</li><li><strong>Add &#8211;ignore-scripts to CI installs. </strong>This prevents postinstall hooks from running during automated builds:</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1365"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-php github-light" data-language="php" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #005cc5;">npm</span><span class="token"> </span><span class="token" style="color: #005cc5;">ci</span><span class="token"> </span><span class="token" style="color: #d73a49;">--</span><span class="token" style="color: #005cc5;">ignore</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #005cc5;">scripts</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1368"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-1366">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-1367'
	>
	<li><strong>Pin versions explicitly. </strong>Avoid floating ranges like ^1.14.0. Both malicious releases were tagged latest, so any unpinned install resolved to them.</li><li><strong>Add provenance verification to your review process. </strong>For major releases of critical packages, check npm registry metadata for OIDC provenance. Legitimate axios 1.x releases show GitHub Actions as the publisher with a trustedPublisher field. The malicious release showed the maintainer&#8217;s username directly – no OIDC binding, no corresponding GitHub tag.</li><li><strong>Block the C2 domain at the network level</strong>. If you have a firewall or DNS filtering in place, block the C2 domain <code>sfrclak[.]com</code> and IP address <code>142[.]11[.]206[.]73</code> on port 8000. Flag this to your network or DevOps team rather than handling it at the host level — a firewall rule covers all machines rather than requiring per-device changes.</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1371"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1369">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1370'
	>
	<strong>The broader pattern</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1374"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1372">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1373'
	>
	This isn&#8217;t an isolated incident. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1377"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1375">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1376'
	>
	The axios attack follows the same playbook as the CrowdStrike npm compromise, the IoliteLabs VSCode extension backdoor, and the <a href="https://infinum.com/blog/openclaw-moltbot-clawdbot-viral-ai-sidekick/">fake ClawdBot VS Code extension</a> we documented earlier this year — all incidents where a trusted-looking package or installer was used to deliver a credential stealer to unsuspecting developers.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1379"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-1378'
	>
	The package manager ecosystem runs on implicit trust: if a package is in npm under a recognizable name and a legitimate maintainer&#8217;s account, most tooling and most developers treat it as safe.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1382"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1380">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1381'
	>
	That model is under sustained attack. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1385"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1383">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1384'
	>
	The attacker here invested 18 hours of prep time, built platform-specific payloads for three operating systems, and designed the dropper to self-destruct. This is not someone experimenting – it&#8217;s operational tradecraft applied to the JavaScript supply chain.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1388"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1386">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1387'
	>
	As we covered in our <a href="https://infinum.com/blog/software-supply-chain-security/">supply chain security framework</a>, the highest-risk entry points are often not your own code but the tools and processes you depend on to build and deploy it. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1391"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1389">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1390'
	>
	The question isn&#8217;t whether your perimeter is secure, it&#8217;s whether your CI pipeline would have caught this before it ran.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1394"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1392">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1393'
	>
	<strong>For teams with third-party risk exposure</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1397"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1395">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1396'
	>
	If you&#8217;re managing a product that runs JavaScript in CI and you have compliance obligations – PCI DSS, NIS2, ISO 27001 – this incident is worth documenting even if you weren&#8217;t affected. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1400"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1398">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1399'
	>
	Our <a href="https://infinum.com/third-party-cyber-risk-management/">third-party cyber risk management</a> work often starts with incidents like this one: not after a breach, but as a trigger to audit what dependency hygiene actually looks like in practice across an engineering org.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1403"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1401">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1402'
	>
	The controls that would have caught this – OIDC provenance checks, version pinning, &#8211;ignore-scripts in CI, outbound network monitoring – aren&#8217;t difficult to implement. They just tend not to exist until something goes wrong.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1406"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1404">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1405'
	>
	If you want to review your current posture, <a href="https://infinum.com/contact/">get in touch</a>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1409"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1407">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1408'
	>
	<strong>Indicators of compromise</strong></h2></div>	</div>

<div
	class="wrapper"
	data-id="es-1410"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			
<figure class="wp-block-table is-style-stripes"><table><tbody><tr><td><strong>Malicious packages</strong></td><td></td></tr><tr><td>Malicious package</td><td>axios@1.14.1 (shasum: 2553649f)</td></tr><tr><td>Malicious package</td><td>axios@0.30.4 (shasum: d6f3f62f)</td></tr><tr><td>Malicious dependency</td><td>plain-crypto-js@4.2.1</td></tr><tr><td>Attacker npm account</td><td>jasonsaayman (email changed to ifstap[at]proton[.]me)</td></tr><tr><td>Staging npm account</td><td>nrwise (email: nrwise[at]proton[.]me)</td></tr><tr><td><strong>Network indicators</strong></td><td></td></tr><tr><td>C2 domain</td><td>sfrclak[.]com</td></tr><tr><td>C2 IP</td><td>142[.]11[.]206[.]73</td></tr><tr><td>C2 URL</td><td>hxxp://sfrclak[.]com:8000/6202033</td></tr><tr><td>C2 port</td><td>8000</td></tr><tr><td>macOS POST body</td><td>packages.npm[.]org/product0</td></tr><tr><td>Windows POST body</td><td>packages.npm[.]org/product1</td></tr><tr><td>Linux POST body</td><td>packages.npm[.]org/product2</td></tr><tr><td><strong>Filesystem artifacts</strong></td><td></td></tr><tr><td>macOS artifact</td><td>/Library/Caches/com.apple.act.mond</td></tr><tr><td>Windows (persistent)</td><td>%PROGRAMDATA%\wt.exe</td></tr><tr><td>Windows temp (self-deletes)</td><td>%TEMP%\6202033.vbs | %TEMP%\6202033.ps1</td></tr><tr><td>Linux artifact</td><td>/tmp/ld.py</td></tr><tr><td><strong>Advisory references</strong></td><td></td></tr><tr><td>GitHub advisory</td><td>GHSA-fw8c-xr5c-95f9</td></tr><tr><td>Malware advisory</td><td>MAL-2026-2306</td></tr><tr><td>Malware family (GTIG)</td><td>WAVESHAPER.V2</td></tr><tr><td><strong>Safe versions</strong></td><td></td></tr><tr><td>Safe 1.x version</td><td>axios@1.14.0 (shasum: 7c29f4cf)</td></tr><tr><td>Safe 0.x version</td><td>axios@0.30.3</td></tr></tbody></table><figcaption class="wp-element-caption"><em>Infinum&#8217;s cybersecurity team provides penetration testing, third-party risk management, and secure development advisory for enterprise and regulated-industry clients. Learn more at </em><a href="https://infinum.com/cybersecurity/"><em>infinum.com/cybersecurity</em></a><em>.</em></figcaption></figure>
		</div>
	</div>


</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/axios-npm-supply-chain-attack/">The Axios npm Attack: What It Means for Every JavaScript Project</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
					<item>
				<image>
					<url>19276916https://infinum.com/uploads/2026/03/android-protection-hero-2.webp</url>
				</image>
				<title>Understanding &#038; Defeating Android Protections</title>
				<link>https://infinum.com/blog/understanding-defeating-android-protections/</link>
				<pubDate>Thu, 19 Mar 2026 11:13:28 +0000</pubDate>
				<dc:creator>Hrvoje Filaković</dc:creator>
				<guid isPermaLink="false">https://infinum.com/?p=19276916</guid>
				<description>
					<![CDATA[<p>Discover how hackers bypass Android root detection, anti-hooking, and anti-debug protections with real code examples and penetration testing techniques to strengthen your mobile security knowledge.</p>
<p>The post <a href="https://infinum.com/blog/understanding-defeating-android-protections/">Understanding &amp; Defeating Android Protections</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[<div
	class="wrapper"
	data-id="es-1857"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-1413">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1416"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1414">
	<p	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-1415'
	>
	Many modern Android applications are highly advanced and operate in sensitive domains like banking, money transfers, and other critical services people rely on daily. A rooted environment gives attackers elevated access to the device, which they can abuse in order to bypass the app’s restrictions, extract sensitive data, and interfere with the app’s behavior.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1419"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1417">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1418'
	>
	To counter these threats, many apps implement protections against common tools and techniques used in reverse engineering. These include anti-root, anti-hook, and anti-debug mechanisms, which are designed to make an attacker’s job significantly more difficult—often requiring considerable effort and creativity to bypass.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1422"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-1420">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-1421'
	>
	<li>Anti-Root – Detects whether the device has been rooted.</li><li>Anti-Hook – Detects function hooking attempts using tools like Frida.</li><li>Anti-Debug – Detects whether the application is being debugged.</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1425"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1423">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1424'
	>
	A practical look at protection mechanisms</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1428"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1426">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1427'
	>
	This article provides other security researchers with a practical look at how some of these protection mechanisms are implemented and how they can be bypassed during <a href="https://infinum.com/blog/penetration-testing-steps/" id="https://infinum.com/blog/penetration-testing-steps/">penetration testing</a> or security research.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1431"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1429">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1430'
	>
	Additionally, by understanding how these protections work, developers can <a href="https://infinum.com/blog/ssdlc-application-security/" id="https://infinum.com/blog/ssdlc-application-security/">build stronger, more resilient security mechanisms</a> into their apps and even extend these ideas to develop more advanced and effective techniques.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1434"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1432">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1433'
	>
	Furthermore, during this research, an application called TamperLab was created. It includes various protection mechanisms to detect whether a device is rooted, whether any hooking is in place, or whether the application is being debugged. The project is fully open-source, and contributions are welcome.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1437"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1435">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1436'
	>
	It can be found on the following GitHub page for you to check out:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1439"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-html github-light" data-language="html" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">https://github.com/infinum/cs-tamperlab
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1442"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-1440"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-1441">
	<picture class="image__picture block-media__image-picture">
								
			<source
				srcset=https://infinum.com/uploads/2026/03/Screenshot-2026-03-17-at-11.23.01-1400x910.webp				media='(max-width: 699px)'
				type=image/webp								height="910"
												width="1400"
				 />
												<img
					src="https://infinum.com/uploads/2026/03/Screenshot-2026-03-17-at-11.23.01.webp"
					class="image__img block-media__image-img"
					alt="TamperLab Android app showing root detection, hook detection, and debug detection status indicators with green and red checkmarks"
										height="968"
															width="1490"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1445"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1443">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1444'
	>
	Anti-Root Protections</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1448"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1446">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1447'
	>
	In this section, we will look at some commonly used root detection techniques and their implementations, and immediately follow each one with an example of how it can be bypassed during testing or reverse engineering.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1451"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1449">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-1450'
	>
	The “One Function” Folly</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1454"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1452">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1453'
	>
	The most common way of implementing protection measures such as anti-root, anti-hook, and anti-debug is by placing all checks inside a single function. This is a common mistake, as it gives attackers the opportunity to <a href="https://infinum.com/blog/ai-generated-code-security-risks/" id="https://infinum.com/blog/ai-generated-code-security-risks/">bypass all protections</a> within seconds.For example, in the following scenario, the <a href="https://github.com/scottyab/rootbeer">RootBeer</a> library is used to quickly demonstrate why placing all checks in a single function can be problematic. As shown in the code snippet below, the isRooted() function is called.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1456"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">boolean</span><span class="token"> </span><span class="token" style="color: #24292e;">isRooted</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #24292e;">rootBeer</span><span class="token">.</span><span class="token" style="color: #6f42c1;">isRooted</span><span class="token">(</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">showRootStatusDialog</span><span class="token">(</span><span class="token">isRooted</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1459"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1457">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1458'
	>
	Such a function includes various methods to detect if the device is rooted.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1461"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">public</span><span class="token"> </span><span class="token" style="color: #d73a49;">boolean</span><span class="token"> </span><span class="token" style="color: #6f42c1;">isRooted</span><span class="token">(</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">return</span><span class="token"> </span><span class="token" style="color: #6f42c1;">detectRootManagementApps</span><span class="token">(</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">||</span><span class="token"> 
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #6f42c1;">detectPotentiallyDangerousApps</span><span class="token">(</span><span class="token">)</span><span class="token">  </span><span class="token" style="color: #d73a49;">||</span><span class="token"> 
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #6f42c1;">checkForBinary</span><span class="token">(</span><span class="token">BINARY_SU</span><span class="token">)</span><span class="token">         </span><span class="token" style="color: #d73a49;">||</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #6f42c1;">checkForDangerousProps</span><span class="token">(</span><span class="token">)</span><span class="token">          </span><span class="token" style="color: #d73a49;">||</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #6f42c1;">checkForRWPaths</span><span class="token">(</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">[</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token" style="color: #24292e;">SNIP</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token">]</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1464"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1462">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1463'
	>
	Although the function includes many ways to detect if the device is rooted, it is not sufficient because the isRooted() function itself can be hooked, allowing an attacker to bypass all detections with a single hook.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1467"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1465">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1466'
	>
	Using the following simple Frida script, we can do exactly that. We obtain a reference to the RootBeer class and hook the isRooted() function, immediately returning false.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1469"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-javascript github-light" data-language="javascript" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #24292e;">Java</span><span class="token">.</span><span class="token" style="color: #6f42c1;">perform</span><span class="token">(</span><span class="token">(</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">=&gt;</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">const</span><span class="token"> </span><span class="token" style="color: #005cc5;">rootbeer</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #24292e;">Java</span><span class="token">.</span><span class="token" style="color: #6f42c1;">use</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">com.scottyab.rootbeer.RootBeer</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #24292e;">rootbeer</span><span class="token">.</span><span class="token" style="color: #24292e;">isRooted</span><span class="token">.</span><span class="token" style="color: #6f42c1;">implementation</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #d73a49;">function</span><span class="token">(</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #24292e;">console</span><span class="token">.</span><span class="token" style="color: #6f42c1;">log</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">[+] isRooted() hooked -&gt; returning false</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">return</span><span class="token"> </span><span class="token" style="color: #005cc5;">false</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1472"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1470">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1471'
	>
	Using the following command, the targeted application can be started with the hook applied.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1474"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">frida </span><span class="token" style="color: #d73a49;">-</span><span class="token">U </span><span class="token" style="color: #d73a49;">-</span><span class="token">l </span><span class="token" style="color: #24292e;">evade_root</span><span class="token">.</span><span class="token" style="color: #24292e;">js</span><span class="token"> </span><span class="token" style="color: #d73a49;">-</span><span class="token">f </span><span class="token" style="color: #24292e;">com</span><span class="token">.</span><span class="token" style="color: #24292e;">hacking</span><span class="token">.</span><span class="token" style="color: #24292e;">tamperlab</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1477"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1475">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1476'
	>
	As shown in the following image, the previously created script successfully bypasses all the checks because they are contained within a single function.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1480"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-1478"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-1479">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_2.webp"
					class="image__img block-media__image-img"
					alt="Frida terminal output showing isRooted() hook successfully returning false, bypassing all RootBeer root checks with a single Frida script"
										height="311"
															width="745"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1483"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1481">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1482'
	>
	Testing this inside TamperLab shows that we successfully bypass the protection measure, and a green checkmark is displayed.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1486"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-1484"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-1485">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_3.webp"
					class="image__img block-media__image-img"
					alt="TamperLab app displaying green checkmark after successful bypass of root detection using Frida isRooted() hook"
										height="310"
															width="478"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1489"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1487">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-1488'
	>
	SU Binary Check (Shell)</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1492"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1490">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1491'
	>
	All rooted Android devices contain the su binary, and any application requiring root access must use su to elevate privileges and perform privileged actions on the device.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1495"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1493">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1494'
	>
	When present on a device, applications can detect the existence of the binary and conclude that the device is rooted. A quick way to check for it is by programmatically executing the which su system command.In my application, I created a simple HelperClass that contains various functionalities and detection methods. One of its purposes is to execute system commands.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1497"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #24292e;">String</span><span class="token"> </span><span class="token" style="color: #24292e;">output</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #24292e;">HelperClass</span><span class="token">.</span><span class="token" style="color: #6f42c1;">executeCommand</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">which su</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1500"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1498">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1499'
	>
	The executeCommand() function essentially passes the given command as an argument to the exec() function, which executes it on the device.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1502"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #24292e;">Process</span><span class="token"> </span><span class="token" style="color: #24292e;">process</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #24292e;">Runtime</span><span class="token">.</span><span class="token" style="color: #6f42c1;">getRuntime</span><span class="token">(</span><span class="token">)</span><span class="token">.</span><span class="token" style="color: #6f42c1;">exec</span><span class="token">(</span><span class="token">command</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #24292e;">BufferedReader</span><span class="token"> </span><span class="token" style="color: #24292e;">reader</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #d73a49;">new</span><span class="token"> </span><span class="token" style="color: #6f42c1;">BufferedReader</span><span class="token">(</span><span class="token" style="color: #d73a49;">new</span><span class="token"> </span><span class="token" style="color: #6f42c1;">InputStreamReader</span><span class="token">(</span><span class="token" style="color: #24292e;">process</span><span class="token">.</span><span class="token" style="color: #6f42c1;">getInputStream</span><span class="token">(</span><span class="token">)</span><span class="token">)</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #24292e;">String</span><span class="token"> </span><span class="token" style="color: #24292e;">output</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #24292e;">reader</span><span class="token">.</span><span class="token" style="color: #6f42c1;">readLine</span><span class="token">(</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #24292e;">reader</span><span class="token">.</span><span class="token" style="color: #6f42c1;">close</span><span class="token">(</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #d73a49;">return</span><span class="token"> output</span><span class="token">;</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1505"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1503">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1504'
	>
	If the su binary exists, the command will return its full system path, otherwise, an error code will be returned.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1508"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1506">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1507'
	>
	Using Frida, we can bypass this technique by hooking the exec() function itself. If we detect a command such as which su, we can replace it at runtime with another non-existent command.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1510"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #24292e;">Java</span><span class="token">.</span><span class="token" style="color: #6f42c1;">perform</span><span class="token">(</span><span class="token">(</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">const</span><span class="token"> Runtime </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #24292e;">Java</span><span class="token">.</span><span class="token" style="color: #6f42c1;">use</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">java.lang.Runtime</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #24292e;">Runtime</span><span class="token">.</span><span class="token" style="color: #24292e;">exec</span><span class="token">.</span><span class="token" style="color: #6f42c1;">overload</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">java.lang.String</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">.</span><span class="token" style="color: #24292e;">implementation</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #6f42c1;">function</span><span class="token">(</span><span class="token">command</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #24292e;">command</span><span class="token">.</span><span class="token" style="color: #6f42c1;">trim</span><span class="token">(</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">===</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">which su</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #24292e;">console</span><span class="token">.</span><span class="token" style="color: #6f42c1;">log</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #005cc5;">\n</span><span class="token" style="color: #032f62;">[i] called exec(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token"> </span><span class="token" style="color: #d73a49;">+</span><span class="token"> command </span><span class="token" style="color: #d73a49;">+</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">)</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #24292e;">console</span><span class="token">.</span><span class="token" style="color: #6f42c1;">log</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #005cc5;">\t</span><span class="token" style="color: #032f62;">[+] returning a fake binary.</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">            command </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">which DoesNotExist</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #d73a49;">return</span><span class="token"> </span><span class="token" style="color: #005cc5;">this</span><span class="token">.</span><span class="token" style="color: #6f42c1;">exec</span><span class="token">(</span><span class="token">command</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">return</span><span class="token"> </span><span class="token" style="color: #005cc5;">this</span><span class="token">.</span><span class="token" style="color: #6f42c1;">exec</span><span class="token">(</span><span class="token">command</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1513"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1511">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1512'
	>
	As demonstrated, by using this technique, we can target specific exec() parameters after reverse engineering the application and bypass the detection mechanisms in place.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1516"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-1514"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-1515">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_4.webp"
					class="image__img block-media__image-img"
					alt="Frida script output intercepting Runtime.exec() call for &quot;which su&quot; command and substituting a non-existent binary path to bypass SU binary shell check"
										height="315"
															width="742"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1519"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1517">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-1518'
	>
	SU Binary Check (Native C/C++)</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1522"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1520">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1521'
	>
	Another way developers may check for the su binary or for rooted devices in general is by writing native C/C++ code using JNI. In case you are unfamiliar, JNI (Java Native Interface) is a framework that allows Java code running on the Android platform to interact with native applications and libraries written in C or C++.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1525"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1523">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1524'
	>
	For example, we can check for the su binary by iterating through common system paths where it might exist, and then using the std::ifstream function to check if the file can be opened.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1527"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">extern </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">C</span><span class="token" style="color: #032f62;">&quot;</span><span class="token"> </span><span class="token" style="color: #24292e;">JNIEXPORT</span><span class="token"> jboolean </span><span class="token" style="color: #24292e;">JNICALL</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">Java_com_hacking_tamperlab_NativeChecks_CheckSuBinaryNative</span><span class="token">(</span><span class="token">JNIEnv </span><span class="token" style="color: #d73a49;">*</span><span class="token">env</span><span class="token">,</span><span class="token"> jclass clazz</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">const</span><span class="token"> </span><span class="token" style="color: #d73a49;">char</span><span class="token" style="color: #d73a49;">*</span><span class="token"> paths</span><span class="token">[</span><span class="token">]</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/data/local/</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/data/local/bin/</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/data/local/xbin/</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/sbin/</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/su/bin/</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/system/bin/</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/system/bin/.ext/</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/system/bin/failsafe/</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/system/sd/xbin/</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/system/usr/we-need-root/</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/system/xbin/</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/cache/</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/data/</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/dev/</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6a737d;">//</span><span class="token" style="color: #6a737d;"> Scan directories for &quot;su&quot; binary, if found return true.</span><span class="token" style="color: #6a737d;">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">for</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #d73a49;">const</span><span class="token"> </span><span class="token" style="color: #d73a49;">char</span><span class="token" style="color: #d73a49;">*</span><span class="token"> path</span><span class="token" style="color: #d73a49;">:</span><span class="token"> paths</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        std</span><span class="token" style="color: #d73a49;">:</span><span class="token" style="color: #d73a49;">:</span><span class="token">string fullPath </span><span class="token" style="color: #d73a49;">=</span><span class="token"> std</span><span class="token" style="color: #d73a49;">:</span><span class="token" style="color: #d73a49;">:</span><span class="token" style="color: #6f42c1;">string</span><span class="token">(</span><span class="token">path</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">+</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">su</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        std</span><span class="token" style="color: #d73a49;">:</span><span class="token" style="color: #d73a49;">:</span><span class="token">ifstream </span><span class="token" style="color: #6f42c1;">file</span><span class="token">(</span><span class="token">fullPath</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #24292e;">file</span><span class="token">.</span><span class="token" style="color: #6f42c1;">good</span><span class="token">(</span><span class="token">)</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #24292e;">file</span><span class="token">.</span><span class="token" style="color: #6f42c1;">close</span><span class="token">(</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #d73a49;">return</span><span class="token"> JNI_TRUE</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">return</span><span class="token"> JNI_FALSE</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1530"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1528">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1529'
	>
	A small Java class is then created to serve as a bridge between the Java code and the native C/C++ code in the application. It uses JNI (Java Native Interface) to perform the native task.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1532"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">public</span><span class="token"> </span><span class="token" style="color: #d73a49;">class</span><span class="token"> </span><span class="token" style="color: #6f42c1;">NativeChecks</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">static</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #24292e;">System</span><span class="token">.</span><span class="token" style="color: #6f42c1;">loadLibrary</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">tamper-lib</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">public</span><span class="token"> </span><span class="token" style="color: #d73a49;">static</span><span class="token"> </span><span class="token" style="color: #d73a49;">native</span><span class="token"> </span><span class="token" style="color: #d73a49;">boolean</span><span class="token"> </span><span class="token" style="color: #6f42c1;">CheckSuBinaryNative</span><span class="token">(</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1535"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1533">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1534'
	>
	Under normal circumstances, you wouldn’t have access to the source code. However, a common way to reverse engineer the application is by decompiling it using <a href="https://github.com/skylot/jadx">JADX</a>, which can be done with the following command.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1537"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">$ jadx </span><span class="token" style="color: #d73a49;">-</span><span class="token">d </span><span class="token" style="color: #6f42c1;">$</span><span class="token">(</span><span class="token">pwd</span><span class="token">)</span><span class="token" style="color: #d73a49;">/</span><span class="token" style="color: #24292e;">TamperLab_Decompiled</span><span class="token"> </span><span class="token" style="color: #6f42c1;">$</span><span class="token">(</span><span class="token">pwd</span><span class="token">)</span><span class="token" style="color: #d73a49;">/</span><span class="token" style="color: #24292e;">TamperLab</span><span class="token">.</span><span class="token" style="color: #24292e;">apk</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1540"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1538">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1539'
	>
	Once decompiled, your application may contain various libraries. You can easily filter through them by searching for files with the .so extension, which indicates native libraries.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1542"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-html github-light" data-language="html" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">$ find TamperLab_Decompiled -type f -name &quot;*.so&quot;                        
</span></span><span class="line"><span class="token">TamperLab_Decompiled/resources/lib/arm64-v8a/libtamper-lib.so
</span></span><span class="line"><span class="token">TamperLab_Decompiled/resources/lib/arm64-v8a/libtoolChecker.so
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1545"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1543">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1544'
	>
	To reverse engineer the library, tools such as <a href="https://github.com/NationalSecurityAgency/ghidra">Ghidra</a> or <a href="https://hex-rays.com/ida-pro">IDA Pro</a> can be used. In this case, Ghidra was used.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1548"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-1546"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-1547">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_5.webp"
					class="image__img block-media__image-img"
					alt="Ghidra decompiled view of libtamper-lib.so native library showing ifstream file check logic, JNI_TRUE return (1) if su binary found, and JNI_FALSE return (0) if not found"
										height="675"
															width="877"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1551"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1549">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1550'
	>
	The decompiled code shows that ifstream is first used (1) to check whether the file exists. Based on this check, the function returns \x01 (JNI_TRUE) (2) if the su binary is found, otherwise, it returns \x00 (JNI_FALSE) (3).</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1554"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1552">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1553'
	>
	Since this is a JNI function and is exposed using extern &#8220;C&#8221;, it appears in the symbol table with the exact name observed in Ghidra.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1556"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #24292e;">Java_com_hacking_tamperlab_NativeChecks_CheckSuBinaryNative</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1559"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1557">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1558'
	>
	Bypassing such checks is relatively straightforward. To hook a native function using Frida, we use Interceptor.attach() and specify the target function using Module.findExportByName().</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1561"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #24292e;">Interceptor</span><span class="token">.</span><span class="token" style="color: #6f42c1;">attach</span><span class="token">(</span><span class="token" style="color: #24292e;">Module</span><span class="token">.</span><span class="token" style="color: #6f42c1;">findExportByName</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">libtamper-lib.so</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">Java_com_hacking_tamperlab_NativeChecks_CheckSuBinaryNative</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">,</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">    onEnter</span><span class="token" style="color: #d73a49;">:</span><span class="token"> </span><span class="token" style="color: #6f42c1;">function</span><span class="token"> </span><span class="token">(</span><span class="token">args</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #24292e;">console</span><span class="token">.</span><span class="token" style="color: #6f42c1;">log</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #005cc5;">\n</span><span class="token" style="color: #032f62;">[i] CheckSuBinaryNative() called</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">    onLeave</span><span class="token" style="color: #d73a49;">:</span><span class="token"> </span><span class="token" style="color: #6f42c1;">function</span><span class="token"> </span><span class="token">(</span><span class="token">retval</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #24292e;">console</span><span class="token">.</span><span class="token" style="color: #6f42c1;">log</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #005cc5;">\t</span><span class="token" style="color: #032f62;">[+] Overriding return with JNI_FALSE</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #24292e;">retval</span><span class="token">.</span><span class="token" style="color: #6f42c1;">replace</span><span class="token">(</span><span class="token" style="color: #005cc5;">0</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1564"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1562">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1563'
	>
	Since we are intercepting a function from the native library, we need to attach to the process while it is already running by using the -n parameter with the following command.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1566"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">frida </span><span class="token" style="color: #d73a49;">-</span><span class="token">U </span><span class="token" style="color: #d73a49;">-</span><span class="token">l </span><span class="token" style="color: #24292e;">evade_root</span><span class="token">.</span><span class="token" style="color: #24292e;">js</span><span class="token"> </span><span class="token" style="color: #d73a49;">-</span><span class="token">n tamperlab
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1569"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1567">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1568'
	>
	As shown in the script&#8217;s output, we successfully bypass the check even though it resides within JNI code.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1572"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-1570"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-1571">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_6.webp"
					class="image__img block-media__image-img"
					alt="Frida Interceptor.attach output showing successful override of CheckSuBinaryNative() return value to JNI_FALSE, bypassing native C/C++ SU binary detection"
										height="320"
															width="745"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1575"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1573">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1574'
	>
	Another clever approach is to hook the open() function instead of the entire native function implemented in the application.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1578"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1576">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1577'
	>
	Since std::ifstream() ultimately invokes the open() system call, we can hook open() to intercept any attempt to access a binary whose path contains &#8220;su&#8221;. We can then substitute that path with a fake one to bypass the check.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1580"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #24292e;">Interceptor</span><span class="token">.</span><span class="token" style="color: #6f42c1;">attach</span><span class="token">(</span><span class="token" style="color: #24292e;">Module</span><span class="token">.</span><span class="token" style="color: #6f42c1;">getExportByName</span><span class="token">(</span><span class="token" style="color: #005cc5;">null</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">open</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">,</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">    onEnter</span><span class="token" style="color: #d73a49;">:</span><span class="token"> </span><span class="token" style="color: #6f42c1;">function</span><span class="token"> </span><span class="token">(</span><span class="token">args</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">const</span><span class="token"> path </span><span class="token" style="color: #d73a49;">=</span><span class="token"> args</span><span class="token">[</span><span class="token" style="color: #005cc5;">0</span><span class="token">]</span><span class="token">.</span><span class="token" style="color: #6f42c1;">readUtf8String</span><span class="token">(</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #24292e;">path</span><span class="token">.</span><span class="token" style="color: #6f42c1;">includes</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">su</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #24292e;">console</span><span class="token">.</span><span class="token" style="color: #6f42c1;">log</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">[i] called open(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token"> </span><span class="token" style="color: #d73a49;">+</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">&#039;</span><span class="token" style="color: #032f62;">&quot;</span><span class="token"> </span><span class="token" style="color: #d73a49;">+</span><span class="token"> path </span><span class="token" style="color: #d73a49;">+</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">&#039;</span><span class="token" style="color: #032f62;">&quot;</span><span class="token"> </span><span class="token" style="color: #d73a49;">+</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">);</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #24292e;">console</span><span class="token">.</span><span class="token" style="color: #6f42c1;">log</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #005cc5;">\t</span><span class="token" style="color: #032f62;">[i] App searching for the &#039;su&#039; binary</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #24292e;">console</span><span class="token">.</span><span class="token" style="color: #6f42c1;">log</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #005cc5;">\t</span><span class="token" style="color: #032f62;">[+] Overriding with random path value.</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #d73a49;">const</span><span class="token"> newPath </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #24292e;">Memory</span><span class="token">.</span><span class="token" style="color: #6f42c1;">allocUtf8String</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/dev/null</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">            args</span><span class="token">[</span><span class="token" style="color: #005cc5;">0</span><span class="token">]</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> newPath</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1583"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1581">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1582'
	>
	As shown in the image, this technique effectively bypasses native checks early by using the -f flag to hook before execution, unlike the -n flag, which attaches the hook while the process is already running.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1586"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-1584"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-1585">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_7.webp"
					class="image__img block-media__image-img"
					alt="Frida script hooking the open() system call to redirect any path containing &quot;su&quot; to /dev/null, bypassing native root detection before process execution using the -f flag"
										height="475"
															width="868"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1589"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1587">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-1588'
	>
	Spoofing /proc/mounts</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1592"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1590">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1591'
	>
	Nowadays, many Android devices are commonly rooted using <a href="https://github.com/topjohnwu/Magisk">Magisk</a>, which comes with a variety of built-in features.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1595"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1593">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1594'
	>
	The /proc/mounts file contains a list of all currently mounted filesystems on the device. Additionally, when a device is rooted using Magisk, it modifies the boot image and mounts partitions dynamically by default, so you may find traces of Magisk there as well.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1598"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-1596"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-1597">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_8.webp"
					class="image__img block-media__image-img"
					alt="Contents of /proc/mounts on a Magisk-rooted Android device showing magisk-related mount entries that reveal root status to detection mechanisms"
										height="171"
															width="1028"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1601"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1599">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1600'
	>
	An implementation to detect this might look like the following, where an application reads the contents of /proc/mounts in search of Magisk.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1603"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-html github-light" data-language="html" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">public static boolean isMagiskInMounts() {
</span></span><span class="line"><span class="token">  try {
</span></span><span class="line"><span class="token">    BufferedReader reader = new BufferedReader(new FileReader(&quot;/proc/mounts&quot;));
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    String line;
</span></span><span class="line"><span class="token">    while ((line = reader.readLine()) != null) {
</span></span><span class="line"><span class="token">      if (line.contains(&quot;magisk&quot;)        ||
</span></span><span class="line"><span class="token">          line.contains(&quot;/sbin/.magisk&quot;) ||
</span></span><span class="line"><span class="token">          line.contains(&quot;/dev/&quot;) &amp;&amp; line.contains(&quot;magisk&quot;)) {
</span></span><span class="line"><span class="token">        return true;
</span></span><span class="line"><span class="token">      }
</span></span><span class="line"><span class="token">    }
</span></span><span class="line"><span class="token">    reader.close();
</span></span><span class="line"><span class="token">  } catch (IOException e) {
</span></span><span class="line"><span class="token">    e.printStackTrace();
</span></span><span class="line"><span class="token">  }
</span></span><span class="line"><span class="token">  return false;
</span></span><span class="line"><span class="token">}
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1606"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1604">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1605'
	>
	To bypass this, we can create a script like the following, where we define a list of mounts that don’t contain Magisk traces or any other suspicious entries, for that matter.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1609"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1607">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1608'
	>
	The first interceptor hooks the open() system call to capture the file descriptor used when accessing /proc/mounts.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1612"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1610">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1611'
	>
	The second interceptor hooks read(), checks if the file descriptor corresponds to /proc/mounts, ensures the content hasn’t already been spoofed (to prevent repeated modifications and potential crashes), and finally replaces the buffer with our fake mount data defined at the top.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1614"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">const</span><span class="token"> fake_mounts </span><span class="token" style="color: #d73a49;">=</span><span class="token"> `
</span></span><span class="line"><span class="token" style="color: #d73a49;">/</span><span class="token">dev</span><span class="token" style="color: #d73a49;">/</span><span class="token">block</span><span class="token" style="color: #d73a49;">/</span><span class="token">dm</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #005cc5;">8</span><span class="token"> </span><span class="token" style="color: #d73a49;">/</span><span class="token"> ext4 ro</span><span class="token">,</span><span class="token">seclabel</span><span class="token">,</span><span class="token">relatime </span><span class="token" style="color: #005cc5;">0</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">
</span></span><span class="line"><span class="token">tmpfs </span><span class="token" style="color: #d73a49;">/</span><span class="token">dev tmpfs rw</span><span class="token">,</span><span class="token">seclabel</span><span class="token">,</span><span class="token">nosuid</span><span class="token">,</span><span class="token">relatime</span><span class="token">,</span><span class="token">size</span><span class="token" style="color: #d73a49;">=</span><span class="token">3896612k</span><span class="token">,</span><span class="token">nr_inodes</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #005cc5;">974153</span><span class="token">,</span><span class="token">mode</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #005cc5;">755</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">
</span></span><span class="line"><span class="token">devpts </span><span class="token" style="color: #d73a49;">/</span><span class="token">dev</span><span class="token" style="color: #d73a49;">/</span><span class="token">pts devpts rw</span><span class="token">,</span><span class="token">seclabel</span><span class="token">,</span><span class="token">relatime</span><span class="token">,</span><span class="token">mode</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #005cc5;">600</span><span class="token">,</span><span class="token">ptmxmode</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #005cc5;">000</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">
</span></span><span class="line"><span class="token">proc </span><span class="token" style="color: #d73a49;">/</span><span class="token">proc proc rw</span><span class="token">,</span><span class="token">relatime</span><span class="token">,</span><span class="token">gid</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #005cc5;">3009</span><span class="token">,</span><span class="token">hidepid</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #005cc5;">2</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">
</span></span><span class="line"><span class="token">sysfs </span><span class="token" style="color: #d73a49;">/</span><span class="token">sys sysfs rw</span><span class="token">,</span><span class="token">seclabel</span><span class="token">,</span><span class="token">relatime </span><span class="token" style="color: #005cc5;">0</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">
</span></span><span class="line"><span class="token">selinuxfs </span><span class="token" style="color: #d73a49;">/</span><span class="token">sys</span><span class="token" style="color: #d73a49;">/</span><span class="token">fs</span><span class="token" style="color: #d73a49;">/</span><span class="token">selinux selinuxfs rw</span><span class="token">,</span><span class="token">relatime </span><span class="token" style="color: #005cc5;">0</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">
</span></span><span class="line"><span class="token">tmpfs </span><span class="token" style="color: #d73a49;">/</span><span class="token">mnt tmpfs rw</span><span class="token">,</span><span class="token">seclabel</span><span class="token">,</span><span class="token">nosuid</span><span class="token">,</span><span class="token">nodev</span><span class="token">,</span><span class="token">noexec</span><span class="token">,</span><span class="token">relatime</span><span class="token">,</span><span class="token">size</span><span class="token" style="color: #d73a49;">=</span><span class="token">3896612k</span><span class="token">,</span><span class="token">nr_inodes</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #005cc5;">974153</span><span class="token">,</span><span class="token">mode</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #005cc5;">755</span><span class="token">,</span><span class="token">gid</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #005cc5;">1000</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">
</span></span><span class="line"><span class="token">tmpfs </span><span class="token" style="color: #d73a49;">/</span><span class="token">mnt</span><span class="token" style="color: #d73a49;">/</span><span class="token">installer tmpfs rw</span><span class="token">,</span><span class="token">seclabel</span><span class="token">,</span><span class="token">nosuid</span><span class="token">,</span><span class="token">nodev</span><span class="token">,</span><span class="token">noexec</span><span class="token">,</span><span class="token">relatime</span><span class="token">,</span><span class="token">size</span><span class="token" style="color: #d73a49;">=</span><span class="token">3896612k</span><span class="token">,</span><span class="token">nr_inodes</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #005cc5;">974153</span><span class="token">,</span><span class="token">mode</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #005cc5;">755</span><span class="token">,</span><span class="token">gid</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #005cc5;">1000</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">
</span></span><span class="line"><span class="token">`</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #d73a49;">const</span><span class="token"> fakeMountBuffer </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #24292e;">Memory</span><span class="token">.</span><span class="token" style="color: #6f42c1;">allocUtf8String</span><span class="token">(</span><span class="token">fake_mounts</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">let fakeMountFds </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #d73a49;">new</span><span class="token"> </span><span class="token" style="color: #6f42c1;">Set</span><span class="token">(</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">let hasSpoofed </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">false</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #24292e;">Interceptor</span><span class="token">.</span><span class="token" style="color: #6f42c1;">attach</span><span class="token">(</span><span class="token" style="color: #24292e;">Module</span><span class="token">.</span><span class="token" style="color: #6f42c1;">getExportByName</span><span class="token">(</span><span class="token" style="color: #005cc5;">null</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #032f62;">&#039;</span><span class="token" style="color: #032f62;">open</span><span class="token" style="color: #032f62;">&#039;</span><span class="token">)</span><span class="token">,</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">    onEnter</span><span class="token" style="color: #d73a49;">:</span><span class="token"> </span><span class="token" style="color: #6f42c1;">function</span><span class="token">(</span><span class="token">args</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #005cc5;">this</span><span class="token">.</span><span class="token" style="color: #24292e;">path</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #24292e;">Memory</span><span class="token">.</span><span class="token" style="color: #6f42c1;">readUtf8String</span><span class="token">(</span><span class="token">args</span><span class="token">[</span><span class="token" style="color: #005cc5;">0</span><span class="token">]</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">    onLeave</span><span class="token" style="color: #d73a49;">:</span><span class="token"> </span><span class="token" style="color: #6f42c1;">function</span><span class="token">(</span><span class="token">retval</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #005cc5;">this</span><span class="token">.</span><span class="token" style="color: #24292e;">path</span><span class="token"> </span><span class="token" style="color: #d73a49;">===</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/proc/mounts</span><span class="token" style="color: #032f62;">&quot;</span><span class="token"> </span><span class="token" style="color: #d73a49;">&amp;&amp;</span><span class="token"> </span><span class="token" style="color: #24292e;">retval</span><span class="token">.</span><span class="token" style="color: #6f42c1;">toInt32</span><span class="token">(</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">&gt;</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #24292e;">console</span><span class="token">.</span><span class="token" style="color: #6f42c1;">log</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">[i] /proc/mounts opened -&gt; file descriptor:</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #24292e;">retval</span><span class="token">.</span><span class="token" style="color: #6f42c1;">toInt32</span><span class="token">(</span><span class="token">)</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #24292e;">fakeMountFds</span><span class="token">.</span><span class="token" style="color: #6f42c1;">add</span><span class="token">(</span><span class="token" style="color: #24292e;">retval</span><span class="token">.</span><span class="token" style="color: #6f42c1;">toInt32</span><span class="token">(</span><span class="token">)</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #24292e;">Interceptor</span><span class="token">.</span><span class="token" style="color: #6f42c1;">attach</span><span class="token">(</span><span class="token" style="color: #24292e;">Module</span><span class="token">.</span><span class="token" style="color: #6f42c1;">getExportByName</span><span class="token">(</span><span class="token" style="color: #005cc5;">null</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #032f62;">&#039;</span><span class="token" style="color: #032f62;">read</span><span class="token" style="color: #032f62;">&#039;</span><span class="token">)</span><span class="token">,</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">    onEnter</span><span class="token" style="color: #d73a49;">:</span><span class="token"> </span><span class="token" style="color: #6f42c1;">function</span><span class="token">(</span><span class="token">args</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #005cc5;">this</span><span class="token">.</span><span class="token" style="color: #24292e;">fd</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> args</span><span class="token">[</span><span class="token" style="color: #005cc5;">0</span><span class="token">]</span><span class="token">.</span><span class="token" style="color: #6f42c1;">toInt32</span><span class="token">(</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #005cc5;">this</span><span class="token">.</span><span class="token" style="color: #24292e;">buf</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> args</span><span class="token">[</span><span class="token" style="color: #005cc5;">1</span><span class="token">]</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #005cc5;">this</span><span class="token">.</span><span class="token" style="color: #24292e;">count</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> args</span><span class="token">[</span><span class="token" style="color: #005cc5;">2</span><span class="token">]</span><span class="token">.</span><span class="token" style="color: #6f42c1;">toInt32</span><span class="token">(</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">    onLeave</span><span class="token" style="color: #d73a49;">:</span><span class="token"> </span><span class="token" style="color: #6f42c1;">function</span><span class="token">(</span><span class="token">retval</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #24292e;">fakeMountFds</span><span class="token">.</span><span class="token" style="color: #6f42c1;">has</span><span class="token">(</span><span class="token" style="color: #005cc5;">this</span><span class="token">.</span><span class="token" style="color: #24292e;">fd</span><span class="token">)</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #d73a49;">!</span><span class="token">hasSpoofed</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #d73a49;">const</span><span class="token"> length </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #24292e;">fake_mounts</span><span class="token">.</span><span class="token" style="color: #24292e;">length</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token">(</span><span class="token">length </span><span class="token" style="color: #d73a49;">&lt;=</span><span class="token"> </span><span class="token" style="color: #005cc5;">this</span><span class="token">.</span><span class="token" style="color: #24292e;">count</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">                    hasSpoofed </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">true</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">                    </span><span class="token" style="color: #24292e;">console</span><span class="token">.</span><span class="token" style="color: #6f42c1;">log</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #005cc5;">\t</span><span class="token" style="color: #032f62;">[+] Spoofing read() from /proc/mounts with fake one.</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">                    </span><span class="token" style="color: #24292e;">Memory</span><span class="token">.</span><span class="token" style="color: #6f42c1;">copy</span><span class="token">(</span><span class="token" style="color: #005cc5;">this</span><span class="token">.</span><span class="token" style="color: #24292e;">buf</span><span class="token">,</span><span class="token"> fakeMountBuffer</span><span class="token">,</span><span class="token"> length</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">                    </span><span class="token" style="color: #24292e;">retval</span><span class="token">.</span><span class="token" style="color: #6f42c1;">replace</span><span class="token">(</span><span class="token">length</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token">}</span><span class="token"> </span><span class="token" style="color: #d73a49;">else</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">                    </span><span class="token" style="color: #24292e;">console</span><span class="token">.</span><span class="token" style="color: #6f42c1;">log</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #005cc5;">\t</span><span class="token" style="color: #032f62;">[-] Buffer too small to spoof.</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token">}</span><span class="token"> </span><span class="token" style="color: #d73a49;">else</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #24292e;">console</span><span class="token">.</span><span class="token" style="color: #6f42c1;">log</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #005cc5;">\t</span><span class="token" style="color: #032f62;">[+] /proc/mounts already spoofed, continuing...</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #24292e;">retval</span><span class="token">.</span><span class="token" style="color: #6f42c1;">replace</span><span class="token">(</span><span class="token" style="color: #005cc5;">0</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1617"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1615">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1616'
	>
	By running the hook, we successfully spoof the contents of /proc/mounts with our fake data, effectively bypassing the detection check.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1620"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-1618"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-1619">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_9.webp"
					class="image__img block-media__image-img"
					alt="Frida script output confirming successful spoofing of /proc/mounts read() call with clean fake mount data, bypassing Magisk detection"
										height="446"
															width="982"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1623"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1621">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1622'
	>
	It’s important to note that these techniques can be implemented and bypassed in various ways. Consequently, multiple solutions and countermeasures exist to address them.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1626"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1624">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1625'
	>
	Anti-Hooking Protections</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1629"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1627">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1628'
	>
	Hooking is a powerful technique used during mobile penetration tests because it allows intercepting, modifying, and monitoring an application’s behavior at runtime. It provides direct access to function calls, arguments, return values, and the internal logic of methods.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1632"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1630">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1631'
	>
	To perform such attacks, <a href="https://github.com/frida/frida">Frida</a> is a widely used tool that enables pentesters and attackers to bypass security controls or extract potentially sensitive data.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1635"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1633">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-1634'
	>
	Frida Port Detection</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1638"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1636">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1637'
	>
	A common way to detect Frida is by checking for open frida-server ports, since Frida communicates using WebSockets. Simple checks often look for ports like 27042 or 27043, which are the default ports used by Frida.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1641"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1639">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1640'
	>
	Such checks can be easily bypassed by simply starting the Frida server on a different port using the following command.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1643"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">.</span><span class="token" style="color: #d73a49;">/</span><span class="token">frida</span><span class="token" style="color: #d73a49;">-</span><span class="token">server</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #005cc5;">16.5</span><span class="token">.</span><span class="token" style="color: #b31d28;font-style: italic;">9</span><span class="token" style="color: #d73a49;">-</span><span class="token">android</span><span class="token" style="color: #d73a49;">-</span><span class="token">arm64 </span><span class="token" style="color: #d73a49;">-</span><span class="token">l </span><span class="token" style="color: #005cc5;">0.0</span><span class="token">.</span><span class="token">0</span><span class="token">.</span><span class="token">0</span><span class="token" style="color: #d73a49;">:</span><span class="token" style="color: #005cc5;">1337</span><span class="token"> </span><span class="token" style="color: #d73a49;">&amp;</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1646"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1644">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1645'
	>
	A more advanced detection method involves scanning all ports by sending specific HTTP requests and checking for a 101 Switching Protocols response, which indicates the presence of a Frida server.An example of such native code would involve sending a WebSocket upgrade request to every open port on the device. If the response contains 101 Switching Protocols, it confirms that a Frida server has been successfully detected.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1648"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">[</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token" style="color: #24292e;">SNIP</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token">]</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #d73a49;">for</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #d73a49;">int</span><span class="token"> </span><span class="token" style="color: #24292e;">i</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">1</span><span class="token">;</span><span class="token"> i </span><span class="token" style="color: #d73a49;">&lt;</span><span class="token"> </span><span class="token" style="color: #005cc5;">65535</span><span class="token">;</span><span class="token"> i</span><span class="token" style="color: #d73a49;">++</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">[</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token" style="color: #24292e;">SNIP</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token">]</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #6f42c1;">connect</span><span class="token">(</span><span class="token">sock</span><span class="token">,</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #d73a49;">const</span><span class="token"> struct sockaddr</span><span class="token" style="color: #d73a49;">*</span><span class="token">)</span><span class="token" style="color: #d73a49;">&amp;</span><span class="token">addr</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #6f42c1;">sizeof</span><span class="token">(</span><span class="token">addr</span><span class="token">)</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">==</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #6f42c1;">snprintf</span><span class="token">(</span><span class="token">req</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #6f42c1;">sizeof</span><span class="token">(</span><span class="token">req</span><span class="token">)</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">                 </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">GET /ws HTTP/1.1</span><span class="token" style="color: #005cc5;">\r</span><span class="token" style="color: #005cc5;">\n</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">                 </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">Host: %s:%d</span><span class="token" style="color: #005cc5;">\r</span><span class="token" style="color: #005cc5;">\n</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">                 </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">Upgrade: websocket</span><span class="token" style="color: #005cc5;">\r</span><span class="token" style="color: #005cc5;">\n</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">                 </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">Connection: Upgrade</span><span class="token" style="color: #005cc5;">\r</span><span class="token" style="color: #005cc5;">\n</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">                 </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">Sec-WebSocket-Key: CpxD2C5REVLHvsUC9YAoqg==</span><span class="token" style="color: #005cc5;">\r</span><span class="token" style="color: #005cc5;">\n</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">                 </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">Sec-WebSocket-Version: 13</span><span class="token" style="color: #005cc5;">\r</span><span class="token" style="color: #005cc5;">\n</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">                 </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">User-Agent: Frida</span><span class="token" style="color: #005cc5;">\r</span><span class="token" style="color: #005cc5;">\n</span><span class="token" style="color: #005cc5;">\r</span><span class="token" style="color: #005cc5;">\n</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">                 </span><span class="token" style="color: #6f42c1;">inet_ntoa</span><span class="token">(</span><span class="token" style="color: #24292e;">addr</span><span class="token">.</span><span class="token" style="color: #24292e;">sin_addr</span><span class="token">)</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #6f42c1;">ntohs</span><span class="token">(</span><span class="token" style="color: #24292e;">addr</span><span class="token">.</span><span class="token" style="color: #24292e;">sin_port</span><span class="token">)</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #6f42c1;">write</span><span class="token">(</span><span class="token">sock</span><span class="token">,</span><span class="token"> req</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #6f42c1;">strlen</span><span class="token">(</span><span class="token">req</span><span class="token">)</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">        ssize_t bytes_read </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #6f42c1;">read</span><span class="token">(</span><span class="token">sock</span><span class="token">,</span><span class="token"> res</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #6f42c1;">sizeof</span><span class="token">(</span><span class="token">res</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">-</span><span class="token"> </span><span class="token" style="color: #005cc5;">1</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token">(</span><span class="token">bytes_read </span><span class="token" style="color: #d73a49;">&gt;</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">                res</span><span class="token">[</span><span class="token">bytes_read</span><span class="token">]</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&#039;</span><span class="token" style="color: #005cc5;">\0</span><span class="token" style="color: #032f62;">&#039;</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #6f42c1;">strstr</span><span class="token">(</span><span class="token">res</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">101 Switching Protocols</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">                    </span><span class="token" style="color: #6f42c1;">close</span><span class="token">(</span><span class="token">sock</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #d73a49;">return</span><span class="token"> JNI_TRUE</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">[</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token" style="color: #24292e;">SNIP</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token">]</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1651"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1649">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1650'
	>
	This check can be bypassed by hooking the read() calls and inspecting the buffer content after the call completes. If the buffer contains 101 Switching Protocols, indicating a Frida server query, we can modify the response to something benign such as HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n to evade detection.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1653"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #24292e;">Interceptor</span><span class="token">.</span><span class="token" style="color: #6f42c1;">attach</span><span class="token">(</span><span class="token" style="color: #24292e;">Module</span><span class="token">.</span><span class="token" style="color: #6f42c1;">findExportByName</span><span class="token">(</span><span class="token" style="color: #005cc5;">null</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">read</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">,</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">    onEnter</span><span class="token" style="color: #d73a49;">:</span><span class="token"> </span><span class="token" style="color: #6f42c1;">function</span><span class="token">(</span><span class="token">args</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #005cc5;">this</span><span class="token">.</span><span class="token" style="color: #24292e;">buffer</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> args</span><span class="token">[</span><span class="token" style="color: #005cc5;">1</span><span class="token">]</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #005cc5;">this</span><span class="token">.</span><span class="token" style="color: #24292e;">size</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> args</span><span class="token">[</span><span class="token" style="color: #005cc5;">2</span><span class="token">]</span><span class="token">.</span><span class="token" style="color: #6f42c1;">toInt32</span><span class="token">(</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #005cc5;">this</span><span class="token">.</span><span class="token" style="color: #24292e;">curr_retval</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">    onLeave</span><span class="token" style="color: #d73a49;">:</span><span class="token"> </span><span class="token" style="color: #6f42c1;">function</span><span class="token">(</span><span class="token">retval</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #005cc5;">this</span><span class="token">.</span><span class="token" style="color: #24292e;">curr_retval</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #24292e;">retval</span><span class="token">.</span><span class="token" style="color: #6f42c1;">toInt32</span><span class="token">(</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #005cc5;">this</span><span class="token">.</span><span class="token" style="color: #24292e;">curr_retval</span><span class="token"> </span><span class="token" style="color: #d73a49;">&gt;</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #d73a49;">var</span><span class="token"> </span><span class="token" style="color: #24292e;">response</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">this</span><span class="token">.</span><span class="token" style="color: #24292e;">buffer</span><span class="token">.</span><span class="token" style="color: #6f42c1;">readCString</span><span class="token">(</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #24292e;">response</span><span class="token">.</span><span class="token" style="color: #6f42c1;">includes</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">101 Switching Protocols</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #24292e;">console</span><span class="token">.</span><span class="token" style="color: #6f42c1;">log</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #005cc5;">\n</span><span class="token" style="color: #032f62;">[i] Application detected Frida server via WebSocket</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #24292e;">console</span><span class="token">.</span><span class="token" style="color: #6f42c1;">log</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #005cc5;">\t</span><span class="token" style="color: #032f62;">[+] Modifying the WebSocket response</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">                
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #d73a49;">var</span><span class="token"> </span><span class="token" style="color: #24292e;">modifiedResponse</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">HTTP/1.1 200 OK</span><span class="token" style="color: #005cc5;">\r</span><span class="token" style="color: #005cc5;">\n</span><span class="token" style="color: #032f62;">Content-Length: 0</span><span class="token" style="color: #005cc5;">\r</span><span class="token" style="color: #005cc5;">\n</span><span class="token" style="color: #005cc5;">\r</span><span class="token" style="color: #005cc5;">\n</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #005cc5;">this</span><span class="token">.</span><span class="token" style="color: #24292e;">buffer</span><span class="token">.</span><span class="token" style="color: #6f42c1;">writeUtf8String</span><span class="token">(</span><span class="token">modifiedResponse</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #24292e;">retval</span><span class="token">.</span><span class="token" style="color: #6f42c1;">replace</span><span class="token">(</span><span class="token" style="color: #24292e;">modifiedResponse</span><span class="token">.</span><span class="token" style="color: #24292e;">length</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1656"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1654">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1655'
	>
	As demonstrated, once the hook is executed, the check is successfully bypassed.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1659"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-1657"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-1658">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_10.webp"
					class="image__img block-media__image-img"
					alt="Frida read() hook modifying WebSocket 101 Switching Protocols response to HTTP 200 OK, successfully bypassing Frida port detection across all 65535 ports"
										height="313"
															width="755"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1662"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1660">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-1661'
	>
	Frida Threads Detection</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1665"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1663">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1664'
	>
	In Linux-based environments (including Android), each process has a task directory located at /proc/self/task, containing a subdirectory for each thread within the process. Each of these subdirectories includes a comm file that holds the name of the corresponding thread.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1668"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1666">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1667'
	>
	When Frida is injected into a process, it typically creates several threads for its internal operations. These threads often have distinctive names such as frida, gum-js-loop, gmain, gdbus or some other which can be used to detect Frida&#8217;s presence.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1671"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1669">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1670'
	>
	To better understand this, we can run the following command on the device to retrieve the names of all threads for a specified process.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1673"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">PPID</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #6f42c1;">$</span><span class="token">(</span><span class="token">pidof </span><span class="token" style="color: #24292e;">com</span><span class="token">.</span><span class="token" style="color: #24292e;">hacking</span><span class="token">.</span><span class="token" style="color: #24292e;">tamperlab</span><span class="token">)</span><span class="token">;</span><span class="token"> </span><span class="token" style="color: #d73a49;">for</span><span class="token"> i in </span><span class="token" style="color: #d73a49;">/</span><span class="token">proc</span><span class="token" style="color: #d73a49;">/</span><span class="token">$PPID</span><span class="token" style="color: #d73a49;">/</span><span class="token">task</span><span class="token" style="color: #6a737d;">/*</span><span class="token" style="color: #6a737d;">; do cat &quot;$i/comm&quot; 2&gt;/dev/null; done
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1676"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1674">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1675'
	>
	As shown in the following snippet, this is the output of the thread list when no Frida hooks are active.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1678"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">[</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token" style="color: #24292e;">SNIP</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token">]</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #24292e;">cking</span><span class="token">.</span><span class="token" style="color: #24292e;">tamperlab</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #24292e;">Signal</span><span class="token"> </span><span class="token" style="color: #24292e;">Catcher</span><span class="token">
</span></span><span class="line"><span class="token">perfetto_hprof_
</span></span><span class="line"><span class="token">ADB</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #24292e;">JDWP</span><span class="token"> </span><span class="token" style="color: #24292e;">Connec</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #24292e;">Jit</span><span class="token"> thread pool
</span></span><span class="line"><span class="token">mali</span><span class="token" style="color: #d73a49;">-</span><span class="token">utility</span><span class="token" style="color: #d73a49;">-</span><span class="token">wo
</span></span><span class="line"><span class="token">mali</span><span class="token" style="color: #d73a49;">-</span><span class="token">cmar</span><span class="token" style="color: #d73a49;">-</span><span class="token">backe
</span></span><span class="line"><span class="token">ged</span><span class="token" style="color: #d73a49;">-</span><span class="token">swd
</span></span><span class="line"><span class="token">[</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token" style="color: #24292e;">SNIP</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token">]</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1681"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1679">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1680'
	>
	When a Frida hook is applied to the process, threads named gmain and gdbus appear both associated with Frida’s runtime. This allows us to detect Frida based on the presence of these thread names.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1683"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">[</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token" style="color: #24292e;">SNIP</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token">]</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #24292e;">cking</span><span class="token">.</span><span class="token" style="color: #24292e;">tamperlab</span><span class="token">
</span></span><span class="line"><span class="token">perfetto_hprof_
</span></span><span class="line"><span class="token">ADB</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #24292e;">JDWP</span><span class="token"> </span><span class="token" style="color: #24292e;">Connec</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #24292e;">Jit</span><span class="token"> thread pool
</span></span><span class="line"><span class="token">mali</span><span class="token" style="color: #d73a49;">-</span><span class="token">cmar</span><span class="token" style="color: #d73a49;">-</span><span class="token">backe
</span></span><span class="line"><span class="token" style="color: #24292e;">RenderThread</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #24292e;">cking</span><span class="token">.</span><span class="token" style="color: #24292e;">tamperlab</span><span class="token">
</span></span><span class="line"><span class="token">gmain
</span></span><span class="line"><span class="token">gdbus
</span></span><span class="line"><span class="token">[</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token" style="color: #24292e;">SNIP</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token">]</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1686"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1684">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1685'
	>
	To detect this, we can use C++ code like the following, which loops through each comm file in the /proc/self/task directory to retrieve thread names and checks them against a list of common thread names used by Frida.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1688"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-php github-light" data-language="php" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">[</span><span class="token" style="color: #d73a49;">...</span><span class="token" style="color: #005cc5;">SNIP</span><span class="token" style="color: #d73a49;">...</span><span class="token">]</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #005cc5;">DIR</span><span class="token"> </span><span class="token" style="color: #d73a49;">*</span><span class="token" style="color: #005cc5;">dir</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">opendir</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/proc/self/task</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">[</span><span class="token" style="color: #d73a49;">...</span><span class="token" style="color: #005cc5;">SNIP</span><span class="token" style="color: #d73a49;">...</span><span class="token">]</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #005cc5;">struct</span><span class="token"> </span><span class="token" style="color: #005cc5;">dirent</span><span class="token"> </span><span class="token" style="color: #d73a49;">*</span><span class="token" style="color: #005cc5;">entry</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #005cc5;">char</span><span class="token"> </span><span class="token" style="color: #005cc5;">path</span><span class="token">[</span><span class="token" style="color: #005cc5;">PATH_MAX</span><span class="token">]</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #005cc5;">char</span><span class="token"> </span><span class="token" style="color: #005cc5;">comm</span><span class="token">[</span><span class="token" style="color: #005cc5;">256</span><span class="token">]</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">while</span><span class="token"> </span><span class="token">(</span><span class="token">(</span><span class="token" style="color: #005cc5;">entry</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">readdir</span><span class="token">(</span><span class="token" style="color: #005cc5;">dir</span><span class="token">)</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">!=</span><span class="token"> </span><span class="token" style="color: #005cc5;">NULL</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">[</span><span class="token" style="color: #d73a49;">...</span><span class="token" style="color: #005cc5;">SNIP</span><span class="token" style="color: #d73a49;">...</span><span class="token">]</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #6f42c1;">snprintf</span><span class="token">(</span><span class="token" style="color: #005cc5;">path</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #005cc5;">sizeof</span><span class="token">(</span><span class="token" style="color: #005cc5;">path</span><span class="token">)</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/proc/self/task/%s/comm</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #005cc5;">entry</span><span class="token" style="color: #d73a49;">-&gt;</span><span class="token" style="color: #24292e;">d_name</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">[</span><span class="token" style="color: #d73a49;">...</span><span class="token" style="color: #005cc5;">SNIP</span><span class="token" style="color: #d73a49;">...</span><span class="token">]</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #005cc5;">fgets</span><span class="token">(</span><span class="token" style="color: #005cc5;">comm</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #005cc5;">sizeof</span><span class="token">(</span><span class="token" style="color: #005cc5;">comm</span><span class="token">)</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #005cc5;">fp</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">!=</span><span class="token"> </span><span class="token" style="color: #005cc5;">NULL</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #005cc5;">comm</span><span class="token">[</span><span class="token" style="color: #005cc5;">strcspn</span><span class="token">(</span><span class="token" style="color: #005cc5;">comm</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #005cc5;">\n</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">]</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">            
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #005cc5;">strstr</span><span class="token">(</span><span class="token" style="color: #005cc5;">comm</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">frida</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">||</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #005cc5;">strstr</span><span class="token">(</span><span class="token" style="color: #005cc5;">comm</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">gum</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">   </span><span class="token" style="color: #d73a49;">||</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #005cc5;">strstr</span><span class="token">(</span><span class="token" style="color: #005cc5;">comm</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">gmain</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #005cc5;">fclose</span><span class="token">(</span><span class="token" style="color: #005cc5;">fp</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #005cc5;">closedir</span><span class="token">(</span><span class="token" style="color: #005cc5;">dir</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #d73a49;">return</span><span class="token"> </span><span class="token" style="color: #005cc5;">JNI_TRUE</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #005cc5;">fclose</span><span class="token">(</span><span class="token" style="color: #005cc5;">fp</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #005cc5;">closedir</span><span class="token">(</span><span class="token" style="color: #005cc5;">dir</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">return</span><span class="token"> </span><span class="token" style="color: #005cc5;">JNI_FALSE</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">[</span><span class="token" style="color: #d73a49;">...</span><span class="token" style="color: #005cc5;">SNIP</span><span class="token" style="color: #d73a49;">...</span><span class="token">]</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1691"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1689">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1690'
	>
	One intriguing approach to evade detection is to patch the entire frida-server binary by replacing all occurrences of strings like gmain. By searching for gmain in Ghidra, we can observe the following results.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1694"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-1692"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-1693">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_11.webp"
					class="image__img block-media__image-img"
					alt="Ghidra search results showing multiple occurrences of the &quot;gmain&quot; string inside the frida-server binary, used for Frida thread name detection"
										height="522"
															width="917"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1697"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1695">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1696'
	>
	By selecting one of the instances, we can examine the disassembled code to pinpoint its exact location.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1700"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-1698"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-1699">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_12.webp"
					class="image__img block-media__image-img"
					alt="Ghidra disassembly view showing exact memory location of the gmain string in the frida-server binary for targeted patching"
										height="305"
															width="848"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1703"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1701">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1702'
	>
	We can now use Ghidra’s built-in hex editor to modify these strings, replacing gmain with another string, such as hackr.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1706"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-1704"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-1705">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_13.webp"
					class="image__img block-media__image-img"
					alt="Ghidra hex editor view showing gmain string being replaced with hackr to rename Frida&#039;s internal thread and evade thread-name-based detection"
										height="247"
															width="933"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1709"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1707">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1708'
	>
	After injecting the Frida hook, we can see that we have successfully bypassed the detection, as it no longer identifies Frida’s threads.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1712"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-1710"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-1711">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_14.webp"
					class="image__img block-media__image-img"
					alt="Frida injection output after frida-server binary patch showing Frida threads no longer detected, with renamed thread appearing as hackr instead of gmain"
										height="310"
															width="478"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1715"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1713">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1714'
	>
	If we loop through the thread names again for the application we are attacking, we can see that it now successfully contains the hackr thread name.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1717"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">[</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token" style="color: #24292e;">SNIP</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token">]</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #24292e;">cking</span><span class="token">.</span><span class="token" style="color: #24292e;">tamperlab</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #24292e;">ReferenceQueueD</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #24292e;">FinalizerDaemon</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #24292e;">FinalizerWatchd</span><span class="token">
</span></span><span class="line"><span class="token">binder</span><span class="token" style="color: #d73a49;">:</span><span class="token" style="color: #005cc5;">7261_1</span><span class="token">
</span></span><span class="line"><span class="token">binder</span><span class="token" style="color: #d73a49;">:</span><span class="token" style="color: #005cc5;">7261_2</span><span class="token">
</span></span><span class="line"><span class="token">hackr
</span></span><span class="line"><span class="token">gdbus
</span></span><span class="line"><span class="token">[</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token" style="color: #24292e;">SNIP</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token">]</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1720"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1718">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1719'
	>
	Of course, there are other detectable strings, but this simple example demonstrates one way to bypass detection by directly patching the frida-server binary yourself. This way you could build an entirely different frida-server to avoid detections or modify the original source code as well.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1723"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1721">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1722'
	>
	Anti-Debug Protections</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1726"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1724">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1725'
	>
	Anti-debug protections are another way to protect your Android application from reverse engineering. These mechanisms aim to detect or prevent debugging attempts, stopping attackers from stepping through the app’s code instruction by instruction to understand its internal logic.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1729"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1727">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1728'
	>
	Like most security measures, anti-debug mechanisms can also be bypassed using Frida hooks. However, I want to show you how you can defeat these protections using a debugger itself.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1732"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1730">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-1731'
	>
	Defeating Anti-Debug using Debugger</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1735"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1733">
	<h4	class='typography typography--size-24-text js-typography block-typography__typography'
	data-id='es-1734'
	>
	isDebuggerConnected()</h4></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1738"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1736">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1737'
	>
	This is a simple, ready-made function that checks if a debugger is connected to the application. It returns true if a debugger is detected, otherwise, it returns false.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1741"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1739">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1740'
	>
	Implementing such a function is straightforward, and you can call it as follows:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1743"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #24292e;">Debug</span><span class="token">.</span><span class="token" style="color: #6f42c1;">isDebuggerConnected</span><span class="token">(</span><span class="token">)</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1746"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1744">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1745'
	>
	To use the debugger and bypass this check, we can utilize JADX’s integrated debugger. Before launching it, ensure the application is already running.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1749"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1747">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1748'
	>
	Another way to start an application is by using the following ADB command, which will launch the app but pause and wait for the debugger to attach.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1751"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">adb shell am set</span><span class="token" style="color: #d73a49;">-</span><span class="token">debug</span><span class="token" style="color: #d73a49;">-</span><span class="token">app </span><span class="token" style="color: #d73a49;">-</span><span class="token">w </span><span class="token" style="color: #24292e;">com</span><span class="token">.</span><span class="token" style="color: #24292e;">hacking</span><span class="token">.</span><span class="token" style="color: #24292e;">tamperlab</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1754"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1752">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1753'
	>
	As shown, when you launch the application, it will display a message indicating that it is waiting for a debugger.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1757"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-1755"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-1756">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_15.webp"
					class="image__img block-media__image-img"
					alt="Android device screen showing &quot;Waiting For Debugger&quot; dialog after launching TamperLab with ADB debug flag, pausing app execution until debugger attaches"
										height="214"
															width="355"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1760"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1758">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1759'
	>
	In my case, it doesn’t work, but I can open the application without it waiting for the debugger. However, your application might require this behavior, so it’s important to test both methods.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1763"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1761">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1762'
	>
	Additionally, whenever you’re done or close the application, make sure to run the following command to remove the app from waiting for a debugger.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1765"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">adb shell am clear</span><span class="token" style="color: #d73a49;">-</span><span class="token">debug</span><span class="token" style="color: #d73a49;">-</span><span class="token">app
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1768"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1766">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1767'
	>
	Once ready, you can open JADX and load the APK file of the target application. You can also pull the APK from your device using ADB.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1771"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1769">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1770'
	>
	Once loaded into JADX, select the green bug icon, which opens a dialog prompting you to choose the application to debug along with its process ID.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1774"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-1772"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-1773">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_16.webp"
					class="image__img block-media__image-img"
					alt="JADX integrated debugger showing process selection dialog for com.hacking.tamperlab to attach debugger to the running TamperLab application"
										height="255"
															width="864"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1777"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1775">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1776'
	>
	After the debugger attaches, the application’s execution is automatically paused inside the MainActivity. You can then press the green play button to continue running the application.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1780"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-1778"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-1779">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_17.webp"
					class="image__img block-media__image-img"
					alt="JADX debugger paused at MainActivity entry point after attaching, with green play button ready to resume application execution"
										height="377"
															width="968"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1783"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1781">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1782'
	>
	Once you find the correct position to set a breakpoint, you can do so by pressing the F2 key. For this example, I set the breakpoint exactly where the isDebuggerConnected() function is called.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1786"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-1784"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-1785">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_18.webp"
					class="image__img block-media__image-img"
					alt="JADX debugger showing breakpoint set on invoke-static opcode calling isDebuggerConnected(), with v0 register visible in the debug variables panel"
										height="239"
															width="957"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1789"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1787">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1788'
	>
	The following instruction essentially calls the isDebuggerConnected() function using the invoke-static opcode.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1791"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">invoke</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #d73a49;">static</span><span class="token"> </span><span class="token">{</span><span class="token">}</span><span class="token">,</span><span class="token"> Landroid</span><span class="token" style="color: #d73a49;">/</span><span class="token">os</span><span class="token" style="color: #d73a49;">/</span><span class="token">Debug</span><span class="token">;</span><span class="token" style="color: #d73a49;">-&gt;</span><span class="token" style="color: #6f42c1;">isDebuggerConnected</span><span class="token">(</span><span class="token">)</span><span class="token">Z # method</span><span class="token">@</span><span class="token" style="color: #d73a49;">0008</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1794"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1792">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1793'
	>
	Then, the move-result instruction moves the return value of the function (either true or false) into the v0 register.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1796"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-html github-light" data-language="html" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">move-result v0
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1799"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1797">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1798'
	>
	By stepping over these two instructions, we can observe that the v0 register contains the value 1, indicating that a debugger has been detected.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1802"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-1800"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-1801">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_19.webp"
					class="image__img block-media__image-img"
					alt="JADX debugger showing v0 register containing value 1 (true) after move-result instruction, confirming debugger was detected by isDebuggerConnected()"
										height="324"
															width="1129"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1805"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1803">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1804'
	>
	To bypass this check, we can simply set the value to 0 using the debugger, as shown below:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1808"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-1806"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-1807">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_20.webp"
					class="image__img block-media__image-img"
					alt="JADX debugger view showing v0 register value manually overridden to 0 (false) to bypass isDebuggerConnected() check during live debugging session"
										height="302"
															width="1139"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1811"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1809">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1810'
	>
	Continuing the application’s execution, we successfully bypass the check by manipulating the variables during debugging.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1814"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-1812"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-1813">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_21.webp"
					class="image__img block-media__image-img"
					alt="TamperLab app showing green checkmark after successfully bypassing isDebuggerConnected() anti-debug protection by manipulating register value in JADX debugger"
										height="261"
															width="344"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1817"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1815">
	<h4	class='typography typography--size-24-text js-typography block-typography__typography'
	data-id='es-1816'
	>
	Detection via USB &amp; ADB</h4></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1820"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1818">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1819'
	>
	Another interesting way to detect debugging is by checking if the device is connected via USB with ADB enabled. While this isn’t a direct debugger detection method, it remains a useful check nonetheless.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1823"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1821">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1822'
	>
	A simple implementation might look like the following, where the app dynamically listens for the USB_STATE broadcast and parses the connected and adb boolean extras from the received intent.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1825"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-java github-light" data-language="java" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">[</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token" style="color: #24292e;">SNIP</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token">]</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #24292e;">IntentFilter</span><span class="token"> </span><span class="token" style="color: #24292e;">filter</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #d73a49;">new</span><span class="token"> </span><span class="token" style="color: #6f42c1;">IntentFilter</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">android.hardware.usb.action.USB_STATE</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #24292e;">BroadcastReceiver</span><span class="token"> </span><span class="token" style="color: #24292e;">usbReceiver</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #d73a49;">new</span><span class="token"> </span><span class="token" style="color: #6f42c1;">BroadcastReceiver</span><span class="token">(</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token">@</span><span class="token" style="color: #d73a49;">Override</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #d73a49;">public</span><span class="token"> </span><span class="token" style="color: #d73a49;">void</span><span class="token"> </span><span class="token" style="color: #6f42c1;">onReceive</span><span class="token">(</span><span class="token" style="color: #24292e;">Context</span><span class="token"> </span><span class="token" style="color: #e36209;">ctx</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #24292e;">Intent</span><span class="token"> </span><span class="token" style="color: #e36209;">intent</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #d73a49;">boolean</span><span class="token"> </span><span class="token" style="color: #24292e;">connected</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #24292e;">intent</span><span class="token">.</span><span class="token" style="color: #6f42c1;">getBooleanExtra</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">connected</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #005cc5;">false</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #d73a49;">boolean</span><span class="token"> </span><span class="token" style="color: #24292e;">adbEnabled</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #24292e;">intent</span><span class="token">.</span><span class="token" style="color: #6f42c1;">getBooleanExtra</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">adb</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #005cc5;">false</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #24292e;">callback</span><span class="token">.</span><span class="token" style="color: #6f42c1;">accept</span><span class="token">(</span><span class="token">connected </span><span class="token" style="color: #d73a49;">&amp;&amp;</span><span class="token"> adbEnabled</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #24292e;">ctx</span><span class="token">.</span><span class="token" style="color: #6f42c1;">unregisterReceiver</span><span class="token">(</span><span class="token" style="color: #005cc5;">this</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">}</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #24292e;">context</span><span class="token">.</span><span class="token" style="color: #6f42c1;">registerReceiver</span><span class="token">(</span><span class="token">usbReceiver</span><span class="token">,</span><span class="token"> filter</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #24292e;">Intent</span><span class="token"> </span><span class="token" style="color: #24292e;">sticky</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #24292e;">context</span><span class="token">.</span><span class="token" style="color: #6f42c1;">registerReceiver</span><span class="token">(</span><span class="token" style="color: #005cc5;">null</span><span class="token">,</span><span class="token"> filter</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token">(</span><span class="token">sticky </span><span class="token" style="color: #d73a49;">!=</span><span class="token"> </span><span class="token" style="color: #005cc5;">null</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #24292e;">usbReceiver</span><span class="token">.</span><span class="token" style="color: #6f42c1;">onReceive</span><span class="token">(</span><span class="token">context</span><span class="token">,</span><span class="token"> sticky</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">[</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token" style="color: #24292e;">SNIP</span><span class="token">.</span><span class="token">.</span><span class="token">.</span><span class="token">]</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1828"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1826">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1827'
	>
	We can also bypass this check by using the debugger to place breakpoints at the appropriate locations.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1831"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1829">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1830'
	>
	In this case, I set a breakpoint on the if-eqz instructions, which checks whether the values in registers v0 and v2 are equal to zero. These registers correspond to the connected and adbEnabled flags.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1834"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1832">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1833'
	>
	When the breakpoint is hit, we observe that both values are set to 1 (true), indicating that USB is connected and ADB is enabled.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1837"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-1835"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-1836">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/03/image_22.webp"
					class="image__img block-media__image-img"
					alt="JADX debugger breakpoint showing if-eqz instructions with v0 (connected=1) and v2 (adbEnabled=1) registers, detecting USB connection with ADB enabled"
										height="501"
															width="1088"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1840"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1838">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1839'
	>
	We can now simply set these two values to 0 (false), causing the check to fail and allowing the app to continue execution.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1843"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1841">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1842'
	>
	Conclusion</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1846"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1844">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1845'
	>
	We have explored several common anti-root, anti-hook, and anti-debug techniques and demonstrated how each can ultimately be bypassed. However, it is important to recognize that these protections still play a critical role in Android security.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1849"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1847">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1848'
	>
	No protection is entirely foolproof. Given enough time and the right tools, a determined attacker can often find a way around most defenses. However, the goal of these mechanisms isn’t to create an unbreakable application, but rather to increase the complexity of attacks. This raises the time, effort, and skill required for an attacker to compromise the application, which can deter casual attackers and slow down more advanced ones.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1852"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1850">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1851'
	>
	In short, while these security checks can be bypassed, they remain a valuable part of a defense-in-depth strategy. Labs like TamperLab that we have created, provide a practical environment where you can practice implementing these detection mechanisms and learn how to bypass them. It’s about making it hard enough that breaking the security is no longer worth the effort.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1855"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1853">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1854'
	>
	At Infinum, we help you stay ahead with tailored cybersecurity services, including <a href="https://infinum.com/cybersecurity/penetration-testing/" id="https://infinum.com/cybersecurity/penetration-testing/">penetration testing</a> and <a href="https://infinum.com/cybersecurity/red-teaming/" id="https://infinum.com/cybersecurity/red-teaming/">security assessments</a>. Whether launching new products or protecting existing ones, we identify weaknesses before attackers do so you can focus on what matters. Learn more about how we keep your digital world secure on our <a href="https://infinum.com/cybersecurity/">cybersecurity page</a>.</p></div>	</div>
</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/understanding-defeating-android-protections/">Understanding &amp; Defeating Android Protections</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
					<item>
				<image>
					<url>19276208https://infinum.com/uploads/2026/03/ai-generated-code.webp</url>
				</image>
				<title>Is AI-Generated Code Secure? What Business Leaders Need to Know About AI and Application Security</title>
				<link>https://infinum.com/blog/ai-generated-code-security-risks/</link>
				<pubDate>Fri, 06 Mar 2026 13:47:45 +0000</pubDate>
				<dc:creator>Hrvoje Filaković</dc:creator>
				<guid isPermaLink="false">https://infinum.com/?p=19276208</guid>
				<description>
					<![CDATA[<p>We asked AI to build three web apps with different levels of security guidance, then tried to break them. Here’s what we found.</p>
<p>The post <a href="https://infinum.com/blog/ai-generated-code-security-risks/">Is AI-Generated Code Secure? What Business Leaders Need to Know About AI and Application Security</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[<div
	class="wrapper"
	data-id="es-2085"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-1858">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1861"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1859">
	<p	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-1860'
	>
	<strong>AI is changing how software gets built: faster timelines, leaner teams, fewer blockers. But does all that speed come at a cost? We put AI to the test in a real-world security experiment, and what we learned should matter to anyone leading modern product, platform, or tech teams.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1864"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1862">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1863'
	>
	According to Collins Dictionary, <em>vibe coding</em> is officially <a href="https://www.theguardian.com/technology/2025/nov/06/vibe-coding-collins-dictionary-word-of-the-year-2025">the word of the year</a> – and if you’ve spent literally <em>any</em> time around engineering teams lately, that probably doesn’t surprise you.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1867"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1865">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1866'
	>
	Obviously, it’s catching on fast. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1870"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1868">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1869'
	>
	Microsoft recently shared that around <a href="https://www.theverge.com/news/658584/up-to-30-percent-of-some-microsoft-code-is-now-written-by-ai">30% of the code in some of its repositories is now AI-generated</a>. This shift is one of the defining cybersecurity risks of 2026 — our <a href="https://infinum.com/blog/cybersecurity-trends-2026/">cybersecurity trends overview</a> covers the trade-off between vibe coding and security in depth. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1873"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1871">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1872'
	>
	At <a href="https://infinum.com/">Infinum</a>, we see this trend up close, both in internal experimentation and in conversations with clients who are increasingly curious about AI-assisted development. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1876"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1874">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1875'
	>
	The appeal is clear: development is faster, <a href="https://infinum.com/blog/ai-automation/" id="https://infinum.com/blog/ai-automation/">prototypes turn into products at record speed</a>, and teams feel confident shipping. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1879"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1877">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1878'
	>
	But is that confidence earned? We decided to find out.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1882"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1880">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1881'
	>
	<strong>Security doesn’t work on vibes</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1885"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1883">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1884'
	>
	A growing belief is quietly taking hold in many teams:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1888"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1886">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1887'
	>
	<em>“If I tell the AI to make it secure, it probably will.”</em></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1891"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1889">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1890'
	>
	That assumption is understandable because AI is very good at reproducing patterns that <em>look</em> correct. When prompted, it can generate code that resembles common security practices and includes familiar terminology, giving the impression that risk has been addressed. But is it, really?</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1894"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1892">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1893'
	>
	Instead of debating, our cybersecurity engineer designed a simple, hands-on experiment.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1897"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1895">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1896'
	>
	He asked AI to build apps with varying levels of security guidance, from none to OWASP-level detail, and then he tried to break them.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1900"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1898">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1899'
	>
	We didn’t want to test whether AI could write code. We know it can.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1902"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-1901'
	>
	<strong>Likewise, the goal wasn’t to assess if AI builds insecure apps by default. We wanted to test whether adding “make it secure” to your prompt is enough to stop vulnerabilities – and how that changes as you get more specific.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1905"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1903">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1904'
	>
	Let’s see the results.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1908"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1906">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1907'
	>
	<strong>The apps we built (and broke)</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1911"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1909">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1910'
	>
	We asked AI to build three medium-complexity web applications, realistic enough to offer an attack surface, but not so complex that AI failed to build them. One app was generated with no security input at all, one with light guidance, and one with detailed, best-practice-driven instructions.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1914"
	 data-animation-target='inner-items'>
		
			<div class="block-group" data-id=es-1913>
	
<div
	class="wrapper"
	data-id="es-1912"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			
<figure class="wp-block-table is-style-first-column-strong"><table class="has-fixed-layout"><thead><tr><th><strong>App</strong></th><th><strong>Security guidance</strong></th><th><strong>Security quality</strong></th><th><strong>Outcome</strong></th></tr></thead><tbody><tr><td>Simple Project Tracker &#8211; task and project manager for small teams</td><td>None</td><td>Poor</td><td>Multiple critical issues in input validation, design, and session handling, easily leading to worst-case exploitation scenarios. Users could make themselves admins.&nbsp;</td></tr><tr><td>Project Resource Hub &#8211; internal portal for sharing documents and guides</td><td>Light</td><td>Mixed</td><td>Critical issues reduced, but several vulnerabilities remain that could still expose sensitive information, such as SSRF and malicious file uploads.</td></tr><tr><td>Niche Vault &#8211; hobbyist catalog site for personal collections</td><td>Detailed &amp; <a href="https://infinum.com/blog/owasp-top-10-mobile/" id="https://infinum.com/blog/owasp-top-10-mobile/">OWASP-based</a></td><td>Better, but insufficient</td><td>Significantly fewer vulnerabilities; none severe, but still issues that could pose risks over time. Missed CSV injection, rate-limiting, and open redirects.</td></tr></tbody></table></figure>
		</div>
	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1917"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1915">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1916'
	>
	Turns out, not even specific prompts are enough to build applications that can survive real-world attacks.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1924"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<a	class="card-simple js-card-simple card-simple--is-ad block-card__card-simple card-simple--has-link js-card-simple-link card-simple__content-align--left"
	data-id="es-1918"
	 href='https://infinum.com/blog/security-gaps-in-vibe-coded-applications/'>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<p	class='typography typography--size-36-text js-typography card-simple__heading'
	data-id='es-1919'
	>
	<strong>Want to learn all technical details of the experiments, including exact prompts, a detailed overview of found issues, and our engineer’s conclusion? </strong></p>		</div>

		<p	class='typography typography--size-16-text-roman js-typography card-simple__paragraph'
	data-id='es-1920'
	 id='es-1918-paragraph'>
	Explore the complete overview of this experiment.</p><button	class="btn btn--color-infinum btn--size-small btn--width-default btn__icon-position--right card-simple__btn js-block-card-btn js-card-simple-link"
	data-id="es-1921"
	 tabindex='-1'>
		<div class="btn__inner">
					<div	class='typography typography--size-none js-typography btn__label'
	data-id='es-1922'
	>
	<strong><strong>Let’s get technical</strong></strong></div>		
		<i
	class="icon btn__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='arrow-right-16' data-id='es-1923'>
	<svg fill='none' height='16' viewBox='0 0 17 16' width='17' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'><g stroke='currentColor' stroke-width='2'><path d='m.5 7.99999 14 .00001'/><path d='m9.23352 2.7251 5.97848 5.97852'/><path d='m9.23352 13.2744 5.97848-5.9785'/></g></svg></i>	</div>
	</button>	</div>
</a>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1927"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1925">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1926'
	>
	<strong>What actually went wrong </strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1930"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1928">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1929'
	>
	Even with better prompts, the same kinds of security gaps kept popping up.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1933"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1931">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1932'
	>
	<span class='screen-reader-text'>AI didn’t forget libraries or miss syntax. It just couldn’t reason about how things might go wrong, and that’s where real-life threats were.</span><span aria-hidden='true'>AI didn’t forget libraries or miss syntax. </span></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1936"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1934">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1935'
	>
	<span class='screen-reader-text'>AI didn’t forget libraries or miss syntax. It just couldn’t reason about how things might go wrong, and that’s where real-life threats were.</span><span aria-hidden='true'>AI simply doesn&#8217;t understand cybersecurity, and it couldn’t reason about <em>how things might go wrong</em>, and that’s where real-life threats were.</span></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1939"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1937">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1938'
	>
	While we are aware that this is an experiment of a limited scope, it is still important to note recurring issues we recognized:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1943"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--infinum block-bullet__bullet" data-id="es-1940">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1941'
	>
	<strong>Trust in user input</strong></p><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-1942'
	>
	AI simply trusted what users said about themselves. In multiple apps, user roles (such as admin) were accepted directly from client input, with no validation or enforcement. If someone claimed to be an admin, the system said: “Sure, sounds legit.” Just like that, admin access was self-serve.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1947"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--infinum block-bullet__bullet" data-id="es-1944">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1945'
	>
	<strong><strong><strong>Broken or missing access control</strong></strong></strong></p><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-1946'
	>
	Even when roles were assigned correctly, features didn’t enforce them properly. There were no ownership checks, no context validation, no guardrails. Anyone logged in could view, modify, or delete other users’ data.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1951"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--infinum block-bullet__bullet" data-id="es-1948">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1949'
	>
	<strong><strong><strong><strong>Feature-level defenses, system-level blind spots</strong></strong></strong></strong></p><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-1950'
	>
	AI knew to sanitize an input field, but it didn’t think about how that input might travel through the system. Security was applied in pieces, not as a pattern, which means defenses weren’t absent; they were just easy to step around. This fragmentation is also why <a href="https://infinum.com/blog/software-supply-chain-security/">software supply chain security</a> requires a systemic approach — the weakest link is rarely where you&#8217;re looking.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1955"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--infinum block-bullet__bullet" data-id="es-1952">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1953'
	>
	<strong><strong><strong><strong><strong>Reactive security instead of proactive thinking</strong></strong></strong></strong></strong></p><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-1954'
	>
	The apps didn’t lack rate limiting, but rate limiting was only added to endpoints the prompt specifically called “sensitive.” In other words, if you want a feature to be secure, you have to explicitly tell the AI – every time.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1959"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--infinum block-bullet__bullet" data-id="es-1956">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-1957'
	>
	<strong><strong><strong><strong><strong><strong>No imagination for abuse cases</strong></strong></strong></strong></strong></strong></p><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-1958'
	>
	And this might be the most important insight of all: the AI assumed good-faith users. It never asked the question that is the foundation of real-world security: <em>What if someone does the wrong thing on purpose?</em><br />
</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1962"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1960">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1961'
	>
	In conclusion, the issues discovered weren’t bugs in the traditional sense. They were assumptions – that roles are respected, that the app can trust user input, that attackers won’t be creative.  </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1967"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="blockquote block-blockquote__blockquote" data-id="es-1963">
	
	<div class="blockquote__content">
		<i
	class="icon blockquote__icon icon--size-24 icon--scale-100"
	 aria-hidden='true' data-name='blockquote-24' data-id='es-1964'>
	<svg fill='none' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path clip-rule='evenodd' d='m12 24c6.6274 0 12-5.3726 12-12 0-2.79685-.9568-5.37021-2.561-7.41062-.581.22951-1.0832.60583-1.5069 1.12898-.5132.60844-.7698 1.41969-.7698 2.43375v.07605h2.5789v5.59004h-5.6197v-5.01962c0-1.11547.154-2.06616.4619-2.85205.3336-.81125.757-1.48307 1.2702-2.01545.528-.52161 1.1175-.92155 1.7687-1.1998-2.0728-1.70651-4.7279-2.73128-7.6223-2.73128-6.62742 0-12 5.37258-12 12 0 6.6274 5.37258 12 12 12zm-3.53811-18.05347c-.30793.78589-.46189 1.73658-.46189 2.85205v5.01962h5.6197v-5.59004h-2.5789v-.07605c0-1.01406.2566-1.82531.7698-2.43375.5389-.63379 1.1804-1.05209 1.9245-1.2549v-2.28164c-.7441.07605-1.4626.25351-2.1555.53238-.6928.27887-1.3086.68449-1.84752 1.21688-.51321.53238-.9366 1.2042-1.27019 2.01545z' fill='currentColor' fill-rule='evenodd'/></svg></i><p	class='typography typography--size-36-text js-typography blockquote__quote'
	data-id='es-1965'
	>
	<strong>Most of the problems were not broken locks, but doors that simply weren’t locked because AI assumed nobody would try them.</strong></p>
		<div class="blockquote__caption-wrap">
			<div	class='typography typography--size-12-text-roman js-typography blockquote__caption'
	data-id='es-1966'
	>
	<strong>HRVOJE FILAKOVIĆ</strong>,<br>CYBERSECURITY ENGINEER</div>		</div>
	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1970"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1968">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1969'
	>
	But attackers are creative, and they have all the time in the world to look for what you missed.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1973"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1971">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-1972'
	>
	<strong>Why this matters beyond the code</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1976"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1974">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1975'
	>
	Security is not just a dev problem. It&#8217;s a systems-thinking problem, and it affects every role involved in shipping software.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1979"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1977">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-1978'
	>
	<strong><strong>For CTOs &amp; Heads of Engineering</strong></strong></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1982"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1980">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1981'
	>
	AI speeds things up, no question, but it can’t replace architectural thinking. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1985"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1983">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1984'
	>
	The biggest failures in these apps weren’t in the code; they were bad assumptions about how trust, roles, and permissions work. Even when AI adds security controls, it struggles to secure the system as a whole.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1988"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1986">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1987'
	>
	We’ve all recently witnessed this: in our <a href="https://infinum.com/blog/openclaw-moltbot-clawdbot-viral-ai-sidekick/">deep dive into OpenClaw (ex Moltbot)</a>, we explored what happens when AI sidekicks are given broad access with no guardrails. The takeaway? When AI has too much control, your data is very likely at risk. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1991"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1989">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1990'
	>
	Again, that’s an architectural one. And it’s still up to humans to get it right.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1994"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1992">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-1993'
	>
	<strong>For Founders &amp; Execs</strong></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-1997"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1995">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1996'
	>
	All three apps worked. Some even looked secure. But they could still be exploited in serious ways, often through features that seemed harmless. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2000"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-1998">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-1999'
	>
	Remember this: AI gives a false sense of security. Without hands-on testing, issues like these show up only after damage is done. If you&#8217;re building with AI and need it to be secure from the start, our <a href="https://infinum.com/custom-ai-development-services/">custom AI development services</a> combine speed with security by design.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2003"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2001">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-2002'
	>
	<strong>For Security Leaders</strong></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2006"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2004">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2005'
	>
	The vulnerabilities we found didn’t have CVE numbers. They weren’t from outdated libraries or missing headers. They were logic and abuse-case failures – the exact kind of problems <a href="https://infinum.com/blog/why-penetration-testing-is-important/">automated scanners don’t catch</a>. Addressing these systematically through structured security governance, risk assessment, and compliance frameworks is exactly what <a href="https://infinum.com/governance-risk-compliance-services/">governance, risk, and compliance services</a> are designed to support.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2009"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2007">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2008'
	>
	Manual <a href="https://infinum.com/cybersecurity/penetration-testing/">penetration testing</a> still matters because it mirrors how attackers behave, not just what vulnerabilities exist – and AI-assisted code makes this more important, not less.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2012"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2010">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-2011'
	>
	For <strong style="font-weight: bold">Developers</strong></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2015"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2013">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2014'
	>
	AI can implement what you tell it, but it’s not a security expert. It won’t catch logic flaws, system-wide assumptions, or the creative misuse attackers are known for. For a practical look at how to work with AI coding assistants without sacrificing code quality, see our roundup of <a href="https://infinum.com/blog/ai-agency-ai-tools/">AI tools for development teams</a>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2018"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2016">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2017'
	>
	Writing secure apps still requires developer intuition, threat awareness, and curiosity about how features might be abused.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2020"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-2019'
	>
	<strong><strong>The key takeaway: “Please make it secure” is not a security strategy. AI can help you build faster <em>only if you know exactly what to ask for</em>, and even then, it often misses the bigger picture. </strong></strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2023"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2021">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2022'
	>
	So, yes. AI-generated code can be secure, but it takes judgement, experience, and most importantly, testing.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2026"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2024">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-2025'
	>
	<strong>What should you do now</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2029"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2027">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2028'
	>
	Use AI. Embrace the speed. Build more, experiment faster, prototype wildly. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2032"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2030">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2031'
	>
	But don’t confuse working code with secure code.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2035"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-2033">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-2034'
	>
	<li><strong>Bring in experienced engineers.</strong> Secure software doesn’t just happen, it’s built intentionally. <a href="https://infinum.com/blog/ssdlc-application-security/">SSDLC practices are more essential than ever</a> when code is being generated at speed. For mobile developers in particular, intentional security means implementing runtime protections that resist reverse engineering — something we explore hands-on in our <a href="https://infinum.com/blog/understanding-defeating-android-protections/">guide to Android anti-root, anti-hook, and anti-debug mechanisms</a>. Before scaling AI-assisted development across your team, it helps to have a clear <a href="https://infinum.com/blog/ai-strategy/">AI strategy</a> — one that accounts for security, governance, and the right use cases from the start. </li><li><strong>Test like an attacker.</strong> <a href="https://infinum.com/blog/penetration-testing-steps/">Manual penetration testing</a> reveals what AI misses: the logic flaws, the edge cases, all the blind spots that open into serious vulnerabilities.</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2038"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2036">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-2037'
	>
	<strong>Why automated scanners won’t help</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2041"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2039">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2040'
	>
	Automated tools catch known and “low-hanging fruit” types of vulnerabilities. But issues discovered in this experiment weren’t in any vulnerability database, because they weren’t traditional bugs – they were incorrect assumptions about how systems would be used.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2043"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-2042'
	>
	<strong><strong>The AI knew the best practices, it just couldn’t connect the dots to anticipate misuse. That’s what manual testing is for – to expose unknown risks.</strong></strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2046"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2044">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2045'
	>
	Automation wouldn’t have caught that, but manual testing told us whether the system could survive a curious attacker.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2053"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<a	class="card-simple js-card-simple card-simple--is-ad block-card__card-simple card-simple--has-link js-card-simple-link card-simple__content-align--left"
	data-id="es-2047"
	 href='https://infinum.com/cybersecurity/penetration-testing/'>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<p	class='typography typography--size-36-text js-typography card-simple__heading'
	data-id='es-2048'
	>
	<strong><strong>Want to see how your AI-generated app holds up?</strong></strong></p>		</div>

		<p	class='typography typography--size-16-text-roman js-typography card-simple__paragraph'
	data-id='es-2049'
	 id='es-2047-paragraph'>
	Let’s test it, break it (safely), and help you fix what matters most.</p><button	class="btn btn--color-infinum btn--size-small btn--width-default btn__icon-position--right card-simple__btn js-block-card-btn js-card-simple-link"
	data-id="es-2050"
	 tabindex='-1'>
		<div class="btn__inner">
					<div	class='typography typography--size-none js-typography btn__label'
	data-id='es-2051'
	>
	<strong><strong>Let’s get technical</strong></strong></div>		
		<i
	class="icon btn__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='arrow-right-16' data-id='es-2052'>
	<svg fill='none' height='16' viewBox='0 0 17 16' width='17' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'><g stroke='currentColor' stroke-width='2'><path d='m.5 7.99999 14 .00001'/><path d='m9.23352 2.7251 5.97848 5.97852'/><path d='m9.23352 13.2744 5.97848-5.9785'/></g></svg></i>	</div>
	</button>	</div>
</a>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2056"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2054">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-2055'
	>
	<strong>The real takeaway</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2059"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2057">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2058'
	>
	The apps worked and security looked reasonable. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2062"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2060">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2061'
	>
	But AI inherently doesn’t <em>understand</em> security, which is especially obvious once software interacts with real users, real data, and real incentives to misuse it. Security failures rarely come from missing syntax or forgotten libraries; they emerge from incorrect assumptions about behavior, trust, and intent.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2065"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-2063">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-2064'
	>
	<li><strong>AI builds what you ask for.</strong></li><li><strong><strong>It protects what you explicitly mention.</strong></strong></li><li><strong>It doesn’t secure the system as a whole.</strong></li><li><strong><strong>It doesn’t imagine creative misuse.</strong></strong></li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2068"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2066">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2067'
	>
	Attackers do <em>nothing</em> but imagine misuse.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2071"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2069">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2070'
	>
	This is exactly why <strong>manual penetration testing exists</strong>: not to check a box, but to ask the one question that AI won’t:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2074"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2072">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2073'
	>
	<em>“What happens if someone does the wrong thing on purpose?”</em></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2077"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2075">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2076'
	>
	Security still requires human intent and adversarial thinking. No matter how well you prompt it, AI can’t protect against what it doesn’t anticipate.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2080"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2078">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2079'
	>
	<em>If your app was built with AI assistance, this isn’t a theoretical risk. It’s a structural one. </em></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2083"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2081">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2082'
	>
	<em>If you want real, certified humans to have a go at your app – partner with Infinum’s security team to </em><a href="https://infinum.com/cybersecurity/penetration-testing/"><em>test your app the way real attackers would.</em></a><em>  We’ll help you find the blind spots, close the gaps, and build safer systems, so you can move fast without leaving yourself exposed. If we find zero issues, the beer is on us.</em></p></div>	</div>
</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/ai-generated-code-security-risks/">Is AI-Generated Code Secure? What Business Leaders Need to Know About AI and Application Security</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
					<item>
				<image>
					<url>19274941https://infinum.com/uploads/2026/03/img-CS-vibe-coding-new-opti.webp</url>
				</image>
				<title>Security Gaps in Vibe-Coded Applications</title>
				<link>https://infinum.com/blog/security-gaps-in-vibe-coded-applications/</link>
				<pubDate>Wed, 11 Feb 2026 11:32:15 +0000</pubDate>
				<dc:creator>Hrvoje Filaković</dc:creator>
				<guid isPermaLink="false">https://infinum.com/?p=19274941</guid>
				<description>
					<![CDATA[<p>An evaluation of AI-generated code security found that while detailed security prompts lead to improved outcomes, consistent vulnerabilities and gaps remain even with strict guidance.</p>
<p>The post <a href="https://infinum.com/blog/security-gaps-in-vibe-coded-applications/">Security Gaps in Vibe-Coded Applications</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[<div
	class="wrapper"
	data-id="es-2436"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-2086">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2089"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2087">
	<p	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-2088'
	>
	<strong>As vibe coding enters real-world development, I set out to evaluate the security of AI-generated code in practice. After building and attacking three vibe-coded applications with increasing security guidance, clear improvements emerged – alongside consistent gaps.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2092"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2090">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2091'
	>
	Large language models are already part of <a href="https://infinum.com/news/infinum-embeds-ai-across-product-development/">everyday development workflows</a>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2095"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2093">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2094'
	>
	Development teams use them to scaffold features, generate boilerplate, wire APIs, and, increasingly, to assemble entire applications from natural-language prompts.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2098"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2096">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2097'
	>
	In many cases, the output is functionally correct and fast enough to be genuinely useful.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2101"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2099">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2100'
	>
	What is less obvious is how this code behaves once it is exposed to real attackers rather than happy-path usage. This is especially relevant as <a href="https://infinum.com/governance-risk-compliance-services/" id="https://infinum.com/governance-risk-compliance-services/">regulatory pressure</a> on <a href="https://infinum.com/third-party-cyber-risk-management/" id="https://infinum.com/third-party-cyber-risk-management/" target="_blank" rel="noreferrer noopener">the software supply chain</a> increases and attackers adopt AI-assisted tooling.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2103"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-30-text js-typography block-highlighted-text__typography'
	data-id='es-2102'
	>
	<strong>We examined how security posture changes as we instruct an AI model to implement different levels of secure development best practices.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2106"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2104">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2105'
	>
	I asked Gemini Pro to generate three different web applications and for each one, I progressively increased the level of security detail in my prompts.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2109"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2107">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2108'
	>
	The results were instructive, occasionally impressive, and ultimately a reminder that security does not emerge automatically – no matter how advanced the model. For a business-focused interpretation of these findings, see our <a href="https://infinum.com/blog/ai-generated-code-security-risks/">AI-generated code security risks guide for CTOs and business leaders</a>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2112"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2110">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-2111'
	>
	<strong>The plan and methodology</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2115"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2113">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2114'
	>
	To make the experiment realistic, I needed applications complex enough to expose meaningful attack surfaces, but not so large that the AI would collapse into contradictory logic or endless refactoring loops.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2118"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2116">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2117'
	>
	I intentionally avoided very simple apps (e.g., To-do apps), since their limited functionality results in a small and unrealistic attack surface, while overly complex systems often exceed what current models can reliably reason about end-to-end.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2120"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-30-text js-typography block-highlighted-text__typography'
	data-id='es-2119'
	>
	<strong>Medium-complexity web applications turned out to be the sweet spot. They are large enough to expose meaningful security issues, but not so large that the AI collapses under its own code.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2123"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2121">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2122'
	>
	They include authentication, authorization, data storage, and user interaction patterns that are common in real-world systems—and therefore make attractive targets for attackers.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2126"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2124">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2125'
	>
	For each application, I generated the entire codebase using Gemini Pro, varying only the level of security detail in the prompt.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2129"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2127">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2128'
	>
	I then reviewed the resulting code from the perspective of a realistic attacker, including both unauthenticated users and low-privileged authenticated users attempting to escalate access or abuse functionality. The focus was on practical exploitation paths rather than theoretical weaknesses.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2132"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2130">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-2131'
	>
	<strong>The test subjects</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2135"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2133">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2134'
	>
	Based on these criteria, the following three web applications were born:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2140"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--top bullet__type--number bullet__color--infinum block-bullet__bullet" data-id="es-2136">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-2137'
	>
	1</p>	<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-2138'
	>
	Simple Project Tracker</p><p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-2139'
	>
	A lightweight tool for small teams to manage projects and track tasks, vibe coded with no explicit security instructions.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2145"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--top bullet__type--number bullet__color--infinum block-bullet__bullet" data-id="es-2141">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-2142'
	>
	2</p>	<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-2143'
	>
	Project Resource Hub</p><p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-2144'
	>
	A centralized internal portal for storing and accessing important documents, links, and guides (similar to a mini-wiki), built with light security instructions.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2150"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--top bullet__type--number bullet__color--infinum block-bullet__bullet" data-id="es-2146">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-2147'
	>
	3</p>	<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-2148'
	>
	Niche Vault</p><p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-2149'
	>
	A site for hobbyists to catalog and showcase personal collections (e.g., vinyl records, comics, board games, etc.), created with detailed and precise security instructions (e.g., OWASP guidelines). </p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2153"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2151">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2152'
	>
	Each application was built independently, with the only variable being the depth and specificity of security requirements provided to the AI.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2156"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2154">
	<p	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-2155'
	>
	<strong>Discoveries and  vulnerabilities </strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2159"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2157">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2158'
	>
	In this section, we analyze the key vulnerabilities identified across the three generated applications. Rather than listing every individual issue, the focus is on the most impactful findings, recurring security patterns, and the extent to which the level of prompt detail directly influenced the security posture of the generated code.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2162"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2160">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-2161'
	>
	<strong>Results at a glance</strong>: <strong>What broke and why</strong></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2165"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2163">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2164'
	>
	The following table provides a high-level summary of the results from the tested applications.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2168"
	 data-animation-target='inner-items'>
		
			<div class="block-group" data-id=es-2167>
	
<div
	class="wrapper"
	data-id="es-2166"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			
<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Application</th><th>Security quality</th><th>Notes</th></tr></thead><tbody><tr><td>Simple Project Tracker</td><td><strong>Poor</strong></td><td>Multiple critical vulnerabilities across input validation, authorization, and session management.</td></tr><tr><td>Project Resource Hub</td><td><strong>Mixed</strong></td><td>Major improvements, but still several exploitable issues.</td></tr><tr><td>Niche Vault</td><td>Better, but <strong>insufficient</strong></td><td>Major improvements, but several exploitable issues remain.</td></tr></tbody></table><figcaption class="wp-element-caption"><em>The trend is clear: more detailed security prompts lead to better outcomes – but not to secure-by-default systems.</em></figcaption></figure>
		</div>
	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2171"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2169">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2170'
	>
	For security researchers looking to understand what these runtime gaps look like from an attacker&#8217;s perspective on mobile, where protections like root detection and Frida detection can be systematically defeated — see our <a href="https://infinum.com/blog/understanding-defeating-android-protections/">walkthrough of Android penetration testing techniques</a>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2174"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2172">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2173'
	>
	For a real-world example of what happens when an AI tool is shipped without any of these guardrails in place — no authentication, broad system access, and easily bypassed safety measures see our <a href="https://infinum.com/blog/openclaw-moltbot-clawdbot-viral-ai-sidekick/">security analysis of OpenClaw</a>, the viral AI agent that exposed over 1,500 unauthenticated instances on the public internet within weeks of launch.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2177"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2175">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-2176'
	>
	<strong>Simple Project Tracker: No security, just vibes</strong></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2180"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2178">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2179'
	>
	The first application generated was the Simple Project Tracker, a lightweight web application where regular users can create, update, and sort tasks, while administrators can additionally create projects and assign users.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2183"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2181">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2182'
	>
	No explicit security requirements were provided. The prompt focused solely on functional goals such as building a lightweight project tracker with database integration, role-based user and admin access, and all files needed for local deployment. As a result, the following prompt was used:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2186"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2184">
	<p	class='typography typography--size-16-text-roman typography--is-highlighted js-typography block-typography__typography'
	data-id='es-2185'
	>
	<mark><em>I would like to build a simple project tracker web application. Please include a database integration and an API that distinguishes between user and admin permissions. The goal is to have a completely operational application that remains lightweight by focusing exclusively on high-impact, necessary features. Additionally, make sure to generate every file necessary to run the web application locally.</em></mark></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2188"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-30-text js-typography block-highlighted-text__typography'
	data-id='es-2187'
	>
	<strong>The AI was only told what the application should do, not how it should defend itself.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2191"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2189">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2190'
	>
	For this application, AI selected the following technology stack:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2194"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-2192">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-2193'
	>
	<li>Frontend: <em>HTML, Tailwind, JavaScript</em></li><li>Backend: <em>Node.js</em></li><li>API: <em>REST (express.js)</em></li><li>Database: <em>SQLite3</em></li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2197"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2195">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2196'
	>
	As illustrated in the screenshot below, the generated web application exhibited a polished and well-designed interface.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2200"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-2198"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-2199">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/02/image1.webp"
					class="image__img block-media__image-img"
					alt="Screenshot of AI-generated Simple Project Tracker web app interface showing task management dashboard with no security controls"
										height="758"
															width="1113"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2203"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2201">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2202'
	>
	Unsurprisingly, the absence of security guidance resulted in an application that implicitly trusted all user input. There was no input sanitization anywhere in the codebase, which led to pervasive cross-site scripting vulnerabilities across forms, task descriptions, and project metadata.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2206"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2204">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2205'
	>
	Below is an example of the generated code.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2209"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-2207"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-2208">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/02/image2.webp"
					class="image__img block-media__image-img"
					alt="JavaScript code snippet showing AI-generated innerHTML assignment without input sanitization, creating a cross-site scripting (XSS) vulnerability"
										height="181"
															width="943"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2212"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2210">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2211'
	>
	The registration flow was particularly revealing. User roles were assigned directly from client-controlled input:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2214"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-json github-light" data-language="json" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #005cc5;">&quot;</span><span class="token" style="color: #005cc5;">username</span><span class="token" style="color: #005cc5;">&quot;</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">herc</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #005cc5;">&quot;</span><span class="token" style="color: #005cc5;">password</span><span class="token" style="color: #005cc5;">&quot;</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">password</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #005cc5;">&quot;</span><span class="token" style="color: #005cc5;">role</span><span class="token" style="color: #005cc5;">&quot;</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">user</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2217"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2215">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2216'
	>
	Changing &#8220;role&#8221; to &#8220;admin&#8221; was enough to gain full administrative privileges. There was no server-side validation, enforcement, or role integrity check.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2220"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2218">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2219'
	>
	Authorization was equally fragile. While the application exposed separate API endpoints for managing tasks and projects, none of them implemented ownership checks.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2223"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2221">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2222'
	>
	Any authenticated user could view, modify, or delete any other user’s data which can be seen in the following request where oddly specific x-user-id and x-user-role headers are used by default.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2226"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-2224"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-2225">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/02/image3.webp"
					class="image__img block-media__image-img"
					alt="HTTP request and response showing broken access control in AI-generated app, with x-user-id and x-user-role headers accepted directly from client input"
										height="401"
															width="826"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2229"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2227">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2228'
	>
	Session handling further reinforced the trust-in-the-client model. Authentication state was stored in unsigned cookies containing raw user objects:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2231"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-json github-light" data-language="json" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">{</span><span class="token" style="color: #005cc5;">&quot;</span><span class="token" style="color: #005cc5;">id</span><span class="token" style="color: #005cc5;">&quot;</span><span class="token">:</span><span class="token" style="color: #005cc5;">2</span><span class="token">,</span><span class="token" style="color: #005cc5;">&quot;</span><span class="token" style="color: #005cc5;">username</span><span class="token" style="color: #005cc5;">&quot;</span><span class="token">:</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">user</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token" style="color: #005cc5;">&quot;</span><span class="token" style="color: #005cc5;">role</span><span class="token" style="color: #005cc5;">&quot;</span><span class="token">:</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">user</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2234"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2232">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2233'
	>
	Overall, in terms of design and functionality, the AI delivered exactly what was requested. However, from the security standpoint, the application had no sense of security at all and every possible aspect was completely insecure.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2237"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2235">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2236'
	>
	Functionally, the application worked exactly as requested. From a security standpoint, it operated entirely on the assumption that “logged-in users will behave correctly.” Needless to say, attackers do not follow that assumption.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2240"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2238">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-2239'
	>
	<strong>Project Resource Hub: Better, but not bulletproof</strong></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2243"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2241">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2242'
	>
	The second application, the Project Resource Hub, was designed as a platform where users could share resources such as files, links, and documentation, while administrators were able to manage all users.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2246"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2244">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2245'
	>
	This time, alongside the application details, I instructed the AI to also take security into account. Each feature was required to be implemented in a way that was secure and resistant to abuse, rather than merely functional.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2249"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2247">
	<p	class='typography typography--size-16-text-roman typography--is-highlighted js-typography block-typography__typography'
	data-id='es-2248'
	>
	<mark><em><em>… web application details …</em></em></mark></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2252"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2250">
	<p	class='typography typography--size-16-text-roman typography--is-highlighted js-typography block-typography__typography'
	data-id='es-2251'
	>
	<mark><em><em><em>You may use modern, standard technologies commonly used in contemporary web application development, such as a database and an API. The application must support multiple users and include an administrator role. There should be at least 2–5 distinct features for both regular users and administrators to demonstrate a reasonable level of application complexity.</em></em></em></mark></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2255"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2253">
	<p	class='typography typography--size-16-text-roman typography--is-highlighted js-typography block-typography__typography'
	data-id='es-2254'
	>
	<mark><em><em><em><em>Additionally, it is critically important that security is considered throughout the entire application. Every feature should be designed and implemented securely, following best practices and ensuring that no functionality can be easily exploited.</em></em></em></em></mark></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2257"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-30-text js-typography block-highlighted-text__typography'
	data-id='es-2256'
	>
	This time, the AI was instructed to consider security throughout the application, without explicit defense measures.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2260"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2258">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2259'
	>
	Compared to the previous application, this one showed noticeable improvements in security while keeping the same tech stack. Specifically, the AI implemented several measures, including:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2263"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-2261">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-2262'
	>
	<li>JWT tokens for authorization</li><li>Rate limiting on login, file uploads, and other sensitive routes</li><li>Cross-Origin Resource Sharing (CORS) configuration</li><li>File upload validation</li><li>Content Security Policy (CSP)</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2266"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2264">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2265'
	>
	As illustrated in the screenshot below, the generated web application was simple and provided functionality for storing several resource types.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2269"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-2267"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-2268">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/02/image4.webp"
					class="image__img block-media__image-img"
					alt="Screenshot of AI-generated Project Resource Hub web application interface showing document and link sharing features built with light security guidance"
										height="323"
															width="963"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2272"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2270">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2271'
	>
	With a moderately detailed security prompt, the AI implemented effective input sanitization, and most tested inputs (including XSS, SSTI, and other relevant attack vectors) were handled appropriately. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2275"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2273">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2274'
	>
	<strong>Even modest security instructions can significantly improve baseline resilience. However, a deeper inspection revealed critical blind spots in less than five minutes.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2278"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2276">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2277'
	>
	After less than five minutes of reviewing the generated code, I discovered a major flaw in the file upload functionality: the AI considered filename, file size, and MIME type checks sufficient for security, leaving the system vulnerable.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2281"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-2279"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-2280">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/02/image5.webp"
					class="image__img block-media__image-img"
					alt="Node.js file upload code generated by AI showing MIME type validation only, missing file extension checks that leave the system vulnerable to malicious uploads"
										height="599"
															width="1026"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2284"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2282">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2283'
	>
	Because there were no extension checks (or other meaningful protections) an attacker could easily spoof the content type and upload arbitrary files.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2286"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-php github-light" data-language="php" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">[</span><span class="token" style="color: #d73a49;">...</span><span class="token">]</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #d73a49;">--</span><span class="token" style="color: #d73a49;">--</span><span class="token" style="color: #d73a49;">--</span><span class="token" style="color: #d73a49;">--</span><span class="token" style="color: #d73a49;">--</span><span class="token" style="color: #d73a49;">--</span><span class="token" style="color: #d73a49;">--</span><span class="token" style="color: #d73a49;">--</span><span class="token" style="color: #d73a49;">--</span><span class="token" style="color: #d73a49;">--</span><span class="token" style="color: #d73a49;">--</span><span class="token" style="color: #d73a49;">--</span><span class="token" style="color: #d73a49;">--</span><span class="token" style="color: #d73a49;">--</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #005cc5;">235905183813478547083317251969</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #005cc5;">Content</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #005cc5;">Disposition</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #005cc5;">form</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #005cc5;">data</span><span class="token">;</span><span class="token"> </span><span class="token" style="color: #005cc5;">name</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">file</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">;</span><span class="token"> </span><span class="token" style="color: #005cc5;">filename</span><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">shell.exe</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #005cc5;">Content</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #005cc5;">Type</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #005cc5;">application</span><span class="token" style="color: #d73a49;">/</span><span class="token" style="color: #005cc5;">pdf</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">{</span><span class="token" style="color: #005cc5;">any_malicious_content_here</span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">[</span><span class="token" style="color: #d73a49;">...</span><span class="token">]</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2289"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2287">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2288'
	>
	Another feature in this application allowed users to store website links as resources, along with a preview function. Such feature by its description alone is a hacker’s dream to test for SSRF and unsurprisingly, the generated code was vulnerable.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2292"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2290">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2291'
	>
	While the preview was rendered inside an iframe, the backend still made unrestricted requests, making blind SSRF fully exploitable. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2295"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-2293"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-2294">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/02/image6.webp"
					class="image__img block-media__image-img"
					alt="Node.js code showing SSRF-vulnerable link preview endpoint that makes unrestricted backend requests without URL validation, exploitable via blind SSRF"
										height="299"
															width="893"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2298"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2296">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2297'
	>
	Despite additional issues, such as an insecure CSP configuration and predictable secrets, this application was still an improvement over the previous one.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2301"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2299">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2300'
	>
	However, several security measures were either ineffective against real attacks or failed because the AI didn’t anticipate certain attack scenarios at all.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2304"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2302">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-2303'
	>
	<strong>Niche Vault: Not the Fort Knox just yet</strong></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2307"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2305">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2306'
	>
	The third application is Niche Vault, a platform that lets hobbyists log, browse, and share items from their personal collections, complete with individual profile pages.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2310"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2308">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2309'
	>
	On the administrative side, it includes full user management capabilities, such as deleting, suspending, or banning accounts, along with basic analytics and the ability to publish site-wide announcements.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2313"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2311">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2312'
	>
	For this project, I placed a strong emphasis on security from the outset.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2316"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2314">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2315'
	>
	I instructed the AI to strictly adhere to OWASP WSTG guidelines and OWASP best practices, ensuring that every feature was analyzed for potential attack vectors and that appropriate mitigations were implemented from the outset. In addition, every piece of generated code was required to undergo a second security review by AI again.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2319"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2317">
	<p	class='typography typography--size-16-text-roman typography--is-highlighted js-typography block-typography__typography'
	data-id='es-2318'
	>
	<mark><em><em><em><em><em><em>&lt;web_application&gt; A minimal web application designed for hobbyists to log, manage, view, and share items from their personal collections, such as vinyl records, comics, or similar collectibles. &lt;/web_application&gt; </em></em></em></em></em></em></mark></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2322"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2320">
	<p	class='typography typography--size-16-text-roman typography--is-highlighted js-typography block-typography__typography'
	data-id='es-2321'
	>
	<mark><em><em><em><em><em><em>&#8230;web application features&#8230; </em></em></em></em></em></em></mark></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2325"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2323">
	<p	class='typography typography--size-16-text-roman typography--is-highlighted js-typography block-typography__typography'
	data-id='es-2324'
	>
	<mark><em><em><em><em><em><em>&lt;security &#8211; HIGH priority&gt; Security is the highest priority. Ensure that every component and feature is implemented securely and cannot be abused. Apply OWASP Web Security Testing Guide (WSTG) methodologies throughout the development process, and explicitly consider the OWASP Top 10 vulnerabilities to ensure the application is thoroughly protected by applying every best practice defense mechanism for each request, feature, functionality, and more. &lt;/security &#8211; HIGH priority&gt;</em></em></em></em></em></em></mark></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2328"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2326">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2327'
	>
	This time, the AI generated a web application using Python (<em>although I had to manually fix the code in several places</em>) with the following tech stack:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2331"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-2329">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-2330'
	>
	<li>Frontend: <em>HTML, Jinja2 (templating engine), Bootstrap</em></li><li>Backend: <em>Python, Flask</em></li><li>API: <em>REST (implicitly created by Flask routes)</em></li><li>Database: <em>SQLite, accessed via SQLAlchemy</em></li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2334"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2332">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2333'
	>
	The following image shows the generated web application with its functionalities implemented.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2337"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-2335"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-2336">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/02/image7.webp"
					class="image__img block-media__image-img"
					alt="Screenshot of AI-generated Niche Vault hobbyist collection tracker app built with OWASP security guidance, showing My Collection dashboard with Export CSV button"
										height="498"
															width="990"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2340"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2338">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2339'
	>
	User input was well protected across the board, and the application even included safeguards against SSTI attacks, which is especially important given its use of Jinja2. Both authentication and authorization were implemented cleanly and thoughtfully.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2342"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-30-text js-typography block-highlighted-text__typography'
	data-id='es-2341'
	>
	<strong>After explicitly requiring adherence to security guidelines and best practices, with a second security review step mandated for all generated code, the AI produced a robust application that exceeded my expectations. However, even here, vulnerabilities surfaced.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2345"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2343">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2344'
	>
	The application was not without flaws. One notable issue appeared in the CSV export feature, where it was possible to inject malicious payloads that could be executed by Excel or LibreOffice.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2348"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2346">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2347'
	>
	As shown in the image below, the relevant code lacks any form of input sanitization, leaving it vulnerable to CSV injection attacks.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2351"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2349">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2350'
	>
	As a result, an attacker can embed a malicious payload. In this example, a calculator application was executed; however, real-world attacks may involve reverse shell payloads that grant remote access to the victim’s desktop or download and execute malware.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2353"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-php github-light" data-language="php" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">=</span><span class="token" style="color: #005cc5;">cmd</span><span class="token" style="color: #d73a49;">|</span><span class="token" style="color: #032f62;">&#039;</span><span class="token" style="color: #032f62;"> /C calc</span><span class="token" style="color: #032f62;">&#039;</span><span class="token" style="color: #d73a49;">!</span><span class="token" style="color: #032f62;">&#039;</span><span class="token" style="color: #032f62;">A1</span><span class="token" style="color: #032f62;">&#039;</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2356"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2354">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2355'
	>
	As shown in the image below, the payload is evaluated when the CSV file is opened, causing the calculator process to be launched.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2359"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-2357"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-2358">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2026/02/image8.webp"
					class="image__img block-media__image-img"
					alt="Proof-of-concept screenshot showing CSV injection attack: malicious payload in exported file launches Windows Calculator via Excel DDE, demonstrating real-world exploit risk"
										height="324"
															width="884"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2361"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-30-text js-typography block-highlighted-text__typography'
	data-id='es-2360'
	>
	It goes without saying that the following prerequisites are required for the attack to work: <br />
<br />
1. Dynamic Data Exchange (DDE) needs to be enabled. <br />
<br />
2. Victim needs to enable such content to be opened after a few warnings. <br />
<br />
Similarly, for the LibreOffice, the &#8220;Evaluate formulas&#8221; options needs to be ticked.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2364"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2362">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2363'
	>
	In addition to the glaring CSV injection vulnerability, several critical endpoints lacked rate-limiting controls.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2367"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2365">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2366'
	>
	While the AI correctly implemented rate limiting for the registration and login endpoints, it failed to apply similar protections to the following endpoints, which attackers could exploit to perform potential denial-of-service (DoS) attacks as well as destructive behavior.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2369"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-html github-light" data-language="html" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">/post/new
</span></span><span class="line"><span class="token">/admin/toogle_ban/{user_id}
</span></span><span class="line"><span class="token">/admin/delete_user/{user_id}
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2372"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2370">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2371'
	>
	Additionally, the code contained a minor open redirect vulnerability, which could be exploited in phishing attack scenarios where an attacker can supply a malicious domain to the next URL argument.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2374"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-python github-light" data-language="python" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">login_user</span><span class="token">(</span><span class="token">user</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #d73a49;">return</span><span class="token"> </span><span class="token">redirect</span><span class="token">(</span><span class="token">request</span><span class="token">.</span><span class="token">args</span><span class="token">.</span><span class="token">get</span><span class="token">(</span><span class="token" style="color: #032f62;">&#039;</span><span class="token" style="color: #032f62;">next</span><span class="token" style="color: #032f62;">&#039;</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">or</span><span class="token"> </span><span class="token">url_for</span><span class="token">(</span><span class="token" style="color: #032f62;">&#039;</span><span class="token" style="color: #032f62;">dashboard</span><span class="token" style="color: #032f62;">&#039;</span><span class="token">)</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2377"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2375">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2376'
	>
	<strong>In conclusion, even when provided with a highly detailed prompt that explicitly instructs the AI to generate secure code, it is still likely to fall short in other areas or to overlook security considerations in certain features altogether.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2380"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2378">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2379'
	>
	Without precise, feature-specific security requirements, the AI tends to leave parts of the application insufficiently protected.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2383"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2381">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2382'
	>
	As demonstrated in this example, it successfully sanitized input fields, prevented SQL injection, and applied several other best practices, yet still failed to implement comprehensive, end-to-end security.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2386"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2384">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2385'
	>
	Ultimately, these gaps resulted in additional vulnerabilities despite the overall focus on secure development.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2389"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2387">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-2388'
	>
	<strong>The secret tokens predictability game</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2392"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2390">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2391'
	>
	While generating multiple web applications, I noticed a recurring pattern: AI models frequently produce “secret” tokens and keys that follow similar structures and wording.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2395"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2393">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2394'
	>
	This observation told me to take a deeper look into how predictable these generated secrets can be.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2398"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2396">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2397'
	>
	For example, when further creating even simpler web applications, the following tokens were generated in docker-compose and other configurational files:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2400"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-php github-light" data-language="php" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #005cc5;">dev</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #005cc5;">key</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #005cc5;">change</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #005cc5;">in</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #005cc5;">prod</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #005cc5;">982374</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #005cc5;">change_this_to_something_long_and_random_12345</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #005cc5;">your_ultra_secure_random_string_here</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #005cc5;">must_be_changed_to_secure_key_987123</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2403"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2401">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2402'
	>
	While these values may not appear in common brute-force wordlists (such as those targeting JWT secrets and other), they are not cryptographically secure and I could potentially see them being used.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2405"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-30-text js-typography block-highlighted-text__typography'
	data-id='es-2404'
	>
	<strong>The real risk is not that an attacker brute-forces a single secret, but that AI-generated applications at scale may share similar default or placeholder secrets that are not cryptographically secure. An attacker could leverage this predictability by compiling lists of common AI-generated keys and testing them across mass-produced, “vibe-coded” web applications.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2408"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2406">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2407'
	>
	Overall, this demonstrates a plausible attacker strategy: using multiple AI models to generate and aggregate common secret placeholders, then testing them against large numbers of similarly generated applications.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2411"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2409">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-2410'
	>
	<strong>The verdict</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2414"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2412">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2413'
	>
	Bottom line is:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2417"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2415">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2416'
	>
	<strong>Vibe coding is only as secure as the vibe coder’s understanding of potential vulnerabilities and their ability to instruct the AI to account for them.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2420"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2418">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2419'
	>
	When building an application using AI, it is critical to explicitly guide the model on the types of vulnerabilities that may arise in the generated code. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2423"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2421">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2422'
	>
	For instance, if you ask the AI to implement a file-upload feature, you must already provide clear requirements regarding file extensions, MIME-type validation, size limits, and other relevant mitigations.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2426"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2424">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2425'
	>
	The broader issue is that even the most detailed prompts do not guarantee secure output. AI can still generate insecure code or introduce subtle loopholes in unexpected places, and create critical business logic issues. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2428"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-30-text js-typography block-highlighted-text__typography'
	data-id='es-2427'
	>
	<strong>If you are using AI to accelerate development, the takeaway is not to avoid it. It is to treat it as a powerful assistant, not a security authority. Security remains a deliberate engineering discipline, not an emergent property of better prompts.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2431"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2429">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2430'
	>
	For this reason, it is highly recommended to conduct <a href="https://infinum.com/cybersecurity/penetration-testing/" id="https://infinum.com/cybersecurity/penetration-testing/">real-world penetration testing</a>, in which security professionals review both the code and the application’s runtime behavior to identify and mitigate risks before they become exploitable.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2434"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2432">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2433'
	>
	Explore our <strong><a href="https://infinum.com/cybersecurity/">cybersecurity services</a></strong> — from penetration testing to security architecture — and partner with experts who can identify risks before they become exploitable.</p></div>	</div>
</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/security-gaps-in-vibe-coded-applications/">Security Gaps in Vibe-Coded Applications</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
					<item>
				<image>
					<url>19274858https://infinum.com/uploads/2026/02/paper-4.webp</url>
				</image>
				<title>Cyber Security Model v4: How MOD Suppliers Can Prepare for Stricter Cyber Rules</title>
				<link>https://infinum.com/blog/cyber-security-model-v4/</link>
				<pubDate>Mon, 02 Feb 2026 15:21:04 +0000</pubDate>
				<dc:creator>Tom Miller</dc:creator>
				<guid isPermaLink="false">https://infinum.com/?p=19274858</guid>
				<description>
					<![CDATA[<p>Learn how MOD suppliers can prepare for CSMv4 with support from a DCC Level 1 certified company.</p>
<p>The post <a href="https://infinum.com/blog/cyber-security-model-v4/">Cyber Security Model v4: How MOD Suppliers Can Prepare for Stricter Cyber Rules</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[<div
	class="wrapper"
	data-id="es-2570"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-2437">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2440"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2438">
	<p	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-2439'
	>
	<strong>The UK Ministry of Defence has officially rolled out Cyber Security Model v4, introducing stricter, more structured cyber security requirements for defence suppliers. Learn how CSM v4, DEFSTAN 05-138, and Defence Cyber Certification fit together and prepare for CSM v4 with a DCC Level 1 certified partner.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2443"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2441">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2442'
	>
	The UK Ministry of Defence (MOD) has raised the bar for everyone in its supply chain.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2446"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2444">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2445'
	>
	Starting December 3, 2025, all companies working with the MOD – whether a prime contractor, a Tier 2 supplier, or a <a href="https://infinum.com/third-party-cyber-risk-management/" id="https://infinum.com/third-party-cyber-risk-management/">third-party vendor</a> buried three layers deep – must follow a new set of cyber rules called the Cyber Security Model (CSM v4).</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2449"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2447">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2448'
	>
	The interim process tied to DEFCON 658 is out.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2452"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2450">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2451'
	>
	In its place? A more structured, standardised framework that <a href="https://infinum.com/blog/software-supply-chain-security/" target="_blank" rel="noreferrer noopener">holds every supplier and their subcontractors accountable</a> for how they assess, manage, and report <a href="https://infinum.com/enterprise-cyber-risk-management/" id="https://infinum.com/enterprise-cyber-risk-management/">cyber risk</a>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2454"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-2453'
	>
	<strong>If you&#8217;re doing business with the MOD, you’ll need to follow stricter requirements, use new government tools, and be ready to show exactly how you’re protecting your digital systems and sensitive data.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2457"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2455">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2456'
	>
	So, what’s changed, and what does compliance actually look like now? </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2460"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2458">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2459'
	>
	Learn how MOD suppliers can prepare for Cyber Security Model v4 <strong>from </strong><a href="https://www.amrcybersecurity.com/" id="https://www.amrcybersecurity.com/"><strong>AMR CyberSecurity –</strong> <strong>part of Infinum</strong></a><strong>, a Defence Cyber Certification Level 1 certified company.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2463"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2461">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-2462'
	>
	<strong>What is CSM and why does it matter?</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2466"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2464">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2465'
	>
	The Cyber Security Model (CSM) is the MOD’s framework to make sure <a href="https://infinum.com/blog/software-supply-chain-security/">every link in its supply chain takes cybersecurity seriously</a>. It’s a risk-based model that applies proportionate security controls based on the nature and sensitivity of the work being delivered.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2469"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2467">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2468'
	>
	But this isn’t just about your organisation. Under CSM v4, cyber accountability flows downstream, meaning you’re also responsible for assessing and validating the cyber posture of your subcontractors and third-party vendors. No matter how large or small, one weak link can put an entire contract at risk.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2472"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2470">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2471'
	>
	So, what exactly does the MOD expect you to do?</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2476"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--black block-bullet__bullet" data-id="es-2473">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-2474'
	>
	<strong>Complete or respond to Risk Assessments (RAs)</strong></p><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-2475'
	>
	Before any procurement or contract work begins, the MOD Delivery Team will carry out a Risk Assessment to determine your Cyber Risk Profile (CRP) – essentially, how risky your role is from a cybersecurity standpoint. Based on this, your organisation will be assigned a CRP level (from Basic to Expert), which then dictates the level of controls you’ll need to meet.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2480"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--black block-bullet__bullet" data-id="es-2477">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-2478'
	>
	<strong><strong>Fill out a Supplier Assurance Questionnaire (SAQ)</strong></strong></p><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-2479'
	>
	Once your CRP is set, you’ll need to complete a <a href="https://www.supplier-cyber-protection.service.gov.uk/scps" target="_blank" rel="noreferrer noopener">Supplier Assurance Questionnaire</a> (SAQ) through the Supplier Cyber Protection Service portal. This self-assessment shows how your organisation stacks up against the security controls required for your CRP level and is a mandatory part of the MOD’s supplier onboarding and compliance process.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2484"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--black block-bullet__bullet" data-id="es-2481">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-2482'
	>
	<strong><strong><strong>Apply relevant cyber controls from DEFSTAN 05-138</strong></strong></strong></p><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-2483'
	>
	The cyber controls you&#8217;re being measured against are defined in <a href="https://www.gov.uk/government/publications/cyber-security-for-defence-suppliers-def-stan-05-138-issue-4" target="_blank" rel="noreferrer noopener">DEFSTAN 05-138</a>, a detailed MOD standard that outlines the minimum cyber security requirements for each CRP level. These range from essential controls at the lowest level, all the way up to comprehensive, expert-level defences for higher-risk contracts.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2488"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--black block-bullet__bullet" data-id="es-2485">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-2486'
	>
	<strong><strong><strong><strong><strong>Create a Cyber Improvement Plan (CIP) if you’re not fully compliant</strong></strong></strong></strong></strong></p><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-2487'
	>
	Not quite meeting the requirements? That’s not an automatic disqualification, but you’ll need to document why. A Cyber Improvement Plan (CIP) outlines the gaps in your current setup, the steps you’re taking to close them, and the timeline for becoming fully compliant. It’s a structured way to stay in the game while actively improving your security posture.<br />
</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2491"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2489">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2490'
	>
	Bottom line: If you want to work with the MOD, you need to take cybersecurity seriously – and be able to prove it.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2494"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-2492"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-2493">
	<picture class="image__picture block-media__image-picture">
								
			<source
				srcset=https://infinum.com/uploads/2026/02/img-dcc-cs-chart-1400x1400.webp				media='(max-width: 699px)'
				type=image/webp								height="1400"
												width="1400"
				 />
												<img
					src="https://infinum.com/uploads/2026/02/img-dcc-cs-chart.webp"
					class="image__img block-media__image-img"
					alt="CSM v4 supplier compliance process flowchart — from risk assessment to contract award"
										height="2100"
															width="2100"
										loading="lazy"
					 />
					</picture>

			<figcaption class="image__figcaption block-media__image-figcaption">
			<em>The MOD’s CSM v4 process flow: From initial risk assessment to contract award, suppliers must demonstrate cyber-readiness through self-assessment, compliance checks, and, if needed, improvement plans.</em>		</figcaption>
	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2497"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2495">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-2496'
	>
	<strong>DEFSTAN 05-138: What the MOD Expects</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2500"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2498">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2499'
	>
	Building on the CRP levels established during the initial CSM risk assessment, <a href="https://www.gov.uk/government/publications/cyber-security-for-defence-suppliers-def-stan-05-138-issue-4" target="_blank" rel="noreferrer noopener">DEFSTAN 05-138</a> outlines the specific cybersecurity controls that suppliers must meet based on their assigned risk profile.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2503"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2501">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2502'
	>
	This MOD standard acts as the benchmark for what’s expected at each level, from basic hygiene to expert-grade defences. The higher the risk, the more comprehensive and stringent the requirements. These controls form the foundation of both the SAQ process and any future DCC certification.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2506"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2504">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2505'
	>
	Here’s what each level includes:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2510"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--infinum block-bullet__bullet" data-id="es-2507">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<h3	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-2508'
	>
	<strong><strong>Level 0 – Basic (3 controls)</strong></strong></h3><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-2509'
	>
	The Level 0 ‘Basic<strong>’</strong> profile applies where there is a very low assessed cyber risk. It’s typically used for suppliers delivering outputs with minimal exposure to sensitive systems or data. At this level, organisations are expected to demonstrate basic cyber security hygiene: simple, essential measures that reduce common risks.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2514"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--infinum block-bullet__bullet" data-id="es-2511">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<h3	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-2512'
	>
	<strong><strong><strong>Level 1 – Foundational (101 controls)</strong></strong></strong></h3><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-2513'
	>
	The Level 1 ‘Foundational’ profile is assigned where there is a low to moderate level of cyber risk. Suppliers at this level must show they have a comprehensive cyber security programme in place, covering core areas such as <a href="https://infinum.com/governance-risk-compliance-services/" id="https://infinum.com/governance-risk-compliance-services/">governance</a>, access control, incident response, and secure system management. Good practice is expected here.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2518"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--infinum block-bullet__bullet" data-id="es-2515">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<h3	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-2516'
	>
	<strong><strong><strong><strong>Level 2 – Advanced (139 controls)</strong></strong></strong></strong></h3><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-2517'
	>
	The Level 2 ‘Advanced’ profile applies to suppliers delivering higher-risk contracted outputs. At this stage, organisations need to demonstrate advanced oversight, planning, and control of their cyber environment. This means mature policies, active monitoring, and well-embedded security processes that support robust organisational and operational resilience.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2522"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--infinum block-bullet__bullet" data-id="es-2519">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<h3	class='typography typography--size-24-text js-typography bullet__heading'
	data-id='es-2520'
	>
	<strong><strong><strong><strong><strong>Level 3 – Expert (144 controls)</strong></strong></strong></strong></strong></h3><p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-2521'
	>
	The Level 3 ‘Expert’ profile represents the highest level of assessed cyber risk. Suppliers operating at this level are expected to demonstrate expert cyber security capabilities, fully embracing a <em>defence in depth</em> approach. Controls are designed to protect against sophisticated, evolving threats and assume that breaches are possible, focusing on prevention, detection, response, and recovery.</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2525"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2523">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2524'
	>
	It’s important to note that these controls are considered a minimum baseline.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2528"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2526">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2527'
	>
	Depending on the nature of the contract, the MOD may impose additional cyber requirements on top of DEFSTAN 05-138, raising the bar even further for critical or sensitive work.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2531"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2529">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-2530'
	>
	<strong>Enter DCC: Independent certification for defence suppliers</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2534"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2532">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2533'
	>
	To move beyond self-assessments and strengthen assurance across the defence supply chain, the MOD, together with IASME as the Certification Authority, introduced the <a href="https://iasme.co.uk/defence-cyber-certification/" target="_blank" rel="noreferrer noopener">Defence Cyber Certification (DCC)</a>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2541"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<a	class="card-simple js-card-simple card-simple--is-ad block-card__card-simple card-simple--has-link js-card-simple-link card-simple__content-align--left"
	data-id="es-2535"
	 href='https://infinum.com/cybersecurity/'>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<p	class='typography typography--size-36-text js-typography card-simple__heading'
	data-id='es-2536'
	>
	<strong>Got questions about CSM v4 or DCC? Let’s talk.</strong></p>		</div>

		<p	class='typography typography--size-16-text-roman js-typography card-simple__paragraph'
	data-id='es-2537'
	 id='es-2535-paragraph'>
	AMR CyberSecurity – part of Infinum is a Level 1 certified DCC Certification Body, and our security-cleared consultants are ready to help you navigate the requirements and move forward with confidence.</p><button	class="btn btn--color-infinum btn--size-small btn--width-default btn__icon-position--right card-simple__btn js-block-card-btn js-card-simple-link"
	data-id="es-2538"
	 tabindex='-1'>
		<div class="btn__inner">
					<div	class='typography typography--size-none js-typography btn__label'
	data-id='es-2539'
	>
	Contact us</div>		
		<i
	class="icon btn__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='arrow-right-16' data-id='es-2540'>
	<svg fill='none' height='16' viewBox='0 0 17 16' width='17' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'><g stroke='currentColor' stroke-width='2'><path d='m.5 7.99999 14 .00001'/><path d='m9.23352 2.7251 5.97848 5.97852'/><path d='m9.23352 13.2744 5.97848-5.9785'/></g></svg></i>	</div>
	</button>	</div>
</a>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2544"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2542">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2543'
	>
	DCC isn’t a full replacement for the Supplier Assurance Questionnaire (SAQ), at least not yet. But it’s clear that the MOD is positioning DCC as the gold standard for demonstrating cyber maturity.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2547"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2545">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2546'
	>
	Over time, it’s expected to become more tightly integrated into the Supplier Cyber Protection Service and potentially reduce the burden of repeated self-reporting.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2550"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2548">
	<h3	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2549'
	>
	<strong>How it works:</strong></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2553"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-2551">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-2552'
	>
	<li>DCC certification is available in four levels, each aligned to CRP Levels 0 through 3, ensuring suppliers are measured against the appropriate risk threshold.</li><li>Certification offers a point-in-time snapshot of a supplier’s compliance with DEFSTAN 05-138.</li><li>To stay certified, suppliers must complete an annual check-in and undergo full recertification every three years, through an approved DCC Certification Body, such as <strong>AMR CyberSecurity – part of Infinum.</strong></li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2556"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2554">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2555'
	>
	For suppliers working on sensitive contracts, or for the ones hoping to, DCC is quickly becoming<strong> </strong>table stakes. It’s a proactive way to prove compliance, strengthen your competitive edge in defence tenders, and demonstrate to the MOD that cyber security is not just a policy on paper, but a practice in action.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2559"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2557">
	<h2	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-2558'
	>
	<strong>How can we help</strong></h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2562"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2560">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2561'
	>
	Whether you&#8217;re tackling your first Risk Assessment or gearing up for DCC certification,we are here to support you.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2565"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2563">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2564'
	>
	<span class='screen-reader-text'>As a Level 1 certified DCC Certification Body, we provide more than just checklists. We’ve partnered with both prime contractors and subcontractors throughout the MOD supply chain, helping defence suppliers navigate CSM v4 from day one – whether you&#8217;re assessing your CRP, preparing for DCC, or building a CIP roadmap.</span><span aria-hidden='true'>As a <strong>Level 1-certified DCC Certification Body</strong>, AMR CyberSecurity – part of Infinum provides more than just checklists. We’ve partnered with both prime contractors and subcontractors throughout the MOD supply chain, helping defence suppliers navigate CSM v4 from day one – whether you&#8217;re assessing your CRP, preparing for DCC, or building a CIP roadmap.</span></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-2568"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-2566">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-2567'
	>
	<span class='screen-reader-text'>From independent assessments to hands-on consultancy, we tailor our approach to fit your organisation’s needs, so you’re not just compliant, you’re truly cyber-resilient. If you want to discuss your next steps, contact us.</span><span aria-hidden='true'><em>From independent assessments to hands-on consultancy, we tailor our approach to fit your organisation’s needs, so you’re not just compliant, you’re truly cyber-resilient. If you want to discuss your next steps, <a href="https://infinum.com/cybersecurity/#form" target="_blank" rel="noreferrer noopener">contact</a><a href="https://infinum.com/cybersecurity/#form"> us</a>.</em></span></p></div>	</div>
</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/cyber-security-model-v4/">Cyber Security Model v4: How MOD Suppliers Can Prepare for Stricter Cyber Rules</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
		
	</channel>
</rss>