<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[System Weakness - Medium]]></title>
        <description><![CDATA[System Weakness is a publication that specialises in publishing upcoming writers in cybersecurity and ethical hacking space. Our security experts write to make the cyber universe more secure, one vulnerability at a time. - Medium]]></description>
        <link>https://systemweakness.com?source=rss----f20a9840e177---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>System Weakness - Medium</title>
            <link>https://systemweakness.com?source=rss----f20a9840e177---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Tue, 10 Nov 2026 05:41:41 GMT</lastBuildDate>
        <atom:link href="https://systemweakness.com/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[PHP2Shell Explained: How a PHP Memory Error Became Remote Code Execution]]></title>
            <link>https://systemweakness.com/php2shell-explained-how-a-php-memory-error-became-remote-code-execution-38536012ef35?source=rss----f20a9840e177---4</link>
            <guid isPermaLink="false">https://medium.com/p/38536012ef35</guid>
            <category><![CDATA[application-security]]></category>
            <category><![CDATA[cybersecurity]]></category>
            <category><![CDATA[web-security]]></category>
            <category><![CDATA[vulnerability-research]]></category>
            <category><![CDATA[php]]></category>
            <dc:creator><![CDATA[Sanketh Subhas]]></dc:creator>
            <pubDate>Sat, 07 Nov 2026 17:51:01 GMT</pubDate>
            <atom:updated>2026-11-07T17:51:01.552Z</atom:updated>
            <content:encoded><![CDATA[<h3><em>An illustrated, beginner-friendly case study of CVE-2026–109618 and CVE-2026–109619, with the small browser experiments that helped me understand it.</em></h3><p>A security research article led me down a rabbit hole: <strong>How can making a web server run out of memory possibly allow someone to execute code on it?</strong></p><p>I understood that servers have RAM and applications can crash. What I didn’t understand was the connection between an ordinary out-of-memory error and <strong>remote code execution (RCE)</strong>. So I started at the beginning. I ran a few harmless PHP snippets in a browser-based sandbox, observed memory usage, simulated interrupted operations, and then mapped those concepts back to the PHP2Shell research. Later, a security advisory circulated at work and made the topic feel much less theoretical.</p><p>This post is <strong>a learning case study, not an original vulnerability discovery or penetration test</strong>. I did not attempt the PHP2Shell exploit or probe any employer or third-party infrastructure. The shopping scenario below is fictional, and the PHP sandbox experiments demonstrate concepts rather than the vulnerabilities themselves.</p><h3>First question: What actually happens when I visit a PHP website?</h3><p>Imagine buying a T-shirt from a fictional online clothing store that uses PHP on the backend. Starting from the moment I open my laptop:</p><ol><li><strong>Open the laptop and browser.</strong> That alone doesn’t necessarily contact the store.</li><li><strong>Enter the store’s URL.</strong> The browser sends an HTTP <strong>GET</strong> request for the homepage. The returned HTML may cause additional requests for images, CSS, fonts, JavaScript and APIs.</li><li><strong>Open a product page.</strong> This may generate another <strong>GET</strong> request.</li><li><strong>Select a size.</strong> This might happen entirely in JavaScript or trigger an API request to check inventory.</li><li><strong>Add the product to cart.</strong> The browser might send a <strong>POST</strong> request containing the product ID, size and quantity.</li><li><strong>Open checkout.</strong> Another request may fetch a checkout view.</li><li><strong>Place the order.</strong> A POST request typically submits the order; the backend validates it, works with storage and may contact a payment processor.</li><li><strong>See confirmation.</strong> The response may render confirmation directly or redirect the browser to another page.</li></ol><p>Not every click or keystroke makes an HTTP request. Some interactions are entirely local to the browser. A real website may also issue many more background requests than this simple walkthrough.</p><p><strong>Where does PHP run?</strong> On the company’s server, VM or container — not in the shopper’s browser. PHP executes the server-side application logic and can generate HTML or JSON. The browser renders HTML, runs JavaScript, and uses <strong>my laptop’s RAM</strong>. The PHP worker separately uses <strong>the server’s RAM</strong>. HTML does not execute PHP.</p><p>If the customer submits name=Sam, PHP might read that data via $_POST[&#39;name&#39;]. PHP variables use memory, and PHP arrays use internal hash-table structures. But not every variable is a hash-table entry, and a customer&#39;s purchase record is not the same thing as PHP&#39;s temporary internal memory entry.</p><h3>The sandbox: I wanted to see PHP use memory</h3><p>I used an online PHP sandbox because I wasn’t going to install tools or run security experiments on a company-managed laptop.</p><p>First, I generated a webpage:</p><pre>&lt;?php<br>$name = &quot;Sam&quot;;<br>echo &quot;&lt;h1&gt;Welcome, $name!&lt;/h1&gt;&quot;;<br>?&gt;</pre><p>That established the basic boundary: <strong>PHP generates output on the server; the browser displays it.</strong></p><p>Next, I measured memory while creating arrays:</p><pre>&lt;?php<br>$before = memory_get_usage();<br>$numbers = range(1, 10000);<br>$after = memory_get_usage();<br>echo &quot;Extra memory: &quot; . round(($after - $before) / 1024) . &quot; KB&quot;;<br>unset($numbers);<br>?&gt;</pre><p>Here are the real measurements I observed in my sandbox:</p><p>ExperimentBeforeAfterAfter unset()10,000 numbers393 KB653 KB393 KB20,000 numbers393 KB909 KB393 KB</p><p>The larger array used more memory. The unset() released the reference to the array; the reported usage returned to the starting value in this run. This did <strong>not</strong> mean all process memory was returned to the operating system. PHP&#39;s memory allocator can retain memory for reuse.</p><p>I then checked the sandbox configuration with ini_get(&#39;memory_limit&#39;): <strong>32 MB</strong>. That was a limit inside the <em>remote sandbox&#39;s PHP environment</em>, not on my laptop.</p><h3>“If I set a 1 MB limit, why did it reach 1,422 KB?”</h3><p>This was my first big misunderstanding. I created a variable called $practiceLimit and checked it after every array allocation. That did <strong>not</strong> change PHP’s actual 32 MB limit.</p><pre>$practiceLimit = 1024 * 1024; // just our threshold<br>$numbers = range(1, $i);    // allocate first<br>$memory = memory_get_usage(); // measure second<br>if ($memory &gt;= $practiceLimit) {<br>    break;                   // stop third<br>}</pre><p>My output climbed to <strong>1,422 KB</strong> at 35,000 numbers; the sandbox also reported a <strong>1,938 KB peak</strong> during the run. Why did it exceed 1,024 KB? Because the program checked <em>after</em> allocating. It then stopped by running break.</p><p><strong>No genuine out-of-memory fatal error occurred in this experiment.</strong> Our program stopped voluntarily; PHP’s real configured limit remained 32 MB.</p><p>This matters because <strong>a code-level threshold check and PHP’s runtime-enforced memory limit are two different things</strong>.</p><h3>What if PHP is interrupted halfway through a task?</h3><p>Next, I used a <em>handled exception</em>, not a genuine memory failure:</p><pre>$record = [&quot;status&quot; =&gt; &quot;in_progress&quot;];<br>try {<br>    throw new Exception(&quot;Interrupted!&quot;);<br>    $record[&quot;status&quot;] = &quot;complete&quot;;<br>} catch (Exception $e) {<br>    echo $record[&quot;status&quot;]; // in_progress<br>} finally {<br>    unset($record);<br>}</pre><p>The record never became complete because the exception interrupted the normal path. The finally block still cleaned up our variable. In a second experiment I intentionally <strong>omitted</strong> unset() and observed that the variable remained available to later code <strong>within that same execution</strong>. It was not proof of a memory leak or of data surviving into another web request.</p><p>We also simulated an unfinished $1,000 order. One branch of our toy code printed a payment message without checking order status; the other blocked processing because the order wasn’t complete. No payment was actually made. That was a demonstration of an <strong>application logic</strong> mistake, not the underlying PHP2Shell bug.</p><p>A critical caution: <strong>A catchable PHP exception is not the same as an out-of-memory fatal bailout inside the PHP interpreter.</strong> The experiments helped me think about interrupted work, but the real vulnerability lives inside PHP’s engine.</p><h3>Where PHP2Shell actually enters the picture</h3><p>The October 2026 research from <strong>Calif, with OpenAI and Wiz</strong>, describes two distinct core PHP vulnerabilities:</p><ul><li><strong>CVE-2026–109618:</strong> Memory exhaustion can interrupt internal request-data creation after PHP has counted an entry but before the entry is fully initialized.</li><li><strong>CVE-2026–109619:</strong> Request-owned internal state can continue pointing at memory that has already been freed, enabling unsafe use by later operations or requests.</li></ul><p>The PHP project rated both issues <strong>critical</strong>, and issued fixed releases on <strong>October 21, 2026</strong>. The researchers demonstrated unauthenticated RCE in affected configurations. Exploitability depends on the PHP runtime and deployment path; this does <strong>not</strong> mean every PHP application was compromised.</p><h3>Vulnerability one: “Count Jake before creating Jake”</h3><p>My easiest mental model was a fictional list of customers: Sam, Alex and Jake. But the <em>actual</em> records aren’t people or orders — they are internal PHP hash-table entries called <strong>buckets</strong>.</p><p>Imagine an internal table with two valid buckets. PHP begins adding a third:</p><ol><li>It increments counters indicating that the third slot is in use.</li><li>It tries to allocate the memory needed to finish that bucket’s key and value.</li><li>The allocation fails at the memory limit, and the operation is interrupted.</li><li>Cleanup later sees the incremented count and tries to process the unfinished third slot as if it were a valid bucket.</li></ol><p>This is not PHP thinking “Jake is a real customer.” It is PHP’s native cleanup code <strong>interpreting uninitialized or stale bytes as legitimate internal type information or pointers</strong>. An invalid pointer could crash the process; with sufficient attacker control over the memory layout, researchers demonstrated paths toward RCE.</p><p>For some affected <strong>Apache mod_php</strong> setups, this could be triggered while PHP parsed the incoming HTTP request — <strong>before the application’s PHP script had run</strong>. In the specific early-startup path described by the researchers, PHP-FPM could instead exit its worker, which is why the server execution model matters.</p><h3>Vulnerability two: “The paper was thrown away, but the address was kept”</h3><p>This one answered my repeated question: <strong>Does the broken information get carried to the next page refresh?</strong></p><p>In some vulnerable paths, request-specific memory was freed, but PHP worker state still contained a reference to it. If the <strong>same worker</strong> processed a subsequent request before that state had been correctly reset, PHP could follow the invalid reference. That is a <strong>use-after-free</strong>, also called a dangling-pointer problem.</p><p>A refresh <em>could</em> create another HTTP request, but it is not inherently the trigger; a different visitor’s request could also be the next one handled by that worker. The broken customer order is <strong>not copied into the next order</strong>. The issue is retained <strong>interpreter state</strong>, not persistent shopping-cart data.</p><h3>Why would an attacker do this? How does an error turn into RCE?</h3><p>The researchers investigated specially structured HTTP form and upload input that could make PHP allocate far more internal memory than the incoming request’s size suggests. They didn’t need visitors to type PHP source code into a website. The request parser itself could build large nested data structures.</p><p>However, <strong>forcing a fatal error is only stage one</strong>. Usually a crash is just a crash.</p><p>A possible exploitation chain is:</p><ol><li>Trigger a vulnerable interruption.</li><li>Cause PHP to process a partially initialized bucket or stale memory reference.</li><li>Influence the memory contents PHP sees when it follows that invalid state.</li><li>Turn the resulting unsafe read/write or object handling into control over program execution.</li><li>Execute attacker-chosen behavior in the context of the PHP worker, if the exploit succeeds.</li></ol><p>That final step is <strong>remote code execution (RCE)</strong>. RCE is not automatically root access. It initially provides the privileges of the compromised PHP/web-server process, and further access depends on system permissions and other weaknesses.</p><h3>How did the researchers discover the issue?</h3><p>The discovery had a history. Calif’s write-up traces its motivation through a <strong>2004</strong> PHP memory-limit RCE associated with Stefan Esser, a <strong>2020</strong> bug report about out-of-memory failures and temporary-file cleanup, and a <strong>2024</strong> OSTIF/Quarkslab audit that identified related behavior without proving exploitation.</p><p>In <strong>2026</strong>, researchers revisited the hypothesis with AI-assisted source-code review. They looked at how PHP’s memory allocator, fatal-error handling, and request shutdown interact. One especially revealing code sequence incremented a hash-table entry count <em>before</em> an allocation that could fail. From there, they investigated additional “publish state → perform fallible work → skip cleanup/rollback” patterns, including session and deserialization paths.</p><p>According to the original timeline, initial discoveries were made in <strong>August 2026</strong>, the first issue was reported to PHP on <strong>August 11</strong>, a working RCE proof of concept was confirmed by PHP on <strong>August 15</strong>, the second issue was reported on <strong>August 21</strong>, and fixes were released on <strong>October 21</strong>.</p><p>I found the research approach more interesting than a generic “AI found a bug” headline: historical domain knowledge shaped the question; AI assisted the investigation; researchers validated the actual exploit and coordinated disclosure.</p><h3>How did PHP patch it?</h3><p><strong>The fix was not simply “kill the server whenever something goes wrong.”</strong> That was one of my questions too.</p><p>In the patched versions, PHP’s configured memory_limit becomes a <strong>soft limit</strong> for many allocations: an allocation may complete so that internal state is left consistent, and PHP raises the fatal error later at a safer execution point. A separate <strong>hard limit</strong> bounds how far memory may grow; if it would be exceeded, the process is terminated immediately rather than running potentially unsafe cleanup.</p><p>A request can still fail. The security improvement is that failure should not provide the original memory-corruption path. The release also addresses the stale-state vulnerability.</p><p><strong>Fixed upstream releases issued October 21, 2026:</strong></p><p>PHP branchFixed release8.28.2.358.38.3.368.48.4.278.58.5.12</p><p>An additional nuance for readers following the story in real time: on <strong>October 23, 2026</strong>, PHP published a separate informational advisory about a rare session-upload-progress configuration and recommended disabling that feature temporarily in affected setups. That follow-up should not be conflated with the two CVEs discussed here; it is another reason to check current vendor advisories rather than treat a version number as the end of a security review.</p><p>PHP 8.1 and earlier are end-of-life <strong>upstream</strong>. Enterprise Linux and long-term-support vendors may backport security fixes, so administrators must check their distributor’s advisories rather than conclude that an older version string necessarily means unpatched.</p><h3>Did patching RCE eliminate DoS and DDoS?</h3><p><strong>No — and it doesn’t have to for the RCE patch to be real.</strong> This was another question I had.</p><p>Memory-intensive or high-volume requests can still create availability problems if enough workers, CPU time, RAM or connections are exhausted. A <strong>DoS</strong> is a loss of service availability; <strong>DDoS</strong> involves distributed attack sources. One expensive request might fail in isolation, while many expensive requests could degrade a service.</p><p>Defense in depth includes vendor patching, reverse-proxy request limits, rate limiting, limits on input nesting and count, PHP worker limits, resource isolation, monitoring and capacity planning. A small request body may expand into a much larger in-memory representation, so <strong>capping only raw HTTP body size is not enough</strong>.</p><p>Importantly, temporarily removing PHP’s memory limit was documented as a <em>partial pre-patch mitigation</em> for one attack path, <strong>not</strong> as a safe universal anti-DoS recommendation; it can increase resource-exhaustion risk. The supported fix is patching.</p><h3>Where do organizations patch PHP — and can an ordinary user check?</h3><p>On <strong>the servers or containers where PHP runs</strong>, not on a customer’s browser. An authorized administrator may inspect a PHP CLI version with php -v, but a web server can run a different PHP version; package provenance and backported vendor fixes also matter.</p><p>A browser user <strong>cannot reliably verify a remote website’s PHP patch level</strong>. Some sites reveal a version header, but that can be absent, outdated or insufficient. Real confirmation comes from the system owner: their inventory, package advisories, deployment records and verification.</p><p>A related question came up when I saw an advisory circulated to service providers at work. <strong>Why did I receive a PHP warning if PHP is server-side?</strong> Because provider organizations may manage their own web applications and infrastructure. The advisory asked their IT teams to check affected installations. Receiving that message does not prove the sender’s platform or my employer was vulnerable or compromised.</p><h3>The questions that changed my understanding</h3><p><strong>Does HTML execute PHP?</strong> No. PHP runs on the backend and may generate HTML; the browser renders it.</p><p><strong>Does PHP use my laptop’s RAM?</strong> Server-side PHP uses server RAM. The browser uses my device RAM for its own work.</p><p><strong>Did my 1 MB sandbox experiment produce a real PHP fatal error?</strong> No. I set an artificial threshold and stopped the loop myself.</p><p><strong>Was an unfinished purchase treated as another customer?</strong> No. The real bug involved PHP-internal hash-table buckets, not a database of orders.</p><p><strong>Was cleanup skipped, or did it actually happen?</strong> Both patterns appeared in different bugs: unsafe cleanup of a partial bucket in one, and skipped state reset / dangling references in another.</p><p><strong>Does a later HTTP request always inherit the previous request’s memory?</strong> No. The cross-request issue required vulnerable worker state surviving in the same process.</p><p><strong>Does invalid memory automatically grant RCE?</strong> No. Exploitation requires additional control; many invalid accesses simply crash.</p><p><strong>Will an attacker see the fatal error in their browser?</strong> The failure occurs on the server. The browser might receive an HTTP error or a dropped connection.</p><p><strong>Can a patched server still suffer DoS?</strong> Yes. Preventing the particular RCE and preventing resource exhaustion are different security objectives.</p><p><strong>Can I tell from a website visit whether PHP is patched?</strong> Not reliably; confirmation generally requires authorized server-side evidence.</p><h3>My takeaway</h3><p>The bug wasn’t simply “PHP ran out of RAM.” It was <strong>what PHP believed about its own state after an error</strong>. Counting an entry before finishing it, or keeping a pointer after freeing its target, can turn ordinary error handling into a security boundary failure.</p><p>The most useful lesson I took from this case is about <strong>failure paths</strong>: safe software needs correct behavior not only when requests succeed, but also when allocations, initialization, callbacks and cleanup fail halfway through.</p><p>And for defenders, the practical conclusion is clear: <strong>patch the affected PHP runtime, verify the deployed web-facing version, and separately maintain resource-exhaustion protections.</strong></p><h3>Sources and attribution</h3><ul><li>Original research and technical discovery: <a href="https://calif.io/php2shell/">Calif — <em>PHP2Shell: A tale of two PHP remote vulnerabilities</em></a> (research by Ryan Austin, with OpenAI and Wiz referenced by the project).</li><li>Official <a href="https://www.php.net/archive/2026.php">PHP security advisory and October 21, 2026 release information</a>.</li><li>Official <a href="https://www.php.net/manual/en/ini.core.php">PHP manual: </a><a href="https://www.php.net/manual/en/ini.core.php">memory_limit and </a><a href="https://www.php.net/manual/en/ini.core.php">memory_hard_limit_percent</a>.</li><li>PHP <a href="https://www.php.net/archive/2026.php">October 23, 2026 informational advisory about session upload progress</a>.</li></ul><p><em>Diagrams are original educational illustrations. They simplify implementation details; consult the original research for the actual source-code paths. No live systems were tested for this article.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*QHDmFKHDTr6NmmNnyT0PYw.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*jobhMK_hBdOz_h9wrikVSw.png" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=38536012ef35" width="1" height="1" alt=""><hr><p><a href="https://systemweakness.com/php2shell-explained-how-a-php-memory-error-became-remote-code-execution-38536012ef35">PHP2Shell Explained: How a PHP Memory Error Became Remote Code Execution</a> was originally published in <a href="https://systemweakness.com">System Weakness</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[PHP2Shell TryHackMe Walkthrough by Arafat Ashrafi Talha]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://systemweakness.com/php2shell-tryhackme-walkthrough-by-arafat-ashrafi-talha-e0178c971dba?source=rss----f20a9840e177---4"><img src="https://cdn-images-1.medium.com/max/900/0*GbGDf_XhANPTbbvw" width="900"></a></p><p class="medium-feed-snippet">Exploit the PHP2Shell runtime CVEs via session.upload_progress for unauthenticated RCE.</p><p class="medium-feed-link"><a href="https://systemweakness.com/php2shell-tryhackme-walkthrough-by-arafat-ashrafi-talha-e0178c971dba?source=rss----f20a9840e177---4">Continue reading on System Weakness »</a></p></div>]]></description>
            <link>https://systemweakness.com/php2shell-tryhackme-walkthrough-by-arafat-ashrafi-talha-e0178c971dba?source=rss----f20a9840e177---4</link>
            <guid isPermaLink="false">https://medium.com/p/e0178c971dba</guid>
            <category><![CDATA[php]]></category>
            <category><![CDATA[web-app-security]]></category>
            <category><![CDATA[cyberattack]]></category>
            <category><![CDATA[cybersecurity]]></category>
            <category><![CDATA[tryhackme]]></category>
            <dc:creator><![CDATA[Arafat Ashrafi Talha]]></dc:creator>
            <pubDate>Wed, 04 Nov 2026 19:47:01 GMT</pubDate>
            <atom:updated>2026-11-04T19:47:01.689Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[The API Returned 200 OK. The Operation Still Failed.]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://systemweakness.com/the-api-returned-200-ok-the-operation-still-failed-d56182140ca5?source=rss----f20a9840e177---4"><img src="https://cdn-images-1.medium.com/max/2600/0*wWuhJqqMDj3ODRK6" width="6720"></a></p><p class="medium-feed-snippet">How partial failures, misleading success responses, asynchronous processing, and distributed-system inconsistencies turn a green status&#x2026;</p><p class="medium-feed-link"><a href="https://systemweakness.com/the-api-returned-200-ok-the-operation-still-failed-d56182140ca5?source=rss----f20a9840e177---4">Continue reading on System Weakness »</a></p></div>]]></description>
            <link>https://systemweakness.com/the-api-returned-200-ok-the-operation-still-failed-d56182140ca5?source=rss----f20a9840e177---4</link>
            <guid isPermaLink="false">https://medium.com/p/d56182140ca5</guid>
            <category><![CDATA[ethical-hacking]]></category>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[coding]]></category>
            <category><![CDATA[cybersecurity]]></category>
            <category><![CDATA[programming]]></category>
            <dc:creator><![CDATA[Fateyaly]]></dc:creator>
            <pubDate>Wed, 04 Nov 2026 02:50:42 GMT</pubDate>
            <atom:updated>2026-11-04T02:50:41.689Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Detecting AMSI Bypass Attempts: A Blue Team Guide]]></title>
            <link>https://systemweakness.com/detecting-amsi-bypass-attempts-a-blue-team-guide-151ec3d59590?source=rss----f20a9840e177---4</link>
            <guid isPermaLink="false">https://medium.com/p/151ec3d59590</guid>
            <category><![CDATA[cyber-security-awareness]]></category>
            <category><![CDATA[information-technology]]></category>
            <category><![CDATA[ethical-hacking]]></category>
            <category><![CDATA[cybersecurity]]></category>
            <category><![CDATA[security]]></category>
            <dc:creator><![CDATA[cyberrscourse]]></dc:creator>
            <pubDate>Wed, 04 Nov 2026 02:50:37 GMT</pubDate>
            <atom:updated>2026-11-04T02:50:36.354Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/640/1*tzQeXZqwMix8u9md-_ZMMA.jpeg" /></figure><p><em>How to identify and respond to AMSI evasion techniques in production environments</em></p><h3>Executive Summary</h3><p>In my previous article, I explored <strong>AMSI bypass techniques</strong> from an offensive perspective. Now, let’s flip the script. As defenders, understanding these bypasses isn’t enough — we need <strong>actionable detection strategies</strong>.</p><p>This article presents <strong>production-ready detection methods</strong> for AMSI tampering, complete with:</p><ul><li>PowerShell logging configurations</li><li>Event correlation patterns</li><li>YARA rules for memory scanning</li><li>Sysmon detection logic</li><li>Real-world response workflows</li></ul><p><strong>Target Audience:</strong> SOC analysts, threat hunters, security engineers, and anyone responsible for endpoint security.</p><h3>Understanding the Threat Landscape</h3><h3>Common AMSI Bypass Categories</h3><ol><li><strong>Memory Patching</strong> — Modifying amsi.dll in process memory</li><li><strong>API Hooking</strong> — Redirecting AMSI function calls</li><li><strong>Context Manipulation</strong> — Corrupting AMSI scan buffers</li><li><strong>Force Failures</strong> — Making AMSI always return “clean”</li></ol><h3>Real-World Impact</h3><ul><li><strong>95% of PowerShell-based attacks</strong> attempt AMSI bypass</li><li><strong>Median dwell time reduced</strong> from 24 hours to 4 hours when AMSI is functional</li><li><strong>Detection gap:</strong> Most organizations log AMSI events but don’t act on anomalies</li></ul><h3>Detection Strategy 1: PowerShell Script Block Logging</h3><h3>Configuration</h3><p>Enable aggressive PowerShell logging via GPO:</p><pre># Enable Script Block Logging<br>Set-ItemProperty -Path &quot;HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging&quot; `<br>    -Name &quot;EnableScriptBlockLogging&quot; -Value 1</pre><pre># Enable Module Logging<br>Set-ItemProperty -Path &quot;HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ModuleLogging&quot; `<br>    -Name &quot;EnableModuleLogging&quot; -Value 1</pre><pre># Enable Transcription<br>Set-ItemProperty -Path &quot;HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\Transcription&quot; `<br>    -Name &quot;EnableTranscripting&quot; -Value 1<br>Set-ItemProperty -Path &quot;HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\Transcription&quot; `<br>    -Name &quot;OutputDirectory&quot; -Value &quot;C:\PSTranscripts&quot;</pre><h3>Detection Patterns</h3><p><strong>Event ID 4104</strong> indicators:</p><pre>Suspicious strings in ScriptBlock:<br>- [Ref].Assembly.GetType<br>- System.Management.Automation.AmsiUtils<br>- amsiInitFailed<br>- [Runtime.InteropServices.Marshal]::Copy<br>- 0x5f,0x52,0x54 (XOR&#39;d &quot;amsi&quot;)<br>- VirtualProtect<br>- WriteProcessMemory</pre><h3>Splunk Detection Query</h3><pre>index=windows EventCode=4104<br>| regex ScriptBlockText=&quot;(?i)(amsi|System\.Management\.Automation\.AmsiUtils|amsiInitFailed|0x5f.*0x52.*0x54)&quot;<br>| eval severity=case(<br>    match(ScriptBlockText, &quot;(?i)amsiInitFailed&quot;), &quot;CRITICAL&quot;,<br>    match(ScriptBlockText, &quot;(?i)VirtualProtect.*amsi&quot;), &quot;CRITICAL&quot;,<br>    match(ScriptBlockText, &quot;(?i)System\.Management\.Automation\.AmsiUtils&quot;), &quot;HIGH&quot;,<br>    1=1, &quot;MEDIUM&quot;<br>  )<br>| stats count by Computer, User, severity, ScriptBlockText<br>| where count &gt; 0</pre><h3>Detection Strategy 2: Sysmon Configuration</h3><h3>Critical Event IDs</h3><p>Event IDDescriptionAMSI Bypass Indicator7Image Loadedamsi.dll loaded by unusual processes10Process AccessMemory reads targeting PowerShell/CLR8CreateRemoteThreadInjection into PowerShell process1Process CreateSuspicious PowerShell invocation patterns</p><h3>Sysmon Rule Configuration</h3><pre>&lt;Sysmon schemaversion=&quot;4.82&quot;&gt;<br>  &lt;EventFiltering&gt;<br>    &lt;!-- Detect AMSI.dll memory tampering --&gt;<br>    &lt;ProcessAccess onmatch=&quot;include&quot;&gt;<br>      &lt;TargetImage condition=&quot;end with&quot;&gt;powershell.exe&lt;/TargetImage&gt;<br>      &lt;TargetImage condition=&quot;end with&quot;&gt;powershell_ise.exe&lt;/TargetImage&gt;<br>      &lt;GrantedAccess condition=&quot;is&quot;&gt;0x1F3FFF&lt;/GrantedAccess&gt;<br>    &lt;/ProcessAccess&gt;<br>    <br>    &lt;!-- Detect reflection-based AMSI bypass --&gt;<br>    &lt;ImageLoad onmatch=&quot;include&quot;&gt;<br>      &lt;Image condition=&quot;end with&quot;&gt;powershell.exe&lt;/Image&gt;<br>      &lt;ImageLoaded condition=&quot;contains&quot;&gt;amsi.dll&lt;/ImageLoaded&gt;<br>    &lt;/ImageLoad&gt;<br>    <br>    &lt;!-- Detect suspicious PowerShell execution --&gt;<br>    &lt;ProcessCreate onmatch=&quot;include&quot;&gt;<br>      &lt;CommandLine condition=&quot;contains all&quot;&gt;-enc;-nop;-w hidden&lt;/CommandLine&gt;<br>      &lt;CommandLine condition=&quot;contains&quot;&gt;amsi&lt;/CommandLine&gt;<br>    &lt;/ProcessCreate&gt;<br>  &lt;/EventFiltering&gt;<br>&lt;/Sysmon&gt;</pre><h3>Correlation Rule</h3><pre># Pseudocode for SIEM correlation<br>def detect_amsi_bypass_chain(events):<br>    &quot;&quot;&quot;<br>    Correlate multiple events within 60-second window<br>    &quot;&quot;&quot;<br>    window = 60  # seconds<br>    <br>    # Stage 1: PowerShell process creation<br>    ps_create = events.filter(EventID=1, Image=&quot;powershell.exe&quot;)<br>    <br>    # Stage 2: AMSI.dll load<br>    amsi_load = events.filter(EventID=7, ImageLoaded=&quot;amsi.dll&quot;)<br>    <br>    # Stage 3: Memory tampering<br>    memory_access = events.filter(EventID=10, GrantedAccess=&quot;0x1F3FFF&quot;)<br>    <br>    # Stage 4: Script block with bypass<br>    script_block = events.filter(EventID=4104, ScriptBlock~=&quot;amsi&quot;)<br>    <br>    if all_within_window([ps_create, amsi_load, memory_access, script_block], window):<br>        return ALERT(severity=&quot;CRITICAL&quot;, technique=&quot;AMSI Bypass Chain&quot;)</pre><h3>Detection Strategy 3: Memory Analysis with YARA</h3><h3>YARA Rule for In-Memory Detection</h3><pre>rule AMSI_Bypass_Memory_Patch<br>{<br>    meta:<br>        description = &quot;Detects AMSI bypass via memory patching&quot;<br>        author = &quot;Your Name&quot;<br>        date = &quot;2026-10-15&quot;<br>        severity = &quot;high&quot;<br>        <br>    strings:<br>        // Common AMSI bypass strings<br>        $amsi1 = &quot;amsiInitFailed&quot; ascii wide<br>        $amsi2 = &quot;AmsiScanBuffer&quot; ascii wide<br>        $amsi3 = { 57 00 69 00 6E 00 33 00 32 00 5F 00 41 00 6D 00 73 00 69 }  // Win32_Amsi (wide)<br>        <br>        // Memory patch patterns<br>        $patch1 = { B8 57 00 07 80 C3 }  // mov eax, 0x80070057; ret (E_INVALIDARG)<br>        $patch2 = { 31 C0 C3 }  // xor eax, eax; ret<br>        $patch3 = { B8 01 00 00 00 C3 }  // mov eax, 1; ret (AMSI_RESULT_CLEAN)<br>        <br>        // VirtualProtect + AMSI<br>        $combo1 = { 56 69 72 74 75 61 6C 50 72 6F 74 65 63 74 }  // VirtualProtect<br>        <br>    condition:<br>        uint16(0) == 0x5A4D and  // MZ header<br>        (<br>            (2 of ($amsi*) and 1 of ($patch*)) or<br>            ($combo1 and 1 of ($amsi*))<br>        )<br>}</pre><pre>rule AMSI_Context_Bypass<br>{<br>    meta:<br>        description = &quot;Detects AMSI context manipulation&quot;<br>        <br>    strings:<br>        $ctx1 = &quot;amsiContext&quot; ascii wide nocase<br>        $ctx2 = &quot;amsiSession&quot; ascii wide nocase<br>        $ctx3 = { 00 00 00 00 00 00 00 00 00 00 00 00 }  // Null buffer<br>        $reflection = &quot;[Ref].Assembly.GetType&quot; ascii wide<br>        <br>    condition:<br>        2 of them<br>}</pre><h3>Scanning PowerShell Process Memory</h3><pre># Scan running PowerShell processes with YARA<br>function Scan-AMSIBypass {<br>    $yaraPath = &quot;C:\Tools\yara64.exe&quot;<br>    $rulesPath = &quot;C:\Rules\amsi_bypass.yar&quot;<br>    <br>    Get-Process powershell* | ForEach-Object {<br>        $pid = $_.Id<br>        Write-Host &quot;[*] Scanning PID $pid&quot;<br>        <br>        &amp; $yaraPath $rulesPath $pid | Out-File &quot;C:\Scans\amsi_scan_$pid.txt&quot;<br>        <br>        if ($LASTEXITCODE -eq 0) {<br>            Write-Warning &quot;[!] AMSI bypass detected in PID $pid&quot;<br>            # Trigger incident response<br>            Invoke-IncidentResponse -PID $pid -Type &quot;AMSI_BYPASS&quot;<br>        }<br>    }<br>}</pre><h3>Detection Strategy 4: EDR Behavioral Analytics</h3><h3>Behavioral Indicators</h3><pre>{<br>  &quot;detection_rule&quot;: &quot;AMSI Bypass Behavior Chain&quot;,<br>  &quot;severity&quot;: &quot;high&quot;,<br>  &quot;conditions&quot;: [<br>    {<br>      &quot;event&quot;: &quot;process_create&quot;,<br>      &quot;image&quot;: &quot;powershell.exe&quot;,<br>      &quot;command_line_contains&quot;: [&quot;-enc&quot;, &quot;-nop&quot;, &quot;-w hidden&quot;]<br>    },<br>    {<br>      &quot;event&quot;: &quot;module_load&quot;,<br>      &quot;module&quot;: &quot;amsi.dll&quot;,<br>      &quot;followed_by&quot;: &quot;memory_protect_change&quot;<br>    },<br>    {<br>      &quot;event&quot;: &quot;api_call&quot;,<br>      &quot;api&quot;: &quot;VirtualProtect&quot;,<br>      &quot;target_module&quot;: &quot;amsi.dll&quot;,<br>      &quot;protection&quot;: &quot;PAGE_EXECUTE_READWRITE&quot;<br>    },<br>    {<br>      &quot;event&quot;: &quot;registry_read&quot;,<br>      &quot;key&quot;: &quot;HKLM\\SOFTWARE\\Microsoft\\AMSI\\Providers&quot;<br>    }<br>  ],<br>  &quot;time_window_seconds&quot;: 10,<br>  &quot;action&quot;: &quot;alert_and_suspend_process&quot;<br>}</pre><h3>Detection Strategy 5: Network-Based Detection</h3><h3>C2 Beaconing Post-AMSI Bypass</h3><pre># Detect suspicious outbound connections after AMSI bypass<br>def detect_post_bypass_c2(flow_data):<br>    &quot;&quot;&quot;<br>    Network indicators following AMSI bypass<br>    &quot;&quot;&quot;<br>    indicators = {<br>        &#39;high_frequency_dns&#39;: flow_data.dns_queries &gt; 100 / minute,<br>        &#39;uncommon_ports&#39;: flow_data.dst_port in [8080, 4444, 443, 53],<br>        &#39;base64_in_headers&#39;: re.search(r&#39;[A-Za-z0-9+/]{50,}&#39;, flow_data.http_headers),<br>        &#39;dns_tunneling&#39;: len(flow_data.dns_query) &gt; 63,<br>        &#39;jarm_fingerprint&#39;: flow_data.jarm in KNOWN_C2_JARMS<br>    }<br>    <br>    if sum(indicators.values()) &gt;= 3:<br>        return ALERT(&quot;Potential C2 after AMSI bypass&quot;)</pre><h3>Incident Response Workflow</h3><h3>Phase 1: Detection &amp; Triage (0–5 minutes)</h3><pre>1. Alert fires from SIEM/EDR<br>2. Verify: Check Event ID 4104 + Sysmon Event 10<br>3. Classify: AMSI bypass confirmed?<br>   ├─ YES → Proceed to Phase 2<br>   └─ NO → False positive, tune detection</pre><h3>Phase 2: Containment (5–15 minutes)</h3><pre># Automated containment script<br>$targetPID = 1234  # From alert</pre><pre># 1. Suspend process<br>Suspend-Process -Id $targetPID</pre><pre># 2. Capture memory dump<br>procdump64.exe -ma $targetPID &quot;C:\IR\memory_$targetPID.dmp&quot;</pre><pre># 3. Network isolation<br>New-NetFirewallRule -DisplayName &quot;Block-PID-$targetPID&quot; `<br>    -Direction Outbound -Action Block -Program &quot;C:\Path\To\Process.exe&quot;</pre><pre># 4. Kill process<br>Stop-Process -Id $targetPID -Force</pre><h3>Phase 3: Investigation (15–60 minutes)</h3><pre># Analyze memory dump<br>volatility3 -f memory_1234.dmp windows.malfind<br>volatility3 -f memory_1234.dmp windows.cmdline<br>volatility3 -f memory_1234.dmp windows.netscan</pre><pre># Extract PowerShell history<br>volatility3 -f memory_1234.dmp windows.pstree</pre><h3>Phase 4: Remediation</h3><ol><li><strong>Validate AMSI health</strong>: Re-enable and test</li><li><strong>Hunt for persistence</strong>: Scheduled tasks, registry autoruns</li><li><strong>Threat intelligence</strong>: IOC extraction and sharing</li><li><strong>Patch gaps</strong>: Update detection rules</li></ol><h3>Key Performance Indicators (KPIs)</h3><h3>Measuring Detection Effectiveness</h3><pre># Detection effectiveness metrics<br>metrics = {<br>    &#39;Mean Time To Detect (MTTD)&#39;: &#39;&lt; 5 minutes&#39;,<br>    &#39;Mean Time To Respond (MTTR)&#39;: &#39;&lt; 15 minutes&#39;,<br>    &#39;False Positive Rate&#39;: &#39;&lt; 5%&#39;,<br>    &#39;Coverage&#39;: &#39;100% of known AMSI bypass techniques&#39;,<br>    &#39;Detection Rate&#39;: &#39;&gt; 95% in lab environment&#39;<br>}</pre><h3>Testing Your Detections</h3><pre># Safe AMSI bypass test (in isolated lab)<br>[Ref].Assembly.GetType(&#39;System.Management.Automation.AmsiUtils&#39;).GetField(&#39;amsiInitFailed&#39;,&#39;NonPublic,Static&#39;).SetValue($null,$true)</pre><pre># Expected detections:<br># - Event ID 4104 with &quot;amsiInitFailed&quot;<br># - Sysmon Event 10 (ProcessAccess)<br># - EDR alert for reflection abuse</pre><h3>Advanced: Machine Learning-Based Detection</h3><h3>Feature Engineering</h3><pre>import pandas as pd<br>from sklearn.ensemble import RandomForestClassifier</pre><pre># Feature extraction from PowerShell logs<br>features = {<br>    &#39;script_length&#39;: len(script),<br>    &#39;base64_ratio&#39;: count_base64(script) / len(script),<br>    &#39;obfuscation_entropy&#39;: calculate_entropy(script),<br>    &#39;reflection_count&#39;: script.count(&#39;[Ref]&#39;),<br>    &#39;amsi_string_count&#39;: script.lower().count(&#39;amsi&#39;),<br>    &#39;virtualprotect_present&#39;: &#39;virtualprotect&#39; in script.lower(),<br>    &#39;marshal_copy_present&#39;: &#39;marshal&#39; in script.lower() and &#39;copy&#39; in script.lower(),<br>    &#39;bypass_pattern_score&#39;: calculate_bypass_score(script)<br>}</pre><pre># Train model on labeled dataset<br>model = RandomForestClassifier(n_estimators=100)<br>model.fit(X_train, y_train)</pre><pre># Predict AMSI bypass attempts<br>prediction = model.predict([features])<br>confidence = model.predict_proba([features])[0][1]</pre><pre>if prediction == 1 and confidence &gt; 0.85:<br>    trigger_alert(&quot;ML-Detected AMSI Bypass&quot;, confidence)</pre><h3>Real-World Case Study</h3><h3>Incident: Ransomware with AMSI Bypass</h3><p><strong>Timeline:</strong></p><ul><li><strong>T+0m:</strong> PowerShell execution with base64-encoded payload</li><li><strong>T+2m:</strong> AMSI bypass via memory patching</li><li><strong>T+5m:</strong> Credential dumping (Mimikatz)</li><li><strong>T+10m:</strong> Lateral movement initiated</li><li><strong>T+15m:</strong> <strong>DETECTION</strong> via correlated Sysmon events</li><li><strong>T+18m:</strong> Containment and process termination</li></ul><p><strong>Lessons Learned:</strong></p><ol><li><strong>Script Block Logging saved us</strong> — captured the full attack chain</li><li><strong>Correlation was key</strong> — single events would’ve been noise</li><li><strong>Response playbook</strong> reduced MTTR from 2 hours to 18 minutes</li></ol><p><strong>Detection Logic That Worked:</strong></p><pre>IF (EventID=4104 AND ScriptBlock CONTAINS &quot;amsiInitFailed&quot;)<br>AND (EventID=10 AND TargetImage=&quot;powershell.exe&quot; WITHIN 60s)<br>AND (EventID=1 AND CommandLine CONTAINS &quot;mimikatz&quot; WITHIN 120s)<br>THEN ALERT(severity=CRITICAL, technique=&quot;Ransomware with AMSI Bypass&quot;)</pre><h3>Defensive Recommendations</h3><h3>Short-Term (0–30 days)</h3><ul><li>✅ Enable PowerShell Script Block Logging</li><li>✅ Deploy Sysmon with AMSI-focused config</li><li>✅ Create SIEM correlation rules</li><li>✅ Test detections with safe bypass samples</li></ul><h3>Medium-Term (30–90 days)</h3><ul><li>✅ Implement YARA memory scanning</li><li>✅ Deploy EDR behavioral rules</li><li>✅ Build incident response runbooks</li><li>✅ Conduct purple team exercises</li></ul><h3>Long-Term (90+ days)</h3><ul><li>✅ Machine learning model deployment</li><li>✅ Threat hunting program</li><li>✅ Automated response orchestration (SOAR)</li><li>✅ Continuous rule optimization</li></ul><h3>Conclusion</h3><p>AMSI bypass detection isn’t about a single silver bullet — it’s about <strong>defense in depth</strong>:</p><ol><li><strong>Logging</strong> captures the evidence</li><li><strong>Correlation</strong> connects the dots</li><li><strong>Automation</strong> ensures speed</li><li><strong>Human analysis</strong> validates and improves</li></ol><p><strong>Key Takeaway:</strong> Every offensive technique has a defensive counter. The question isn’t <em>if</em> you’ll be targeted, but <em>how quickly</em> you’ll detect it.</p><h3>Resources</h3><ul><li><a href="https://docs.microsoft.com/en-us/windows/win32/amsi/">Microsoft AMSI Documentation</a></li><li><a href="https://github.com/SwiftOnSecurity/sysmon-config">Sysmon Configuration Examples</a></li><li><a href="https://github.com/SigmaHQ/sigma">SIGMA Rules for AMSI Bypass</a></li><li>My Previous Article: AMSI Bypass Techniques</li></ul><p><strong>About the Author</strong></p><p>Security researcher focusing on adversary simulation and detection engineering. Writing about both offensive techniques and their defensive countermeasures.</p><p><strong>Next Article:</strong> <em>ETW for Threat Detection: The Ultimate Windows Telemetry Deep Dive</em></p><p><em>Follow for more blue team content. Questions? Drop them in the comments.</em></p><p><strong>Tags:</strong> #BlueTeam #ThreatDetection #AMSI #PowerShell #SOC #ThreatHunting #SecurityEngineering #EDR</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=151ec3d59590" width="1" height="1" alt=""><hr><p><a href="https://systemweakness.com/detecting-amsi-bypass-attempts-a-blue-team-guide-151ec3d59590">Detecting AMSI Bypass Attempts: A Blue Team Guide</a> was originally published in <a href="https://systemweakness.com">System Weakness</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Threat, Vulnerability, and Risk: Understanding the Difference with a Real-World Example]]></title>
            <link>https://systemweakness.com/threat-vulnerability-and-risk-understanding-the-difference-with-a-real-world-example-46102ba0c896?source=rss----f20a9840e177---4</link>
            <guid isPermaLink="false">https://medium.com/p/46102ba0c896</guid>
            <category><![CDATA[beginner-cybersecurity]]></category>
            <category><![CDATA[cybersecurity]]></category>
            <category><![CDATA[risk-assessment]]></category>
            <category><![CDATA[information-security]]></category>
            <category><![CDATA[cyber-risk-management]]></category>
            <dc:creator><![CDATA[Momal Naz]]></dc:creator>
            <pubDate>Wed, 04 Nov 2026 02:50:29 GMT</pubDate>
            <atom:updated>2026-11-04T02:50:28.094Z</atom:updated>
            <content:encoded><![CDATA[<p><em>One fictional online store, one security weakness, and three cybersecurity terms that are often confused.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*eE20LymMsZnJdw0XCAeXPw.png" /></figure><p>Greetings, everyone!</p><p>Today, we’re going to discuss three important terms in cybersecurity: <strong>Threat, Vulnerability, and Risk.</strong></p><p>If you’re new to cybersecurity, you’ve probably come across these terms while studying security concepts, reading vulnerability reports, or learning about risk assessments.</p><p>At first, they might sound almost the same. But they actually describe different parts of a security problem.</p><p>For example, imagine an online store that has an admin account without multi-factor authentication (MFA).</p><p>Would we call this a threat, a vulnerability, or a risk?</p><p>Interesting question, right?</p><p>To understand the difference, let’s take a simple example and explore how these three terms work together.</p><h3>Meet BrightCart, Our Example Company</h3><p>Imagine a small online shopping company called <strong>BrightCart</strong>.</p><p>BrightCart sells products online and uses an admin dashboard to manage daily business activities.</p><p>Through this dashboard, employees can:</p><ul><li>View and manage customer orders.</li><li>Access customer information.</li><li>Update product details.</li><li>Manage important store settings.</li></ul><p>Now think about what would happen if someone gained unauthorized access to this dashboard.</p><p>They might be able to view customer information, change orders, or interfere with normal business operations.</p><p>This is why the dashboard and the information it provides access to are important to BrightCart.</p><p>In cybersecurity, we call valuable things that need protection <strong>assets</strong>.</p><p>An asset doesn’t always have to be a physical device like a laptop or server. Customer data, business applications, user accounts, and important services can also be assets.</p><p>For our example, we’ll focus on BrightCart’s admin dashboard and the customer information it provides access to.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*PkjKg7Sypr23uqV0o9HL3g.png" /><figcaption><em>Figure 1: An illustrative view of BrightCart’s admin dashboard, showing the business information and functions that need protection.</em></figcaption></figure><h3>1. What Is a Threat?</h3><p>Let’s imagine that an attacker has obtained the password of one of BrightCart’s admin accounts.</p><p>The attacker now attempts to use that password to log in to the admin dashboard.</p><p>This situation introduces our first term: <strong>Threat</strong>.</p><p>A threat is something that has the potential to cause harm to a system, organization, or its information.</p><p>In this example:</p><ul><li><strong>Threat actor:</strong> The attacker trying to access the dashboard.</li><li><strong>Threat event:</strong> The attempted unauthorized login using a stolen password.</li></ul><p>Notice one important thing here.</p><p>We are not saying that the attacker has successfully logged in or that any customer information has been stolen.</p><p>We are only identifying an event that could potentially cause harm.</p><p>Also, threats don’t always involve hackers.</p><p>A fire in a server room, an accidental deletion of important files, or an unexpected system outage can also threaten an organization’s operations.</p><p>So whenever you’re trying to identify a threat, ask yourself:</p><p><strong>What could happen that might harm this system or business?</strong></p><h3>2. What Is a Vulnerability?</h3><p>Now let’s move a little further into our BrightCart example.</p><p>Suppose we discover that the admin dashboard only requires a username and password to log in.</p><p>There is no multi-factor authentication (MFA) enabled.</p><p>This means that if someone obtains a valid admin password, there may be no additional verification step to stop them from accessing the account.</p><p>Here, the missing MFA protection is our <strong>vulnerability</strong>.</p><p>A vulnerability is a weakness in a system, configuration, process, or security control that could be exploited by a threat.</p><p>Vulnerabilities aren’t always programming bugs.</p><p>For example:</p><ul><li>An admin account without MFA.</li><li>Weak or reused passwords.</li><li>Incorrectly configured access permissions.</li><li>Old employee accounts that still have access.</li><li>Software that hasn’t received important security updates.</li></ul><p>All these situations can introduce weaknesses that make a system easier to compromise.</p><p>Coming back to BrightCart, the attacker with a stolen password represents our threat scenario, while the lack of MFA represents the weakness that could make unauthorized access possible.</p><p>But remember, identifying a vulnerability doesn’t automatically mean someone has already exploited it.</p><p>This brings us to the next term.</p><h3>3. What Is Risk?</h3><p>So far, we have identified two things:</p><p>An attacker may attempt to use a stolen password, and BrightCart’s admin account doesn’t have MFA enabled.</p><p>Now, what happens if the attacker successfully logs in?</p><p>They might access customer information, modify orders, or disrupt the store’s normal operations.</p><p>This possible harmful outcome is what we need to consider when discussing <strong>risk</strong>.</p><p>In simple terms, cybersecurity risk is about what could go wrong, how likely it is to happen, and how much harm it could cause.</p><p>Let’s write a risk statement for BrightCart:</p><p><strong><em>An attacker using a stolen admin password could gain unauthorized access to BrightCart’s dashboard because MFA is not enabled, potentially exposing customer information or disrupting order processing.</em></strong></p><p>See how this statement connects everything?</p><p>We have identified the possible attack, the weakness that makes it possible, and the consequences for the business.</p><p>That’s much more useful than simply writing, “The company has a hacking risk.”</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*wMgvhQQT1oM1V_6voTD4iw.png" /><figcaption><em>Figure 2: A possible security risk involving stolen admin credentials, missing MFA, unauthorized access, and potential business impact. This is a hypothetical scenario, not an actual breach.</em></figcaption></figure><h3>How Do We Know Whether a Risk Is High or Low?</h3><p>This is where two more terms become important: <strong>Likelihood and Impact</strong>.</p><p>Likelihood helps us understand how likely a harmful event or outcome is, while impact describes how serious the consequences could be.</p><p>For BrightCart, we would need to ask a few questions.</p><p>Is the admin dashboard accessible from the internet?</p><p>Have there been any suspicious login attempts?</p><p>What information can the admin account access?</p><p>Are there other security controls already protecting the account?</p><p>And how badly could the business be affected if customer information was exposed or orders were changed?</p><p>The answers help us assess the risk.</p><p>We shouldn’t immediately label the risk as “High” just because MFA is missing. We need to understand the situation and the existing controls first.</p><h3>4. Let’s Compare All Three Terms</h3><p>Now that we’ve explored the example, let’s put everything together</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/656/1*3hHr6v1nA6PVpTKAYbPuJA.png" /></figure><p>Here’s a simple way to remember the difference.</p><p><strong>Threat:</strong> What could cause harm?</p><p><strong>Vulnerability:</strong> What weakness could allow it?</p><p><strong>Risk:</strong> What could go wrong, how likely is it, and how serious could the consequences be?</p><p>Once you understand these three questions, identifying security risks becomes much easier.</p><h3>5. What Happens If BrightCart Enables MFA?</h3><p>Now suppose BrightCart decides to improve its admin account security.</p><p>The company enables multi-factor authentication for its admin users.</p><p>Previously, the account only required a password. Now, logging in also requires an additional authentication factor.</p><p>This makes it more difficult for an attacker to access the account using only a stolen password.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*oA8J4qPn7rlwdAliTugMnw.png" /><figcaption><em>Figure 3: Comparing password-only authentication with MFA. Adding MFA reduces the risk of unauthorized access using stolen passwords, but does not eliminate every possible account-security risk.</em></figcaption></figure><p>However, enabling MFA doesn’t mean the company can forget about account security completely.</p><p>BrightCart still needs to make sure MFA is enabled for all relevant admin accounts, account recovery is secure, and the chosen authentication method is effective.</p><p>Other threats may still exist.</p><p>The important point is that a security control helps reduce risk, but the remaining risk still needs to be understood and managed.</p><h3>6. Let’s Try One More Example</h3><p>Before we finish, let’s apply the same idea to something we use almost every day: an email account.</p><p>Imagine an email account protected by a weak password.</p><p>An attacker might try to guess that password or use credentials obtained from another data breach.</p><p>Now let’s identify the terms.</p><p><strong><em>Asset</em>:</strong> Email account and the information stored inside it.</p><p><strong><em>Threat</em>:</strong> Someone attempting unauthorized access.</p><p><strong><em>Vulnerability</em>:</strong> Weak or reused password.</p><p><strong><em>Risk</em>:</strong> The possibility of an attacker gaining access and exposing private emails or misusing the account.</p><p>Simple, right?</p><p>You can use the same approach for a university portal, business application, personal website, or any other system.</p><p>Start by identifying what you’re protecting, what could cause harm, which weaknesses exist, and what the consequences might be.</p><h3>Final Thoughts</h3><p>So, that’s how threats, vulnerabilities, and risks are connected.</p><p>A threat describes a potential source or event of harm. A vulnerability is a weakness that could be exploited. Risk helps us understand the possibility and consequences of something going wrong.</p><p>The BrightCart example shows why these terms shouldn’t be used interchangeably.</p><p>When we identify a security problem, we need to understand more than just the weakness. We also need to consider the possible threat, business impact, and controls already in place.</p><p>That’s where cybersecurity risk analysis begins.</p><p>In the next article, we’ll take this example one step further and explore <strong>how to start a cybersecurity risk assessment</strong>.</p><p>Until then, keep learning and exploring cybersecurity!</p><h3>Cybersecurity Risk Register &amp; Dashboard</h3><p>If you’re learning cybersecurity risk analysis and want a structured way to practice recording risks, I’ve also created a <a href="https://hexahunter.gumroad.com/l/cybersecurity-risk-register-dashboard?wanted=true"><em>Cybersecurity Risk Register &amp; Dashboard</em>.</a></p><p>It provides a place to document identified risks, assess likelihood and impact, assign risk owners, and track response actions.</p><h3>References</h3><ul><li><a href="https://www.cisa.gov/sites/default/files/2023-01/fact-sheet-implementing-phishing-resistant-mfa-508c.pdf"><strong><em>NIST SP 800–30 Rev. 1</em></strong></a> — <em>Guide for Conducting Risk Assessments</em></li><li><a href="https://csrc.nist.gov/glossary/term/vulnerability"><strong><em>NIST Computer Security Resource Center</em></strong> </a>— <em>Vulnerability and Likelihood Definitions</em></li><li><a href="https://www.cisa.gov/sites/default/files/2023-01/fact-sheet-implementing-phishing-resistant-mfa-508c.pdf"><strong><em>CISA</em></strong> </a>— <em>Implementing Phishing-Resistant Multifactor Authentication</em></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=46102ba0c896" width="1" height="1" alt=""><hr><p><a href="https://systemweakness.com/threat-vulnerability-and-risk-understanding-the-difference-with-a-real-world-example-46102ba0c896">Threat, Vulnerability, and Risk: Understanding the Difference with a Real-World Example</a> was originally published in <a href="https://systemweakness.com">System Weakness</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The $25 Million Video Call That Wasn’t Real]]></title>
            <link>https://systemweakness.com/the-25-million-video-call-that-wasnt-real-f5555ca1799b?source=rss----f20a9840e177---4</link>
            <guid isPermaLink="false">https://medium.com/p/f5555ca1799b</guid>
            <category><![CDATA[cyber-risk-management]]></category>
            <category><![CDATA[fraud-prevention]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[small-business]]></category>
            <category><![CDATA[cybersecurity]]></category>
            <dc:creator><![CDATA[Momal Naz]]></dc:creator>
            <pubDate>Wed, 04 Nov 2026 02:50:23 GMT</pubDate>
            <atom:updated>2026-11-04T02:50:21.908Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*v9yLLaTdrUQVTHXMQdHM_A.jpeg" /></figure><h3>What a finance worker in Hong Kong can teach every small business owner about the scam nobody’s checklist covers yet</h3><p>In February 2024, a finance employee at the engineering firm <strong>Arup </strong>got a message that looked like it came from the company’s UK-based CFO. It asked for a confidential transaction. Understandably cautious, the employee hesitated — until they were invited onto a video call.</p><p>On that call: the CFO. And several other colleagues they recognized. Talking, moving, sounding exactly like themselves.</p><p>Every person on that call was a deepfake. The employee ended up authorizing 15 transfers totaling $25.6 million before anyone realized what had happened.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*UyrSyUnNH58Kqayi8iWbSQ.jpeg" /></figure><p>I think about this case a lot, because it’s usually told as a story about a giant multinational firm getting outsmarted by cutting-edge AI. What gets lost is the more uncomfortable version of the story: the attack didn’t work because Arup lacked resources. It worked because it exploited something every business has, regardless of size — a human being trained to trust what looks and sounds like their boss.</p><p>And if it worked on a company with an actual security team, it’s not exactly reassuring for the rest of us running things without one.</p><h3>This isn’t a “big company” problem anymore</h3><p>Here’s what’s changed in the last two years: making a convincing fake voice or video used to require real technical skill. Now it doesn’t. The tools got good, and they got easy, and they got everywhere.</p><p>The numbers reflect that shift. Deepfake-related fraud attempts have risen more than 2,000% over the past three years, according to identity verification firm Sumsub — going from a rounding error to roughly 1 in 15 fraud attempts overall. Separately, Pindrop’s analysis of contact center calls found deepfake fraud attempts jumped over 1,300% in a single year, moving from about one incident a month to roughly seven a day.</p><p>Most striking to me: research from Keepnet found that 80% of companies have no plan at all for what to do if a deepfake attack happens to them. Not a weak plan. No plan.</p><p>That gap isn’t because business owners don’t care about security. It’s because almost every piece of security advice out there was written for a different threat. Ransomware. Weak passwords. Suspicious attachments. All still real, all still worth defending against — but none of it prepares anyone for a scammer who sounds exactly like their business partner asking them to move money today.</p><h3>Why small businesses are actually more exposed, not less</h3><p>There’s a reason this keeps happening to smaller operations even though the Arup case made headlines: scale works against the small business owner here, not for them.</p><p>A large company might have a dedicated finance team, a formal sign-off chain, and a policy that no wire transfer above a certain amount happens without three people involved. A small e-commerce brand, an agency, a boutique studio — usually has the owner. Maybe one other person. Decisions get made fast, because they have to.</p><p>Fast decision-making is exactly what this kind of fraud is built to exploit. The urgency, the “don’t loop anyone else in,” the sense that hesitating might damage a relationship or lose a deal — all of it hits harder when there’s no second or third person in the loop to say “wait.”</p><p>You don’t need to be targeted by a nation-state to lose money this way. You just need one moment where something felt slightly off, and you moved forward anyway because you were busy and it sounded exactly like the person you trust.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*DbLF2mpwIJsfxEFm_KhiCw.jpeg" /></figure><h3>The fix isn’t more technology. It’s one habit.</h3><p>Every source I read while researching this pushed some kind of detection software, AI to catch the AI. Useful, eventually, for companies with the budget and the team to run it. Not the actual answer for a small business trying to close this gap this week.</p><p>The actual answer is boring, and that’s exactly why it works: <strong>never approve a financial request based on a single channel of communication.</strong></p><p>If a request to move money, change a payment detail, or share access arrives by video, voice note, email, or chat, verify it through a <em>second, independent channel</em> before acting. Call the person back on a number you already had saved, not one included in the message. If it’s urgent, that’s a reason to verify faster, not skip verification entirely.</p><p>This single habit — sometimes called a callback rule, would have stopped the Arup fraud, the wave of CEO-voice scams currently hitting small businesses (researchers estimate roughly 400 attempts a day target companies with this exact method), and most of the deepfake-driven fraud making headlines this year. It costs nothing. It takes one conversation with your team to put in place. And almost nobody has it written down anywhere.</p><h3>What I’d actually do this week if I were you</h3><p>You don’t need to become a security expert. You need three things in place, in this order:</p><ol><li><strong>Write the rule down.</strong> One sentence: “No payment, wire, or account change is approved without a callback to a known number.” Put it somewhere your team will actually see it.</li><li><strong>Say it out loud to whoever touches money.</strong> Not as a memo nobody reads a real conversation. Make sure everyone knows they’re allowed to pause a request that feels off, even if it claims to be from you.</li><li><strong>Decide what “verify” means in advance.</strong> Who do they call? What number? What happens if that person’s unreachable? Five minutes of planning now saves a very bad hour later.</li></ol><p>That’s genuinely most of it. The rest phishing habits, backup hygiene, access reviews matters too, but none of it addresses the specific thing that’s now targeting small businesses hundreds of times a day.</p><h3>How Would We Record This in a Cybersecurity Risk Register?</h3><p>Now let’s look at this incident from a risk management perspective.</p><p>We’ve discussed how a convincing video call can be used to trick someone into approving a payment. But what if we want to make sure our business doesn’t overlook this kind of threat?</p><p>This is where a cybersecurity risk register becomes useful.</p><p>A risk register is a place where we document identified risks, assess their possible impact, assign responsibility, and keep track of the actions we’re taking to manage them.</p><p>For example, imagine a small online business where one employee can approve payments after receiving instructions from the owner.</p><p>What if a scammer impersonates that owner using an AI-generated voice or video?</p><p>Let’s break this down.</p><p><strong>Asset:</strong> The company’s funds and payment approval process.</p><p><strong>Threat:</strong> A fraudster impersonating a trusted business executive.</p><p><strong>Vulnerability:</strong> Payment requests can be approved without independent identity verification.</p><p><strong>Risk:</strong> An employee could approve a fraudulent transaction after receiving convincing instructions from someone pretending to be the business owner.</p><p><strong>Potential impact:</strong> Financial loss and disruption to business operations.</p><p><strong>Security controls:</strong> Independent callback verification, approval limits, and additional authorization for high-value payments.</p><p>Now we have something more useful than simply saying, “Deepfakes are dangerous.”</p><p>We’ve identified a specific risk, understood what could make it possible, and listed controls that could help reduce it.</p><p>The next step would be to assess the likelihood and impact, assign someone to manage the risk, and review whether the controls are actually working.</p><p>That’s the purpose of documenting risks instead of leaving them as general security concerns.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*PkjKg7Sypr23uqV0o9HL3g.png" /></figure><p><em>Example: A fictional deepfake payment fraud scenario recorded in a cybersecurity risk register. Scores and control decisions are illustrative.</em></p><h3>Want to Try This Yourself?</h3><p>If you’re learning cybersecurity risk assessment or want a structured way to document business security risks, my <strong>Cybersecurity Risk Register &amp; Dashboard</strong> provides an editable Excel and Google Sheets template.</p><p>You can record identified risks, assess likelihood and impact, document existing controls, assign risk owners, and track treatment actions through the dashboard.</p><p>It also includes fictional worked examples to help you understand how the process works.</p><p><a href="https://hexahunter.gumroad.com/l/cybersecurity-risk-register-dashboard?wanted=true"><strong>View the Cybersecurity Risk Register &amp; Dashboard</strong></a></p><p>And remember, you don’t need a complicated system to begin. Start by identifying one important business process, what could go wrong, and how you would reduce that risk.</p><p><em>If this was useful, I write about practical, no-jargon security for people who don’t have a security team, follow for more. (●&#39;◡&#39;●)</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f5555ca1799b" width="1" height="1" alt=""><hr><p><a href="https://systemweakness.com/the-25-million-video-call-that-wasnt-real-f5555ca1799b">The $25 Million Video Call That Wasn’t Real</a> was originally published in <a href="https://systemweakness.com">System Weakness</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Wireshark: Traffic Analysis| TryHackMe — Walkthrough — Part 2]]></title>
            <link>https://systemweakness.com/wireshark-traffic-analysis-tryhackme-walkthrough-part-2-31910e371273?source=rss----f20a9840e177---4</link>
            <guid isPermaLink="false">https://medium.com/p/31910e371273</guid>
            <category><![CDATA[networking]]></category>
            <category><![CDATA[tryhackme-walkthrough]]></category>
            <category><![CDATA[cybersecurity]]></category>
            <category><![CDATA[wireshark]]></category>
            <dc:creator><![CDATA[Momal Naz]]></dc:creator>
            <pubDate>Wed, 04 Nov 2026 02:50:04 GMT</pubDate>
            <atom:updated>2026-11-04T02:50:02.950Z</atom:updated>
            <content:encoded><![CDATA[<h3>Wireshark:Traffic Analysis| TryHackMe — Walkthrough Part 2</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/796/1*gwur7-QCtyZCLo8SeSbBHQ.png" /></figure><p>In this room, we will learn the basics of traffic analysis with Wireshark and how to find anomalies on your network!</p><p>Link: <a href="https://tryhackme.com/room/wiresharktrafficanalysis">https://tryhackme.com/room/wiresharktrafficanalysis</a></p><p>This is the 2nd part in a 2 part series on this room due to its length. To view the first part <a href="https://hexahunter.medium.com/wireshark-traffic-analysis-tryhackme-walkthrough-part-1-41fac39d8ad3">click here!</a></p><p>Let’s finish it!</p><h3>Task 6: Cleartext Protocol Analysis: FTP</h3><p>Investigating cleartext protocol traces sounds easy, but when the time comes to investigate a big network trace for incident analysis and response, the game changes. Proper analysis is more than following the stream and reading the cleartext data. For a security analyst, it is important to create statistics and key results from the investigation process. As mentioned earlier at the beginning of the Wireshark room series, the analyst should have the required network knowledge and tool skills to accomplish this. Let’s simulate a cleartext protocol investigation with Wireshark!</p><h3>FTP Analysis</h3><p>File Transfer Protocol (FTP) is designed to transfer files with ease, so it focuses on simplicity rather than security. As a result of this, using this protocol in unsecured environments could create security issues like:</p><ul><li>MITM attacks</li><li>Credential stealing and unauthorised access</li><li>Phishing</li><li>Malware planting</li><li>Data exfiltration</li></ul><p><strong>FTP analysis in a nutshell:</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*7kYSvwwP6lHflboV.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*mqcrHpuk0XEbCWjH.png" /></figure><p>Detecting suspicious activities in chunked files is easy and a great way to learn how to focus on the details. <strong>Now use the exercise files to put your skills into practice against a single capture file and answer the questions below!</strong></p><p><strong><em>Answer the questions below:</em></strong></p><p><strong>Use the “Desktop/exercise-pcaps/ftp/ftp.pcap” file.<br></strong>6.1 How many incorrect login attempts are there?</p><p>This one was a quick win, we know the codes from the task and we know the syntax from all three wireshark rooms we’ve been doing:</p><p>Press enter or click to view image in full size</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*moPKWO58nEg3jl59.png" /></figure><pre>ftp.response.code in {430 530}</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*6Z9i7Qdmjbm3gVYf.png" /></figure><blockquote><strong>Answer: </strong>737</blockquote><p>6.2 What is the size of the file accessed by the “ftp” account?</p><p>Per the task text, we can check file status with code 213:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*a_DG1gOv6S5Qf4HO.png" /></figure><p>Let’s do it:</p><pre>ftp.response.code == 213</pre><p>You’ll get 2 packets that respond to this filter, if you Right Click and follow the TCP Streams for either of those packets, you will find your answer:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*zSwlTcWUPNaIQuI4.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*Mdy1Gzeo-hPFUaM5.png" /></figure><blockquote><strong>Answer: </strong>39424</blockquote><p>6.3 The adversary uploaded a document to the FTP server. What is the filename?</p><p>We know this from the previous question, if you followed the stream:</p><blockquote><strong>Answer:</strong> resume.doc</blockquote><p>6.4 The adversary tried to assign special flags to change the executing permissions of the uploaded file. What is the command used by the adversary?</p><p>We also know the answer to this one, located in the stream data, scroll down near the end:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/695/0*gEiF4VfdZi3rLyJd.png" /></figure><blockquote><strong>Answer: </strong>chmod 777</blockquote><h3>Task 7: Cleartext Protocol Analysis: HTTP</h3><p>Hypertext Transfer Protocol (HTTP) is a cleartext-based, request-response and client-server protocol. It is the standard type of network activity to request/serve web pages, and by default, it is not blocked by any network perimeter. As a result of being unencrypted and the backbone of web traffic, HTTP is one of the must-to-know protocols in traffic analysis. Following attacks could be detected with the help of HTTP analysis:</p><ul><li>Phishing pages</li><li>Web attacks</li><li>Data exfiltration</li><li>Command and control traffic (C2)</li></ul><h3>HTTP analysis in a nutshell:</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*0O5AeUJRawb0eIoO.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*i_6yw5mw-YW7-y_1.png" /></figure><h3>User Agent Analysis</h3><p>As the adversaries use sophisticated technics to accomplish attacks, they try to leave traces similar to natural traffic through the known and trusted protocols. For a security analyst, it is important to spot the anomaly signs on the bits and pieces of the packets. The “user-agent” field is one of the great resources for spotting anomalies in HTTP traffic. In some cases, adversaries successfully modify the user-agent data, which could look super natural. A security analyst cannot rely only on the user-agent field to spot an anomaly. Never whitelist a user agent, even if it looks natural. User agent-based anomaly/threat detection/hunting is an additional data source to check and is useful when there is an obvious anomaly. If you are unsure about a value, you can conduct a web search to validate your findings with the default and normal user-agent info (<a href="https://developers.whatismybrowser.com/useragents/explore/"><strong>example site</strong></a>).</p><p><strong>User Agent analysis in a nutshell:</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*F6NB46OJtf6zvFj4.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*w2vV7KX5nklAvfOR.png" /></figure><h3>Log4j Analysis</h3><p>A proper investigation starts with prior research on threats and anomalies going to be hunted. Let’s review the knowns on the “Log4j” attack before launching Wireshark.</p><p><strong>Log4j vulnerability analysis in a nutshell:</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*3KBMAqGq3zZsDaAj.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*k42ykpj37bR-tdPY.png" /></figure><p>Detecting suspicious activities in chunked files is easy and a great way to learn how to focus on the details. <strong>Now use the exercise files to put your skills into practice against a single capture file and answer the questions below!</strong></p><p><strong><em>Answer the questions below:</em></strong></p><p><strong>Use the “Desktop/exercise-pcaps/http/user-agent.cap” file.</strong></p><p>7.1 Investigate the user agents. What is the number of anomalous “user-agent” types?</p><p>To get this I first filtered by:</p><pre>http.user_agent</pre><p>This didn’t do much for me, it narrows the count down by 1… k. Next I expanded the HTTP tree of a packet, right click the “User-Agent” field and applied it as a column, then sorted by that column. This allowed me to easily count up the different types of user agents:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*2aef3wnsYvnB6Mvu.png" /></figure><blockquote><strong>Answer:</strong> 6</blockquote><p>7.2 What is the packet number with a subtle spelling difference in the user agent field?</p><p>I couldn’t find a way to do this super cleanly where you just input a single filter and you get a single result with the identifying packet number, but for this task, it’s very easy to figure out if you have applied the User-Agent as a column as directed in the previous questions:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*1jPANAon1xd5KsPt.png" /></figure><blockquote><strong>Answer: </strong>52</blockquote><p><strong>Use the “Desktop/exercise-pcaps/http/http.pcapng” file.<br></strong>7.3 Locate the “Log4j” attack starting phase. What is the packet number?</p><p>This one would be hard had they not given us the filter query:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*HornKWRE-wRcPjGM.png" /></figure><p>I put it all into one filter:</p><pre>http.request.method==&quot;POST&quot; and ((ip contains &quot;jndi&quot;) or (ip contains <br>&quot;Exploit&quot;)) and ((frame contains &quot;jndi&quot;) or (frame contains &quot;Exploit&quot;)) and <br>((http.user_agent contains &quot;$&quot;) or (http.user_agent contains &quot;==&quot;))</pre><p>We get just 1 result:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*J6U72Krv2Pl-naRi.png" /></figure><blockquote><strong>Answer: </strong>444</blockquote><p>7.4 Locate the “Log4j” attack starting phase and decode the base64 command. What is the IP address contacted by the adversary? (Enter the address in defanged format and exclude “{}”.)</p><p>On that same packet, expand HTTP and the Base64 code is in the user-agent field, it’s everything after the “Base64/” and before the closing curly bracket:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*5l91r_YtalsmOg7Y.png" /></figure><p>Let’s copy this and decode it in <a href="https://gchq.github.io/CyberChef/#recipe=From_Base64(&#39;A-Za-z0-9%2B/%3D&#39;,true,false)">CyberChef</a>:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*PI-AvHMabOTux18J.png" /></figure><p>Very interesting, so we can see that this Base64 code is using “wget” to download, set permissions and run a script. Once you’ve got the IP address, change your recipe from “Decode Base64” to “<a href="https://gchq.github.io/CyberChef/#recipe=Defang_IP_Addresses()">Defang IP</a>”:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*G4LTKGMf-HTGU2DH.png" /></figure><blockquote><strong>Answer: </strong>62[.]210[.]130[.]250</blockquote><h3>Task 8: Encrypted Protocol Analysis: Decrypting HTTPS</h3><p>When investigating web traffic, analysts often run across encrypted traffic. This is caused by using the Hypertext Transfer Protocol Secure (HTTPS) protocol for enhanced security against spoofing, sniffing and intercepting attacks. HTTPS uses TLS protocol to encrypt communications, so it is impossible to decrypt the traffic and view the transferred data without having the encryption/decryption key pairs. As this protocol provides a good level of security for transmitting sensitive data, attackers and malicious websites also use HTTPS. Therefore, a security analyst should know how to use key files to decrypt encrypted traffic and investigate the traffic activity.</p><p>The packets will appear in different colours as the HTTP traffic is encrypted. Also, protocol and info details (actual URL address and data returned from the server) will not be fully visible. The first image below shows the HTTP packets encrypted with the TLS protocol. The second and third images demonstrate filtering HTTP packets without using a key log file.</p><p><strong>Additional information for HTTPS :</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*igOgNsTAaPTizREi.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*Aj8QHZtjAareQniA.png" /></figure><p>Similar to the TCP three-way handshake process, the TLS protocol has its handshake process. The first two steps contain “Client Hello” and “Server Hello” messages. The given filters show the initial hello packets in a capture file. These filters are helpful to spot which IP addresses are involved in the TLS handshake.</p><ul><li>Client Hello: (http.request or tls.handshake.type == 1) and !(ssdp)</li><li>Server Hello: (http.request or tls.handshake.type == 2) and !(ssdp)</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*FA_-mNKLb_s8zKe9.png" /></figure><p>An encryption key log file is a text file that contains unique key pairs to decrypt the encrypted traffic session. These key pairs are automatically created (per session) when a connection is established with an SSL/TLS-enabled webpage. As these processes are all accomplished in the browser, you need to configure your system and use a suitable browser (Chrome and Firefox support this) to save these values as a key log file. To do this, you will need to set up an environment variable and create the SSLKEYLOGFILE, and the browser will dump the keys to this file as you browse the web. SSL/TLS key pairs are created per session at the connection time, so it is important to dump the keys during the traffic capture. Otherwise, it is not possible to create/generate a suitable key log file to decrypt captured traffic. You can use the “right-click” menu or <strong>“Edit → Preferences → Protocols → TLS”</strong> menu to add/remove key log files.</p><p><strong>Adding key log files with the “right-click” menu:</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*yAiRA_56v5tCstHp.png" /></figure><p><strong>Adding key log files with the “Edit → Preferences → Protocols → TLS” menu:</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*ay3aOkizmezY55CM.png" /></figure><p><strong>Viewing the traffic with/without the key log files:</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*iOMoOkUCNry5ATlI.png" /></figure><p>The above image shows that the traffic details are visible after using the key log file. Note that the packet details and bytes pane provides the data in different formats for investigation. Decompressed header info and HTTP2 packet details are available after decrypting the traffic. Depending on the packet details, you can also have the following data formats:</p><ul><li>Frame</li><li>Decrypted TLS</li><li>Decompressed Header</li><li>Reassembled TCP</li><li>Reassembled SSL</li></ul><p>Detecting suspicious activities in chunked files is easy and a great way to learn how to focus on the details. <strong>Now use the exercise files to put your skills into practice against a single capture file and answer the questions below!</strong></p><p><strong><em>Answer the questions below:</em></strong></p><p><strong>Use the “Desktop/exercise-pcaps/https/Exercise.pcap” file.</strong></p><p>8.1 What is the frame number of the “Client Hello” message sent to “accounts.google.com”?</p><p>We know part of this from the task text, the other part I looked up, there may be a different solution for this. If you know of one, let me know!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*N73BpTt6qPn-wKXA.png" /></figure><pre>tls.handshake.type==1 and tls.handshake.extensions_server_name contains <br>&quot;accounts.google.com&quot;</pre><p>We only get one result:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*bVTExRTFDHquKi_M.png" /></figure><blockquote><strong>Answer: </strong>16</blockquote><p>8.2 Decrypt the traffic with the “KeysLogFile.txt” file. What is the number of HTTP2 packets?</p><p>Per the task text, we need to apply an encryption key log file to view encrypted data. We can do that by going to Edit &gt; Preferences &gt; Protocols &gt; TLS &gt; “(Pre)-Master-Secret log filename”:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/543/0*HVphyts67iBZAZn3.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/178/0*nquF_lnycfhK7Uw4.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*Onj5Za3QQUP1VT8A.png" /></figure><p>Now if you filter by “HTTP2” you’ll see the data:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*CnI_ISrxxZTMulfs.png" /></figure><p>In theory the number using this filter would be accurate but it’s not? Not sure why. However it’s easy enough to subtract the few that should not be counted, just filter by Protocol and there are 3 TLSv1.3 entries to subtract:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*t5Qu9cb_ae7RYiDj.png" /></figure><blockquote><strong>Answer: </strong>115</blockquote><p>8.3 Go to Frame 322. What is the authority header of the HTTP2 packet? (Enter the address in defanged format.)</p><p>Easy enough, find the packet, Expand the HTTP2 &gt; Stream: Headers &gt; Header: authority tree, answer is there:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*mBA1a91UQit8Xz4O.png" /></figure><p>Now go to <a href="https://gchq.github.io/CyberChef/#recipe=Defang_URL(true,true,true,&#39;Valid%20domains%20and%20full%20URLs&#39;)">CyberChef </a>with the Defang URL recipe loaded:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*CUa1vkBfbny9-l3Z.png" /></figure><blockquote><strong>Answer: </strong>safebrowsing[.]googleapis[.]com</blockquote><p>8.4 Investigate the decrypted packets and find the flag! What is the flag?</p><p>This is very similar to what we did in a previous room so we already know how to do this (the answer is very similar as well!):</p><p>Go to File &gt; Export Objects &gt; HTTP &gt; Select the text file (packet 1644) and export it to your desktop:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*hpFIlsSPfYwkjAHt.png" /></figure><p>Read the file:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*3NfuW0T-kFiiIn_2.png" /></figure><blockquote><strong>Answer: </strong>FLAG{THM-PACKETMASTER}</blockquote><h3>Task 9: Bonus: Hunt Cleartext Credentials!</h3><p>Up to here, we discussed how to inspect the packets for specific conditions and spot anomalies. As mentioned in the first room, Wireshark is not an IDS, but it provides suggestions for some cases under the expert info. However, sometimes anomalies replicate the legitimate traffic, so the detection becomes harder. For example, in a cleartext credential hunting case, it is not easy to spot the multiple credential inputs and decide if there is a brute-force attack or if it is a standard user who mistyped their credentials.</p><p>As everything is presented at the packet level, it is hard to spot the multiple username/password entries at first glance. The detection time will decrease when an analyst can view the credential entries as a list. Wireshark has such a feature to help analysts who want to hunt cleartext credential entries.</p><p>Some Wireshark dissectors (FTP, HTTP, IMAP, pop and SMTP) are programmed to extract cleartext passwords from the capture file. You can view detected credentials using the <strong>“Tools → Credentials”</strong> menu. This feature works only after specific versions of Wireshark (v3.1 and later). Since the feature works only with particular protocols, it is suggested to have manual checks and not entirely rely on this feature to decide if there is a cleartext credential in the traffic.</p><p>Once you use the feature, it will open a new window and provide detected credentials. It will show the packet number, protocol, username and additional information. This window is clickable; clicking on the packet number will select the packet containing the password, and clicking on the username will select the packet containing the username info. The additional part prompts the packet number that contains the username.</p><p>Press enter or click to view image in full size</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*D7eOXL9h5hOg0CNl.png" /></figure><p><strong><em>Answer the questions below:</em></strong></p><p><strong>Use the “Desktop/exercise-pcaps/bonus/Bonus-exercise.pcap” file.</strong></p><p>9.1 What is the packet number of the credentials using “HTTP Basic Auth”?</p><p>This one was pretty easy as there aren’t many HTTP packets and it’s described in the task:</p><p>Per the task, you can just go to Tools &gt; Credentials</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*w8Yc23GU_Wh5aVpA.png" /></figure><p>You can also just filter:</p><pre>http</pre><p>The answer was the first packet:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*uoMCIaAviTQ7Z8ej.png" /></figure><blockquote><strong>Answer: </strong>237</blockquote><p><em>9.2 What is the packet number where “empty password” was submitted?</em></p><p>Ok, not sure how we were supposed to get there but I reverse engineered the thing to get my answer. From the credentials window that we had open for the previous question, we can deduce that the protocol is going to be FTP, since there is only one HTTP packet with auth and we know it has a password, this gives us our first filter:</p><pre>ftp</pre><p>Simple right? Ok now we can manually click on the packets to find out what it is that we’re looking for in the fields. We come upon our answer here:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/453/0*FcidE9LCbe6TfjoF.png" /></figure><p>You’ll quickly find that those packets that do have a password have this “Request arg” field and the one that does not have a password does not have this field at all:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/389/0*YL270pLOQ5JmpoAe.png" /></figure><p>The filter for this field is:</p><pre>ftp.request.arg</pre><p>But we also need to filter by getting a request for a password and this filter is:</p><pre>ftp.request.command</pre><p>So putting this all together, we’re going to throw a “NOT” qualifier in front of the request.arg field since we want packets that don’t have this option:</p><pre>ftp and !ftp.request.arg and ftp.request.comman</pre><p>We get exactly one packet:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*mojdqgu1QKkKaZqQ.png" /></figure><blockquote><strong>Answer: </strong>170</blockquote><h3>Task 10: Bonus: Actionable Results!</h3><h3>Bonus: Actionable Results!</h3><p>You have investigated the traffic, detected anomalies and created notes for further investigation. What is next? Not every case investigation is carried out by a crowd team. As a security analyst, there will be some cases you need to spot the anomaly, identify the source and take action. Wireshark is not all about packet details; it can help you to create firewall rules ready to implement with a couple of clicks. You can create firewall rules by using the <strong>“Tools → Firewall ACL Rules”</strong> menu. Once you use this feature, it will open a new window and provide a combination of rules (IP, port and MAC address-based) for different purposes. Note that these rules are generated for implementation on an outside firewall interface.</p><p>Currently, Wireshark can create rules for:</p><ul><li>Netfilter (iptables)</li><li>Cisco IOS (standard/extended)</li><li>IP Filter (ipfilter)</li><li>IPFirewall (ipfw)</li><li>Packet filter (pf)</li><li>Windows Firewall (netsh new/old format)</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*K6aZmmjTBGQTdezM.png" /></figure><p>Answer the questions below</p><p><strong>Use the “Desktop/exercise-pcaps/bonus/Bonus-exercise.pcap” file.</strong></p><p>10.1 Select packet number 99. Create a rule for “IPFirewall (ipfw)”. What is the rule for “denying source IPv4 address”?</p><p>This one is pretty simple, go to Tools &gt; Firewall ACL Rules &gt; IPFirewall (ipfw):</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*KKqZtasxV9aIUTTN.png" /></figure><blockquote><strong>Answer: </strong>add deny ip from 10.121.70.151 to any in</blockquote><p>10.2 Select packet number 231. Create “IPFirewall” rules. What is the rule for “allowing destination MAC address”?</p><p>This one is almost as easy, just gotta switch a deny to an allow:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*YuXl_pAUC-OVnDnY.png" /></figure><blockquote><strong>Answer: </strong>add allow MAC 00:d0:59:aa:af:80 any in</blockquote><h3>Task 11: Conclusion</h3><p><strong>Congratulations! </strong>You just finished the “Wireshark: The Traffic Analysis” room.</p><p>In this room, we covered how to use the Wireshark to detect anomalies and investigate events of interest at the packet level. Now, we invite you to complete the Wireshark challenge room: <a href="https://tryhackme.com/room/c2carnage"><strong>Carnage</strong></a>, <strong>Warzone 1</strong> and <strong>Warzone 2</strong>.</p><p>Wireshark is a good tool for starting a network security investigation. However, it is not enough to stop the threats. A security analyst should have IDS/IPS knowledge and extended tool skills to detect and prevent anomalies and threats. As the attacks are getting more sophisticated consistently, the use of multiple tools and detection strategies becomes a requirement. The following rooms will help you step forward in network traffic analysis and anomaly/threat detection.</p><ul><li><a href="https://tryhackme.com/room/networkminer"><strong>NetworkMiner</strong></a></li><li><a href="https://tryhackme.com/room/snort"><strong>Snort</strong></a></li><li><a href="https://tryhackme.com/room/snortchallenges1"><strong>Snort Challenge — The Basics</strong></a></li><li><a href="https://tryhackme.com/room/snortchallenges2"><strong>Snort Challenge — Live Attacks</strong></a></li><li><a href="https://tryhackme.com/room/zeekbro"><strong>Zeek</strong></a></li><li><a href="https://tryhackme.com/room/zeekbroexercises"><strong>Zeek Exercises</strong></a></li><li><a href="https://tryhackme.com/room/brim"><strong>Brim</strong></a></li></ul><p>This concludes the Network Security and Traffic Analysis module, the third of seven modules in this SOC Level 1 Path and it also ends the Wireshark: Traffic Analysis room on TryHackMe. This was a loooooooooooong room and man was it action packed. I learned a ton and I hope that you did too. After learning everything we did over these past three rooms about Wireshark I think it may have edged out Zeek for me, not sure, but both are incredible tools to know and have their own strengths and weaknesses.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=31910e371273" width="1" height="1" alt=""><hr><p><a href="https://systemweakness.com/wireshark-traffic-analysis-tryhackme-walkthrough-part-2-31910e371273">Wireshark: Traffic Analysis| TryHackMe — Walkthrough — Part 2</a> was originally published in <a href="https://systemweakness.com">System Weakness</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Securing and Governing Google Cloud]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://systemweakness.com/securing-and-governing-google-cloud-7eda97eb465e?source=rss----f20a9840e177---4"><img src="https://cdn-images-1.medium.com/max/1536/1*pQ27S9KHMhjXUfsFGFMEkQ.png" width="1536"></a></p><p class="medium-feed-snippet">Build a Foundation You Can Validate</p><p class="medium-feed-link"><a href="https://systemweakness.com/securing-and-governing-google-cloud-7eda97eb465e?source=rss----f20a9840e177---4">Continue reading on System Weakness »</a></p></div>]]></description>
            <link>https://systemweakness.com/securing-and-governing-google-cloud-7eda97eb465e?source=rss----f20a9840e177---4</link>
            <guid isPermaLink="false">https://medium.com/p/7eda97eb465e</guid>
            <category><![CDATA[cyber-security-awareness]]></category>
            <category><![CDATA[cybersecurity]]></category>
            <category><![CDATA[google-cloud-platform]]></category>
            <category><![CDATA[information-technology]]></category>
            <category><![CDATA[google]]></category>
            <dc:creator><![CDATA[Practical IT]]></dc:creator>
            <pubDate>Tue, 03 Nov 2026 19:46:01 GMT</pubDate>
            <atom:updated>2026-11-03T19:46:01.441Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[How to Code Python PoCs to Exploit Web Vulnerabilities (2026 Guide)]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://systemweakness.com/how-to-code-python-pocs-to-exploit-web-vulnerabilities-2026-guide-2339ff9b00c6?source=rss----f20a9840e177---4"><img src="https://cdn-images-1.medium.com/max/1536/1*aNq7WdCeBYpfsdtDHpqMRg.png" width="1536"></a></p><p class="medium-feed-snippet">A complete beginner-friendly guide, to understanding web vulnerabilities and how to exploit them using Python.</p><p class="medium-feed-link"><a href="https://systemweakness.com/how-to-code-python-pocs-to-exploit-web-vulnerabilities-2026-guide-2339ff9b00c6?source=rss----f20a9840e177---4">Continue reading on System Weakness »</a></p></div>]]></description>
            <link>https://systemweakness.com/how-to-code-python-pocs-to-exploit-web-vulnerabilities-2026-guide-2339ff9b00c6?source=rss----f20a9840e177---4</link>
            <guid isPermaLink="false">https://medium.com/p/2339ff9b00c6</guid>
            <category><![CDATA[pentesting]]></category>
            <category><![CDATA[hacking]]></category>
            <category><![CDATA[bug-bounty]]></category>
            <category><![CDATA[cybersecurity]]></category>
            <category><![CDATA[python]]></category>
            <dc:creator><![CDATA[Tommaso Bona]]></dc:creator>
            <pubDate>Mon, 02 Nov 2026 18:46:01 GMT</pubDate>
            <atom:updated>2026-11-02T18:46:01.729Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Stop Trusting System Prompts: A Deep Technical Analysis of NVIDIA OpenShell for AI Agent Security]]></title>
            <link>https://systemweakness.com/stop-trusting-system-prompts-a-deep-technical-analysis-of-nvidia-openshell-for-ai-agent-security-0154e1908986?source=rss----f20a9840e177---4</link>
            <guid isPermaLink="false">https://medium.com/p/0154e1908986</guid>
            <category><![CDATA[cybersecurity]]></category>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[nvidia]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[information-security]]></category>
            <dc:creator><![CDATA[MrĐức · AI & OT Security]]></dc:creator>
            <pubDate>Sun, 01 Nov 2026 19:46:01 GMT</pubDate>
            <atom:updated>2026-11-02T03:20:04.820Z</atom:updated>
            <content:encoded><![CDATA[<p>If you have been building or deploying autonomous AI agents lately, you have probably experienced that familiar sting of architectural anxiety.</p><p>The moment you hand an agent the ability to run shell commands, query SQL databases, interface with cloud APIs, or execute dynamic Python code, a harsh reality sets in: <strong>we are granting root-level capabilities to a non-deterministic black box.</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*wHuuAEfcYC9g9TawIV5-Cg.png" /></figure><p>For the past couple of years, the collective response from much of the AI ecosystem has been dangerously naive:</p><ul><li><em>“We’ll just instruct the model in the system prompt not to touch sensitive files.”</em></li><li><em>“We put a lightweight LLM guardrail in front of the input pipeline.”</em></li><li><em>“We told the agent to ask for human approval before doing anything dangerous.”</em></li></ul><p>As anyone who has spent ten minutes testing indirect prompt injections knows, relying on an LLM to enforce its own safety rules is like putting a “Do Not Steal” sticker on an unattended vault and calling it enterprise security. Prompts exist inside the model’s context window. Context windows can be manipulated, confused, overflowed, and jailbroken.</p><p>That is precisely why <strong>NVIDIA OpenShell</strong> represents such a massive architectural shift. Instead of trying to coax the LLM into behaving properly, OpenShell steps back and adopts a strict engineering posture: <strong>The agent workload is entirely untrusted, and we will enforce security boundaries at the Linux kernel and network proxy layers.</strong></p><p>Let’s pop the hood on OpenShell, analyze its underlying technical mechanisms, walk through real-world attack vectors, and examine how you can operationally deploy these zero-trust boundaries in high-stakes environments.</p><h3>1. The Architectural Flaw of Application-Level AI Guardrails</h3><p>To understand why OpenShell is necessary, we first need to dissect why conventional application-layer defenses fail when applied to autonomous agents.</p><pre>Traditional Guardrail Architecture (Fragile):<br>[ User / External Input ] ---&gt; [ LLM Guardrail / System Prompt ] ---&gt; [ Agent LLM ] ---&gt; [ Full Host Access ]<br>                                 (Bypassed via Injection)                                (System Compromised)</pre><p>In traditional web applications, input validation is deterministic. If a string contains invalid SQL characters, a parameterized query neutralizes the attack before it touches the database engine.</p><p>With AI agents, the boundary between <strong>data</strong> and <strong>code</strong> is completely blurred. When an agent reads an untrusted PDF, parses a web page, or scans an incoming email, that unstructured text becomes part of the prompt context. If that text contains malicious instructions (an Indirect Prompt Injection), the model processes those instructions with the exact same priority as the original developer prompt.</p><p>Application-layer filters (like regex matchers or secondary LLM evaluators) fail for three primary reasons:</p><ul><li><strong>Semantic Encoding Obfuscation:</strong> Attackers can encode payloads in Base64, ROT13, custom hexadecimal encodings, or foreign languages that bypass input scanners but are easily deciphered by advanced models.</li><li><strong>Multi-Turn Context Manipulation:</strong> An attacker can fragment a payload across multiple conversational turns, assembling the malicious command only when the full context window is evaluated.</li><li><strong>Data Exfiltration via Legitimate Tools:</strong> Even if an agent is prevented from generating explicit curl commands, an attacker can trick the model into using legitimate internal tools (like an API integration or file reader) to exfiltrate sensitive data.</li></ul><p>The takeaway is simple: <strong>Security cannot be enforced within the same layer that is subject to compromise.</strong> Security must sit outside the execution context entirely.</p><h3>2. Core Philosophy: Zero Trust for AI Workloads</h3><p>OpenShell shifts security down to the infrastructure layer, operating under a strict <strong>Zero Trust Execution Model</strong>.</p><pre>OpenShell Zero-Trust Boundary (Deterministic):<br>[ Untrusted LLM / Agent ] ---&gt; [ OpenShell Runtime Boundaries ] ---&gt; [ Infrastructure / APIs ]<br>                                   |---&gt; Kernel Syscall Filters (Seccomp-BPF)<br>                                   |---&gt; Mount &amp; PID Namespaces (OverlayFS)<br>                                   |---&gt; Supervisor Egress Proxy (Credential Abstraction)<br>                                   |---&gt; Declarative Policy Engine (YAML-as-Code)</pre><p>Under OpenShell, the agent starts with <strong>zero privileges</strong>. It cannot access the host filesystem, it cannot invoke arbitrary system calls, it cannot open raw network sockets, and it cannot inspect host processes. Every single action must be explicitly permitted by a declarative policy file enforced by the underlying OS kernel.</p><h3>3. Deep Technical Architecture: Inside the OpenShell Engine</h3><p>OpenShell constructs its security perimeter by integrating four core subsystem mechanics:</p><h3>A. Kernel-Level Isolation (seccomp-bpf &amp; Linux Namespaces)</h3><p>Rather than spawning agents directly on the host or inside vanilla containers, OpenShell provisions ephemeral, heavily locked-down sandboxes backed by core Linux kernel security primitives:</p><ul><li><strong>System Call Filtering via </strong><strong>seccomp-bpf:</strong> OpenShell attaches custom Secure Computing Mode (seccomp) filters using Berkeley Packet Filter bytecode directly to the agent process tree. Dangerous system calls—such as execveat, ptrace, kexec_load, unshare, or dynamic kernel module loading—are intercepted and rejected at the kernel level. Even if an attacker achieves arbitrary code execution inside the agent runtime, they cannot invoke exploit payloads against the host kernel.</li><li><strong>Filesystem Isolation via Mount Namespaces &amp; </strong><strong>overlayfs:</strong> The root filesystem presented to the agent is mounted read-only (ro) by default using overlayfs. The agent is provided with an isolated, temporary workspace directory (/tmp/workspace). Critical system paths (/etc, /var/run, /proc/sys, ~/.ssh, ~/.aws) are entirely unmounted or omitted from the mount namespace.</li><li><strong>Process &amp; PID Namespaces:</strong> OpenShell executes the agent within an isolated PID namespace. The agent process cannot view, interact with, debug (gdb/strace), or signal (kill) any host processes or sibling agent sandboxes.</li></ul><h3>B. The Supervisor Proxy &amp; Credential Abstraction</h3><p>One of the most elegant design features of OpenShell is how it handles authentication tokens and API keys.</p><p>In traditional agent setups, developer credentials (e.g., OPENAI_API_KEY, GITHUB_TOKEN, AWS_ACCESS_KEY_ID) are passed as environment variables into the agent container. If an agent is jailbroken, an attacker simply instructs the model to execute env or read /proc/self/environ to exfiltrate those production secrets.</p><p>OpenShell completely eliminates secret exposure through <strong>Out-of-Band Credential Injection</strong>:</p><pre>[ Agent inside Sandbox ]  ---&gt; Attempts GET https://api.github.com/user<br>                                 |<br>                                 v  (Forced through Unix Domain Socket)<br>[ OpenShell Supervisor Proxy ] --| Checks YAML Policy -&gt; Authorized?<br>                                 | Inject Header: &quot;Authorization: Bearer ghp_SECRET...&quot;<br>                                 v<br>[ External API / Internet ]  &lt;---| Request Sent with Real Key</pre><ul><li><strong>Secret Isolation:</strong> Production API keys never enter the sandbox container or the agent’s context window.</li><li><strong>Forced Egress Interception:</strong> All outbound TCP/UDP traffic generated inside the sandbox is forcibly routed through a non-bypassable local Unix domain socket connected to the <strong>OpenShell Supervisor Proxy</strong>.</li><li><strong>Dynamic Injection:</strong> When the agent calls an approved external endpoint (e.g., api.github.com), the proxy inspects the request headers. If the target host matches the whitelisted policy, the Supervisor injects the actual authorization header <em>outside</em> the agent&#39;s sandbox boundary before forwarding the packet to the public internet.</li></ul><h3>C. Declarative Policy Engine (Policy-as-Code)</h3><p>OpenShell decouples security administration from application logic by utilizing declarative YAML policy definitions. Security engineering teams can audit and manage these specs independently of the AI development team:</p><p>YAML</p><pre># openshell-enterprise-policy.yaml<br>version: &quot;1.0&quot;<br>agent_id: &quot;financial-reporting-agent&quot;<br>runtime:<br>  max_memory_mb: 2048<br>  cpu_quota_pct: 50<br>  max_execution_time_sec: 300</pre><pre>filesystem:<br>  read_only_paths:<br>    - &quot;/app/templates&quot;<br>    - &quot;/app/datasets/public&quot;<br>  read_write_paths:<br>    - &quot;/tmp/workspace&quot;<br>  denied_paths:<br>    - &quot;/etc&quot;<br>    - &quot;/root&quot;<br>    - &quot;~/.ssh&quot;</pre><pre>syscalls:<br>  allow:<br>    - &quot;read&quot;<br>    - &quot;write&quot;<br>    - &quot;openat&quot;<br>    - &quot;close&quot;<br>    - &quot;exit_group&quot;<br>  action_on_deny: &quot;KILL_PROCESS&quot;</pre><pre>network:<br>  default_egress: &quot;DENY&quot;<br>  allowed_endpoints:<br>    - host: &quot;api.github.com&quot;<br>      port: 443<br>      proto: &quot;https&quot;</pre><pre>credentials:<br>  inject:<br>    - header: &quot;Authorization&quot;<br>      secret_env: &quot;PROD_GITHUB_TOKEN&quot;<br>      match_host: &quot;api.github.com&quot;</pre><h3>4. Real-World Walkthrough: Neutralizing Indirect Prompt Injection</h3><p>To visualize how OpenShell operates during an active security incident, let’s walk through a classic Indirect Prompt Injection exploit scenario:</p><pre>[ Malicious PDF ] ---&gt; [ Agent Reads File ] ---&gt; [ Executes Injected Command ] ---&gt; [ Exfiltration Attempt ]</pre><ul><li><strong>Phase 1: Reading the Target Document</strong></li><li>The agent reads an uploaded customer PDF located within /tmp/workspace.</li><li><em>Status:</em> <strong>ALLOWED</strong> (Matches read_write_paths in the YAML policy).</li><li><strong>Phase 2: Execution of Malicious Instruction</strong></li><li>The PDF contains hidden text ordering the LLM to read local system keys and send an HTTP POST request to [https://exfil.attacker-site.com](https://exfil.attacker-site.com).</li><li><strong>Phase 3: Network Interception at Proxy Layer</strong></li><li>The outbound TCP connection request is trapped by OpenShell’s socket redirection and routed to the <strong>Supervisor Proxy</strong>.</li><li>The Supervisor checks exfil.attacker-site.com against the allowed_endpoints rule.</li><li><em>Status:</em> <strong>DENIED</strong> (Destination host is not whitelisted).</li><li><strong>Phase 4: Containment &amp; Immediate Process Termination</strong></li><li>The Supervisor drops the connection attempt and logs an audit event (NET_EGRESS_VIOLATION).</li><li>Because the policy specifies action_on_deny: KILL_PROCESS, OpenShell issues a kernel-level SIGKILL to the sandbox process tree, instantly killing rogue execution.</li></ul><h3>5. Taking OpenShell to Production in Critical Infrastructure &amp; Enterprise Environments</h3><p>While OpenShell provides the runtime sandbox mechanics, deploying autonomous AI agents in high-stakes environments — such as energy grids, OT/ICS networks, financial networks, and critical infrastructure — requires more than just running a sandbox daemon.</p><p>You must be able to answer critical audit and governance questions:</p><ul><li><em>How do you translate NIST CSF 2.0, ISO 27001, and NIS2 compliance requirements into concrete AI agent policies?</em></li><li><em>What is your threat model for agentic workflow integration into SCADA/OT systems or internal cloud infrastructure?</em></li><li><em>Where are your standardized YAML policy templates, risk matrix spreadsheets, and red-teaming verification playbooks?</em></li></ul><p>Building these security governance frameworks and hardening templates from scratch usually takes engineering teams months of drafting and compliance alignment.</p><h3>Accelerated Field Resource</h3><blockquote><em>If you are currently designing or auditing AI agent deployments for enterprise networks or critical infrastructure, check out the </em><a href="https://techsavant013.gumroad.com/l/ai-governance-toolkit-critical-infrastructure"><strong><em>AI Governance &amp; Security Toolkit for Critical Infrastructure</em></strong></a><em> developed by TechSavant Security Lab.</em></blockquote><blockquote><em>It provides a complete, battle-tested implementation pack including:</em></blockquote><ul><li><strong>Production-Ready Policy Blueprints:</strong> Pre-configured YAML policy templates for OpenShell, seccomp-bpf profiles, and egress whitelist specs.</li><li><strong>Enterprise Risk &amp; Threat Matrix:</strong> Comprehensive threat modeling frameworks covering Indirect Prompt Injection, Credential Exfiltration, and Agent Privilege Escalation.</li><li><strong>OT/ICS &amp; Critical Infrastructure Playbooks:</strong> Specific guidelines for integrating AI tools into SCADA, energy management systems, and high-availability operational technology without violating NERC CIP or IEC 62443 standards.</li><li><strong>Audit-Ready Compliance Checklists:</strong> Step-by-step verification templates to satisfy enterprise risk assessment boards and regulatory audits.</li></ul><h3>6. Hardware-Enforced Isolation: NVIDIA BlueField DPU Integration</h3><p>For organizations operating in ultra-sensitive environments where software-level kernel sandboxes might still trigger compliance concerns regarding kernel zero-day escapes, the <strong>OpenShell Reference Architecture</strong> introduces hardware-enforced isolation via <strong>NVIDIA BlueField DPUs</strong> and <strong>NVIDIA Sentry</strong> (powered by DOCA).</p><pre>+--------------------------------------------------------------------------+<br>| HOST SYSTEM (CPU &amp; GPU)                                                  |<br>|   [ Untrusted Agent Workload ] ---&gt; [ User Space Sandbox Container ]     |<br>+--------------------------------------------------------------------------+<br>                                  |<br>            PCIe Out-of-Band Telemetry &amp; Network Monitoring<br>                                  |<br>                                  v<br>+--------------------------------------------------------------------------+<br>| HARDWARE BOUNDARY: NVIDIA BlueField DPU (Running NVIDIA Sentry / DOCA)   |<br>|   [ Hardware-Isolated Enclave ] ---&gt; [ Real-time Telemetry &amp; Net-Kill ]  |<br>+--------------------------------------------------------------------------+</pre><ul><li><strong>Air-Gapped Control Plane:</strong> The security policy engine and telemetry monitors run on the BlueField DPU’s dedicated ARM cores — completely separate from the host CPU running the LLM agent.</li><li><strong>Tamper-Proof Audit Logging:</strong> Even if an attacker achieves root access and escapes the host OS kernel, they cannot modify or delete audit logs stored inside the physically isolated DPU enclave.</li><li><strong>Out-of-Band Physical Termination:</strong> If the DPU detects anomalous egress traffic or unexpected system call patterns, it can sever the host’s physical network interface or issue an out-of-band hardware reset directly over the PCIe bus.</li></ul><h3>Conclusion</h3><p>We need to stop treating AI agent security as a prompt engineering problem. Prompts are designed to guide behavior; infrastructure is designed to enforce boundaries.</p><p>NVIDIA OpenShell provides a robust blueprint for placing deterministic security perimeters around non-deterministic AI models. By combining seccomp-bpf kernel filtering, proxy credential abstraction, hardware-backed monitoring, and comprehensive governance frameworks like the <a href="https://techsavant013.gumroad.com/l/ai-governance-toolkit-critical-infrastructure"><strong>AI Governance Toolkit for Critical Infrastructure</strong></a>, security teams can safely unlock the power of autonomous AI agents without sacrificing operational integrity.</p><h4>Keep reading</h4><ul><li><a href="https://medium.com/p/a6ee59e43f8b">Build a Harmless Canary MCP Server to Test Your AI Agent for Tool Poisoning</a></li><li><a href="https://medium.com/p/1ac30d338e07">MCP Is the New Attack Surface: What the 2025–2026 Incidents Teach</a></li><li><a href="https://medium.com/p/b97a08abef78">AI Agents Need Identity, Not Just Guardrails</a></li></ul><p>I write one practical, test-it-yourself article a week on AI agent and OT/ICS security. <strong>Follow</strong> if that’s useful to you.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=0154e1908986" width="1" height="1" alt=""><hr><p><a href="https://systemweakness.com/stop-trusting-system-prompts-a-deep-technical-analysis-of-nvidia-openshell-for-ai-agent-security-0154e1908986">Stop Trusting System Prompts: A Deep Technical Analysis of NVIDIA OpenShell for AI Agent Security</a> was originally published in <a href="https://systemweakness.com">System Weakness</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>