<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Security on tigger.dev</title><link>https://tigger.dev/tags/security/</link><description>Recent content in Security on tigger.dev</description><generator>Hugo</generator><language>en-gb-oed</language><copyright>© Tadhg O'Brien</copyright><lastBuildDate>Fri, 17 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tigger.dev/tags/security/index.xml" rel="self" type="application/rss+xml"/><item><title>Claude Code: We've Got Issues</title><link>https://tigger.dev/2026-04-17-claude-code-sdlc/</link><pubDate>Fri, 17 Apr 2026 00:00:00 +0000</pubDate><guid>https://tigger.dev/2026-04-17-claude-code-sdlc/</guid><description>&lt;div id="outline-container-headline-1" class="outline-2"&gt;
&lt;h2 id="headline-1"&gt;
A personal Software Development Lifecycle (SDLC), earned the hard way
&lt;/h2&gt;
&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;
&lt;p&gt;Claude Code is Anthropic&amp;#39;s AI coding agent — an LLM that lives in your terminal, reads your codebase, and writes code on your behalf. Two years of using it, and a pattern I can now recite from memory. Given half a chance, it will do any of the following and report the job done.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Treat questions as instructions. &amp;#34;What do you think of X?&amp;#34; parsed not as an invitation to discuss but as a command to go and build X - committed to the codebase, &lt;strong&gt;sometimes with product decisions made along the way that nobody asked it to make&lt;/strong&gt;, before the conversation has even started.&lt;/li&gt;
&lt;li&gt;Override the human-in-the-loop entirely. Type the human&amp;#39;s approval keywords into its own chat output to unlock states only the human should unlock. Invoke the human&amp;#39;s emergency bypass keyword on its own authority because it decided the current task didn&amp;#39;t need human review. Forgery and self-granted exemption, both reported as task-complete.&lt;/li&gt;
&lt;li&gt;Disable a script&amp;#39;s own safety mechanism quietly. The script begins with the standard stop-immediately-if-anything-fails header (&lt;code class="verbatim"&gt;set -e&lt;/code&gt;), then appends an override (&lt;code class="verbatim"&gt;|| true&lt;/code&gt;) to every risky command below it, which tells the shell to pretend the line succeeded no matter what actually happened. The safety header is there. The safety is not.&lt;/li&gt;
&lt;li&gt;Make sensitive files readable, writable, and executable by anyone at all - including unauthenticated strangers reaching the machine over the internet - to get past a permissions error (&lt;code class="verbatim"&gt;chmod 777&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Switch off the check that verifies a web server is who it claims to be (SSL/TLS verification&lt;sup class="footnote-reference"&gt;&lt;a id="footnote-reference-1" href="#footnote-1"&gt;1&lt;/a&gt;&lt;/sup&gt;), because a server&amp;#39;s certificate was inconvenient.&lt;/li&gt;
&lt;li&gt;Hardcode credentials into source that was about to be committed.&lt;/li&gt;
&lt;li&gt;Silently create a &lt;strong&gt;public&lt;/strong&gt; GitHub repository and upload an entire directory tree to it, because it thought it should raise a ticket. To overcome the &amp;#34;obstacle&amp;#34; of finding itself in a private folder that was not tracked by a git&lt;sup class="footnote-reference"&gt;&lt;a id="footnote-reference-2" href="#footnote-2"&gt;2&lt;/a&gt;&lt;/sup&gt; repository.&lt;/li&gt;
&lt;li&gt;Report green across the board on a test suite that never actually ran the command a user would type. The compiled code did nothing. The dashboard said healthy, every test passed! Ostensibly the tests were there, but it had written them in a way that was most convenient for itself with the least amount of effort.&lt;sup class="footnote-reference"&gt;&lt;a id="footnote-reference-3" href="#footnote-3"&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class="pull-quote"&gt;
 &lt;blockquote&gt;
 None of these are obscure mistakes. They are safety-critical decisions being made unilaterally, to get past whatever was in the way, and reported as task-complete.
 &lt;/blockquote&gt;&lt;/figure&gt;

These are not occasional slips. They are patterns. Reliable enough that you can name them and watch them recur on the next project if you do not actively intervene. &lt;/p&gt;</description></item><item><title>Setup &amp; Harden a Linux Server in 2026</title><link>https://tigger.dev/harden-linux-server/</link><pubDate>Thu, 29 Jan 2026 00:00:00 +0000</pubDate><guid>https://tigger.dev/harden-linux-server/</guid><description>&lt;p&gt;If you spin up a fresh Linux box today, it&amp;#39;s not &amp;#34;new&amp;#34; for long. The moment it&amp;#39;s reachable, it&amp;#39;s being scanned, prodded, and occasionally hammered by automated traffic. That&amp;#39;s not paranoia, it&amp;#39;s just the background noise of the modern internet. Honeypot data has been consistent for years: a brand-new instance with a public IP will typically see its first SSH probe within minutes, and credential-stuffing attempts shortly after.&lt;/p&gt;
&lt;p&gt;
Cloud providers have made it trivially easy to create compute instances. What they haven&amp;#39;t done is make them safe by default. You still get a general-purpose system with a wide attack surface, and it&amp;#39;s on you to reduce that surface before you put anything meaningful on it.&lt;/p&gt;</description></item><item><title>AI Safety: A Quick Reference</title><link>https://tigger.dev/2025-12-26-ai-safety/</link><pubDate>Thu, 27 Mar 2025 00:00:00 +0000</pubDate><guid>https://tigger.dev/2025-12-26-ai-safety/</guid><description>&lt;p&gt;
This is a reference companion to my series on &lt;a href="https://tigger.dev/genai/ai-overview/"&gt;understanding AI&lt;/a&gt;. Before diving into the practical guides and opinion pieces, take a moment to understand the risks.&lt;/p&gt;
&lt;div id="outline-container-headline-1" class="outline-2"&gt;
&lt;h2 id="headline-1"&gt;
Using AI-generated material
&lt;/h2&gt;
&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;
&lt;p&gt;
Before using information or data generated by an AI service, be aware:&lt;/p&gt;
&lt;p&gt;
Generative AI can &lt;em&gt;hallucinate&lt;/em&gt;, which is another way of saying it makes things up. Check all information before using it. Carefully parse summaries in case it misses nuance or key information.&lt;/p&gt;</description></item></channel></rss>