<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: EJ Wisner</title>
    <description>The latest articles on DEV Community by EJ Wisner (@ejwisner).</description>
    <link>https://dev.to/ejwisner</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3864537%2F60d24e43-e521-429a-bb4a-9febcb56c5f3.png</url>
      <title>DEV Community: EJ Wisner</title>
      <link>https://dev.to/ejwisner</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ejwisner"/>
    <language>en</language>
    <item>
      <title>I Scanned a Real Public Magento Extension with AI — Here's What It Found</title>
      <dc:creator>EJ Wisner</dc:creator>
      <pubDate>Mon, 13 Apr 2026 14:03:31 +0000</pubDate>
      <link>https://dev.to/ejwisner/i-scanned-a-real-public-magento-extension-with-ai-heres-what-it-found-1apn</link>
      <guid>https://dev.to/ejwisner/i-scanned-a-real-public-magento-extension-with-ai-heres-what-it-found-1apn</guid>
      <description>&lt;p&gt;I've been building Ghost Architect — an AI-powered codebase triage tool. To prove it works on real code, I pointed it at a well-known public Magento 2 extension used by thousands of stores: the Meta for Magento 2 Facebook Business Extension.&lt;br&gt;
I didn't cherry-pick the results. Here's what came back.&lt;br&gt;
The scan&lt;/p&gt;

&lt;p&gt;658 files analyzed&lt;br&gt;
18 architectural findings surfaced&lt;br&gt;
Cost: $0.2372 in Anthropic API usage&lt;br&gt;
Time: under 10 minutes&lt;/p&gt;

&lt;p&gt;Finding #1 — Critical: Client-Side Credential Exposure&lt;br&gt;
The FBE installation flow returns Meta OAuth access tokens in JSON responses and stores them in window.facebookBusinessExtensionConfig. The fbe_installs.js script then uses these tokens to make Graph API calls directly from the browser.&lt;br&gt;
Attack vectors: DevTools inspection, XSS anywhere in Magento, CDN caching, session replay tools.&lt;br&gt;
Estimated fix: 8-12 hours.&lt;br&gt;
Finding #9 — Critical: Ad Spend Inflation Race Condition&lt;br&gt;
A race condition in event ID deduplication causes 10-20% duplicate Conversion API events — inflating Meta ad spend by thousands monthly. Ghost flagged this as the most expensive bug in the codebase.&lt;br&gt;
Estimated fix: 10-14 hours.&lt;br&gt;
Finding #3 — High: Mass Assignment Configuration Vulnerability&lt;br&gt;
The PersistConfiguration controller accepts arbitrary POST parameters and saves them directly to core_config_data without validation. Combined with missing CSRF protection, any system configuration value is writable by an attacker.&lt;br&gt;
Estimated fix: 6-8 hours.&lt;br&gt;
What Ghost doesn't do&lt;br&gt;
These are pattern-based starting points — not proven exploits. Ghost doesn't run dynamic analysis or confirm vulnerabilities are exploitable. It gives your engineers a map of where to look, not a penetration test report.&lt;br&gt;
Try it yourself&lt;br&gt;
Ghost Open is free and runs locally. Your code never leaves your machine.&lt;br&gt;
npm i -g ghost-architect-open&lt;br&gt;
Full output — PDF, multipass analysis, all severity levels — is Ghost Pro at ghostarchitect.dev.&lt;/p&gt;

</description>
      <category>magneto</category>
      <category>security</category>
      <category>ai</category>
      <category>devtools</category>
    </item>
    <item>
      <title>I ran my AI codebase triage tool on itself — here's what it found</title>
      <dc:creator>EJ Wisner</dc:creator>
      <pubDate>Mon, 06 Apr 2026 20:28:29 +0000</pubDate>
      <link>https://dev.to/ejwisner/i-ran-my-ai-codebase-triage-tool-on-itself-heres-what-it-found-2ma2</link>
      <guid>https://dev.to/ejwisner/i-ran-my-ai-codebase-triage-tool-on-itself-heres-what-it-found-2ma2</guid>
      <description>&lt;p&gt;I built Ghost Architect™ Open — a free, local AI tool that triages codebases and scores findings by severity. To test it properly, I ran it on its own source code.&lt;/p&gt;

&lt;p&gt;It found a Critical bug.&lt;/p&gt;

&lt;h2&gt;
  
  
  The finding
&lt;/h2&gt;

&lt;p&gt;The redaction engine — the module that strips API keys and secrets before sending code to Claude — had a pointer offset bug. When replacing a secret pattern, it wasn't advancing the scan position after each replacement. On files with 50+ environment variables, it would stop redacting halfway through.&lt;/p&gt;

&lt;p&gt;Users were seeing "Redacted 12 patterns" and assuming their code was safe. Pattern 13 was their database password.&lt;/p&gt;

&lt;p&gt;The bug was fixed the same day. That's the point — you can't fix what you can't see.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Ghost Architect™ Open does
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Points at any local directory, ZIP file, or GitHub repo&lt;/li&gt;
&lt;li&gt;Triages the code and scores findings: Critical, High, Medium, Low&lt;/li&gt;
&lt;li&gt;Runs entirely on your machine — your code never leaves&lt;/li&gt;
&lt;li&gt;Uses the Anthropic API with your own key (new accounts get a $5 credit)&lt;/li&gt;
&lt;li&gt;Supports PHP, Python, Node.js, Java, Go, React, and more&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Free vs Pro
&lt;/h2&gt;

&lt;p&gt;Ghost Open is free. It returns Critical and High findings in TXT and Markdown format.&lt;/p&gt;

&lt;p&gt;Ghost Pro adds Medium and Low findings, multipass analysis, project intelligence, and full PDF reports.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/EJWisner/ghost-architect-open" rel="noopener noreferrer"&gt;https://github.com/EJWisner/ghost-architect-open&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Full platform: &lt;a href="https://ghostarchitect.dev" rel="noopener noreferrer"&gt;https://ghostarchitect.dev&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>php</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
