<?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>Forem: Alex</title>
    <description>The latest articles on Forem by Alex (@ajunger).</description>
    <link>https://forem.com/ajunger</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%2F3821747%2Fbfc43f3f-32be-43fd-9670-508004362897.png</url>
      <title>Forem: Alex</title>
      <link>https://forem.com/ajunger</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ajunger"/>
    <language>en</language>
    <item>
      <title>I built a static analyzer that would have caught the tj-actions supply-chain attack before it executed</title>
      <dc:creator>Alex</dc:creator>
      <pubDate>Fri, 13 Mar 2026 07:50:38 +0000</pubDate>
      <link>https://forem.com/ajunger/i-built-a-static-analyzer-that-would-have-caught-the-tj-actions-supply-chain-attack-before-it-3m37</link>
      <guid>https://forem.com/ajunger/i-built-a-static-analyzer-that-would-have-caught-the-tj-actions-supply-chain-attack-before-it-3m37</guid>
      <description>&lt;p&gt;CVE-2025-30066 compromised 23,000+ repositories via a simple tag reassignment. The attacker moved existing tags (v35, v44) to a malicious commit that printed CI secrets to workflow logs. No zero-day, no sophisticated exploit — just mutable Git tags and implicit trust.&lt;/p&gt;

&lt;p&gt;The fix is well-known: pin actions to commit SHAs instead of tags. But nobody does it consistently because it's manual and tedious.&lt;/p&gt;

&lt;p&gt;So I built PipeGuard — a CLI scanner that checks your .github/workflows/ directory for this and related issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Actions pinned to mutable tags instead of commit SHAs&lt;/li&gt;
&lt;li&gt;Missing or overly broad workflow permissions (write-all, no permissions block)&lt;/li&gt;
&lt;li&gt;Known CVEs in action dependencies&lt;/li&gt;
&lt;li&gt;Third-party action inventory (full list of what your pipeline actually executes)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It runs entirely offline. No account, no API keys, no data leaves your machine.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;pip install pipeguard-cli
pipeguard scan .github/workflows/
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Real output from my own repo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;error  sha-pinning   actions/checkout pinned to 'v4' instead of commit SHA
error  sha-pinning   shivammathur/setup-php pinned to 'v2' instead of commit SHA
error  permissions-missing   no top-level permissions block found
warning  supply-chain  shivammathur/setup-php — unverified publisher
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I also wrote a technical breakdown of how the tj-actions attack worked step by step if that's useful context: &lt;a href="https://alex-jung.org/blog/github-actions/tj-actions-supply-chain-attack/" rel="noopener noreferrer"&gt;https://alex-jung.org/blog/github-actions/tj-actions-supply-chain-attack/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/alex-jung/pipeguard-cli" rel="noopener noreferrer"&gt;https://github.com/alex-jung/pipeguard-cli&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feedback welcome — especially on false positives and missed cases.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>security</category>
      <category>opensource</category>
      <category>github</category>
    </item>
  </channel>
</rss>
