<?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: Joseph Yeo</title>
    <description>The latest articles on DEV Community by Joseph Yeo (@devradarguard).</description>
    <link>https://dev.to/devradarguard</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%2F3863060%2Fd9effc67-9b83-4061-bdfd-3965e2479a22.png</url>
      <title>DEV Community: Joseph Yeo</title>
      <link>https://dev.to/devradarguard</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/devradarguard"/>
    <language>en</language>
    <item>
      <title>Case Study: How I Dogfood DevRadar Guard on a 954-Dependency Project</title>
      <dc:creator>Joseph Yeo</dc:creator>
      <pubDate>Mon, 06 Apr 2026 13:25:37 +0000</pubDate>
      <link>https://dev.to/devradarguard/case-study-how-i-dogfood-devradar-guard-on-a-954-dependency-project-d7e</link>
      <guid>https://dev.to/devradarguard/case-study-how-i-dogfood-devradar-guard-on-a-954-dependency-project-d7e</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a follow-up to my earlier post: &lt;a href="https://dev.to/devradarguard/axios-was-compromised-heres-what-it-means-for-your-repo-1hh0"&gt;Axios Was Compromised. Here's What It Means for Your Repo.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Setup
&lt;/h2&gt;

&lt;p&gt;GloriaPPT is a presentation tool I built and maintain. It's a fairly typical modern JavaScript app: a Next.js frontend, a Node.js backend, and deployment on Vercel. What makes it interesting for this case study is its dependency tree: &lt;strong&gt;954 npm packages&lt;/strong&gt; in the lockfile.&lt;/p&gt;

&lt;p&gt;Most of those packages are transitive. I haven't read the source code for most of them, and realistically, neither do most small teams. If one of them were compromised tomorrow, I probably wouldn't know right away.&lt;/p&gt;

&lt;p&gt;That's the problem I built DevRadar Guard to solve.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before DevRadar Guard
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dependency monitoring:&lt;/strong&gt; Manual &lt;code&gt;npm audit&lt;/code&gt; when I remembered to run it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supply chain alerts:&lt;/strong&gt; None — I found out about incidents from social feeds and security threads&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;.npmrc&lt;/code&gt; hardening:&lt;/strong&gt; Default settings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt; security section:&lt;/strong&gt; Didn't exist&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pre-install hooks:&lt;/strong&gt; None&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI/CD security checks:&lt;/strong&gt; Basic Dependabot, no custom policy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Response time to incidents:&lt;/strong&gt; Hours to days, depending on when I saw the news&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  After DevRadar Guard
&lt;/h2&gt;

&lt;p&gt;I deployed DevRadar Guard's hosted monitoring on a small VPS that checks every 30 minutes. Here's what changed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Signal Collection
&lt;/h3&gt;

&lt;p&gt;The Signal Engine collects threat intelligence from GitHub Security Advisories every 30 minutes. In the first 24 hours, it ingested &lt;strong&gt;467 raw events&lt;/strong&gt; — advisories affecting npm packages — and normalized all of them into structured threat candidates with confidence scores.&lt;/p&gt;

&lt;p&gt;Each signal is scored across five dimensions, including source quality, technical specificity, cross-reference validation, discussion velocity, and ecosystem relevance.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exposure Matching
&lt;/h3&gt;

&lt;p&gt;Out of 467 normalized signals, the Exposure Engine matched &lt;strong&gt;1 against GloriaPPT's actual dependency tree&lt;/strong&gt;: axios.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Package:&lt;/strong&gt; axios&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Installed version:&lt;/strong&gt; 1.14.1&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confidence score:&lt;/strong&gt; 65/100&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exposure score:&lt;/strong&gt; 50/100&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Final risk:&lt;/strong&gt; 57/100 (alert threshold: 50)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The confidence score reflects signal quality: a high-trust source, a named package and version, and enough technical detail to treat the advisory seriously.&lt;/p&gt;

&lt;p&gt;The exposure score reflects how directly the issue touched this repo: &lt;code&gt;axios&lt;/code&gt; was a direct dependency, and the affected version was present in the lockfile.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Alert
&lt;/h3&gt;

&lt;p&gt;At 00:24 KST (UTC+9) on April 6, a Slack alert landed in #devradar-alerts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🛡️ DevRadar Guard Alert

Package: axios
Version: 1.14.1
Risk Score: 57/100
Confidence: 65
Exposure: 50
Path: direct

Signal: Compromised axios versions 1.14.1 and 0.30.4 were
reported to deliver a remote access trojan...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I didn't find out about the axios compromise from social media. The alert was waiting for me when I checked Slack.&lt;/p&gt;

&lt;h3&gt;
  
  
  Guardrail Bundle
&lt;/h3&gt;

&lt;p&gt;DevRadar Guard generates a guardrail bundle — a set of files you can drop into a repo to harden installs, guide AI coding agents, and surface risky dependency changes during review:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;CLAUDE.md&lt;/code&gt; security section&lt;/td&gt;
&lt;td&gt;Security policy for AI coding agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;.npmrc&lt;/code&gt; hardening&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ignore-scripts=true&lt;/code&gt;, &lt;code&gt;audit=true&lt;/code&gt;, registry pinning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pre-install hook&lt;/td&gt;
&lt;td&gt;Warns before installing packages younger than 7 days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub Actions workflow&lt;/td&gt;
&lt;td&gt;PR check that flags risky dependency changes (alert-only)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;devradar-policy.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Machine-readable policy for CI/CD integration&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;GloriaPPT now uses all 8 generated guardrail files. The pre-install hook would likely have flagged the malicious &lt;code&gt;plain-crypto-js&lt;/code&gt; dependency used in the attack, since it had been published less than 24 hours earlier.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Numbers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Dependencies monitored&lt;/td&gt;
&lt;td&gt;954&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Raw threat signals collected (first 24h)&lt;/td&gt;
&lt;td&gt;467&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Normalization success rate (first 24h sample)&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Signals matched to GloriaPPT&lt;/td&gt;
&lt;td&gt;1 (axios)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;False positives in this case study&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time from advisory to alert&lt;/td&gt;
&lt;td&gt;&amp;lt; 30 minutes (cron cycle)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Guardrail files generated&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Manual intervention during detection&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What This Doesn't Prove
&lt;/h2&gt;

&lt;p&gt;I want to be honest about what this case study shows and what it doesn't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It shows:&lt;/strong&gt; A real supply chain threat was detected, matched to a real project, and surfaced as an actionable alert — automatically, without manual intervention.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It doesn't show:&lt;/strong&gt; DevRadar Guard catching a zero-day before anyone else. The axios advisory was already published when my pipeline picked it up. I'm not claiming to be faster than GitHub Advisory. I'm claiming to be faster than manual monitoring — finding out from social feeds, security threads, or a post after the fact.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It doesn't show:&lt;/strong&gt; Protection against all supply chain attacks. The Signal Engine currently monitors GitHub Advisories only. Reddit, npm registry anomaly detection, and other sources are planned but not yet active in Alpha.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It doesn't show:&lt;/strong&gt; Automatic blocking. DevRadar Guard Alpha is alert-only. No PR failures, no install blocks, no surprises. You get the information; you decide what to do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;DevRadar Guard is still in Alpha, and I'm testing it with a small number of pilot teams. Right now that includes hosted monitoring on a 30-minute cycle, matched alerts in Slack or Discord, a generated guardrail bundle for the repo, and a weekly threat briefing. All I ask in return is a few minutes of feedback each week.&lt;/p&gt;

&lt;p&gt;If your project has a &lt;code&gt;package-lock.json&lt;/code&gt; and you want earlier, repo-specific visibility into supply chain incidents, the starter kit and waitlist are below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/devradar-guard/devradar-guard/tree/main/examples/starter-kit" rel="noopener noreferrer"&gt;Starter Kit on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tally.so/r/GxDbbL" rel="noopener noreferrer"&gt;Join the waitlist&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;DevRadar Guard Alpha — alert-only, no automatic blocking. You stay in control.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>npm</category>
      <category>security</category>
      <category>supplychain</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Axios Was Compromised. Here's What It Means for Your Repo.</title>
      <dc:creator>Joseph Yeo</dc:creator>
      <pubDate>Mon, 06 Apr 2026 03:58:03 +0000</pubDate>
      <link>https://dev.to/devradarguard/axios-was-compromised-heres-what-it-means-for-your-repo-1hh0</link>
      <guid>https://dev.to/devradarguard/axios-was-compromised-heres-what-it-means-for-your-repo-1hh0</guid>
      <description>&lt;p&gt;On March 31, 2026, the &lt;code&gt;axios&lt;/code&gt; npm package — with over 100 million weekly downloads — was compromised and used to distribute malware.&lt;/p&gt;

&lt;p&gt;A threat actor took over the lead maintainer's npm account, published two backdoored versions (&lt;code&gt;1.14.1&lt;/code&gt; and &lt;code&gt;0.30.4&lt;/code&gt;), and added a hidden dependency that deployed a cross-platform remote access trojan. The payload targeted Windows, macOS, and Linux. The malicious versions were live for only about three hours before they were removed.&lt;/p&gt;

&lt;p&gt;In practice, three hours was enough.&lt;/p&gt;

&lt;p&gt;Microsoft attributed the attack to Sapphire Sleet, a North Korean state actor. Google's Threat Intelligence Group confirmed UNC1069 involvement. This was a coordinated, pre-staged operation — the malicious dependency was planted 18 hours before activation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters to You
&lt;/h2&gt;

&lt;p&gt;If your &lt;code&gt;package.json&lt;/code&gt; uses caret ranges like &lt;code&gt;^1.x&lt;/code&gt;, a routine &lt;code&gt;npm install&lt;/code&gt; could have pulled the compromised version automatically. No unusual action required. Just your normal CI/CD pipeline doing what it was designed to do.&lt;/p&gt;

&lt;p&gt;Most teams would not have caught this in time.&lt;/p&gt;

&lt;p&gt;Not because they're careless, but because the tooling gap is real:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;npm audit&lt;/code&gt; looks for known CVEs. This wasn't a CVE when it hit.&lt;/li&gt;
&lt;li&gt;Dependabot follows published advisories. This version came from the real maintainer account.&lt;/li&gt;
&lt;li&gt;Lockfiles help, but only if they're pinned and not being updated automatically.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The teams that stayed safe had one thing in common: they treated dependency management as part of their security practice, not just routine package maintenance.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Happened in Our Setup
&lt;/h2&gt;

&lt;p&gt;I maintain a project called GloriaPPT — a typical Next.js app with 954 npm dependencies. When the axios advisory dropped, I wasn't refreshing Twitter. I got a Slack alert.&lt;/p&gt;

&lt;p&gt;I built DevRadar Guard to answer one practical question fast: does this incident actually touch one of my repos? In this case, the flow looked like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Signal Engine&lt;/strong&gt; picked up the GitHub Advisory within its 30-minute collection cycle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exposure Engine&lt;/strong&gt; matched it against GloriaPPT's &lt;code&gt;package-lock.json&lt;/code&gt;, where &lt;code&gt;axios&lt;/code&gt; was a direct dependency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Guardrail Engine&lt;/strong&gt; sent a Slack alert with the risk score, confidence level, and affected version.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No manual checking. No scrolling through threads or advisories. The alert landed with the information I needed to decide what to do next.&lt;/p&gt;

&lt;h2&gt;
  
  
  Axios Was One Incident. The Pattern Keeps Repeating.
&lt;/h2&gt;

&lt;p&gt;Axios will be patched. Credentials will be rotated. Postmortems will be published.&lt;/p&gt;

&lt;p&gt;But the pattern repeats. Before axios, it was event-stream. Before that, ua-parser-js. The attack surface keeps growing with every install that pulls in packages your team didn't explicitly choose or review.&lt;/p&gt;

&lt;p&gt;The question isn't whether the next supply chain attack will happen. It's whether your repo will know about it before your CI/CD pipeline installs it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What You Can Do Today
&lt;/h2&gt;

&lt;p&gt;Even without new tooling, these steps can reduce your risk right away:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pin your dependencies.&lt;/strong&gt; Remove &lt;code&gt;^&lt;/code&gt; and &lt;code&gt;~&lt;/code&gt; from critical packages. Use exact versions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set &lt;code&gt;ignore-scripts=true&lt;/code&gt; in &lt;code&gt;.npmrc&lt;/code&gt;.&lt;/strong&gt; In this incident, that setting would have blocked the malicious install script.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review your lockfile after every install.&lt;/strong&gt; If a new transitive dependency appears that you didn't add, investigate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit your CI/CD pipeline permissions.&lt;/strong&gt; Does your build environment need network access during &lt;code&gt;npm install&lt;/code&gt;?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What We're Building
&lt;/h2&gt;

&lt;p&gt;I'm also building DevRadar Guard around this workflow: early signal collection, repo exposure checks, and guardrail generation. Part of it is open source, including starter config for &lt;code&gt;.npmrc&lt;/code&gt;, pre-install hooks, &lt;code&gt;CLAUDE.md&lt;/code&gt; (security policy for AI coding agents), and GitHub Actions.&lt;/p&gt;

&lt;p&gt;DevRadar Guard is still in Alpha and runs in alert-only mode. No automatic blocking, and no surprise PR failures. You stay in control.&lt;/p&gt;

&lt;p&gt;If your team depends on npm and this workflow sounds useful, take a look at the starter kit or join the waitlist:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/devradar-guard/devradar-guard/tree/main/examples/starter-kit" rel="noopener noreferrer"&gt;Starter Kit on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tally.so/r/GxDbbL" rel="noopener noreferrer"&gt;Join the waitlist&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>security</category>
      <category>npm</category>
      <category>supplychain</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
