<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0"
 xmlns:atom="http://www.w3.org/2005/Atom"
 xmlns:blogChannel="http://backend.userland.com/blogChannelModule"
 xmlns:content="http://purl.org/rss/1.0/modules/content/"
 xmlns:dcterms="http://purl.org/dc/terms/"
 xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
>

<channel>
<title>The Daily WTF</title>
<link>http://thedailywtf.com/</link>
<description>The Daily WTF</description>

<item>
<title>CodeSOD: Death of the Auth-Er</title>
<link>https://thedailywtf.com/articles/death-of-the-auth-er</link>
<description>&#x3C;div&#x3E;&#x3C;p&#x3E;When writing Perl, it&#x27;s not unusual to want to &#x3C;code&#x3E;die&#x3C;/code&#x3E;. The &#x3C;code&#x3E;die&#x3C;/code&#x3E; function ends your Perl program with an error string, and you&#x27;ll often see code like: &#x3C;code&#x3E;die &#x22;My error&#x22; unless $i &#x26;gt; 5&#x3C;/code&#x3E; or &#x3C;code&#x3E;die &#x22;Other error&#x22; if check()&#x3C;/code&#x3E;, because Perl just loves the backwards conditionals. What&#x27;s even more fun with &#x3C;code&#x3E;die&#x3C;/code&#x3E; is &#x3C;a href=&#x22;https://perldoc.perl.org/functions/die&#x22;&#x3E;how it behaves with &#x3C;code&#x3E;eval&#x3C;/code&#x3E; blocks&#x3C;/a&#x3E;, so it doesn&#x27;t always kill your program, sometimes it is how you pass error strings back out of sections of your program.&#x3C;/p&#x3E;&#x3C;p&#x3E;And poor &#x3C;strong&#x3E;Bobby&#x3C;/strong&#x3E; has inherited some Perl that just really loves to &#x3C;code&#x3E;die&#x3C;/code&#x3E;.&#x3C;/p&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;language-perl&#x22;&#x3E;public function store()
{
    echo &#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x27;Hello&#x27;&#x3C;/span&#x3E;; &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;die&#x3C;/span&#x3E;;
    &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;if&#x3C;/span&#x3E; (Auth::attempt(Input::only(&#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x27;email&#x27;&#x3C;/span&#x3E;, &#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x27;password&#x27;&#x3C;/span&#x3E;)))
    {
        echo &#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x27;done&#x27;&#x3C;/span&#x3E;; &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;die&#x3C;/span&#x3E;;
        &#x3C;span class=&#x22;hljs-regexp&#x22;&#x3E;//&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;return&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x22;welcome &#x22;&#x3C;/span&#x3E;.Auth::user()-&#x26;gt;username
    }
    echo &#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x22;Oops! Fails&#x22;&#x3C;/span&#x3E;; &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;die&#x3C;/span&#x3E;;
    &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;return&#x3C;/span&#x3E; Redirect::back()-&#x26;gt;with_input();
}
&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;p&#x3E;Bobby didn&#x27;t send the source control history here, but I have a sense of what it likely was like, once. If they authenticate successfully, print a welcome message. If they don&#x27;t, redirect back to the logon page and let them try again. I suspect they wanted to disable the route. So first they disabled the success path, only to discover that the failure path kept redirecting, so they disabled that too. Finally, they added the &#x3C;code&#x3E;Hello&#x3C;/code&#x3E; at the top to disable the whole thing.&#x3C;/p&#x3E;&#x3C;p&#x3E;Why? Why did they do any of this? No idea. It &#x3C;em&#x3E;feels&#x3C;/em&#x3E; like debugging code, but you&#x27;d expect more &#x3C;code&#x3E;echo&#x3C;/code&#x3E;s and fewer &#x3C;code&#x3E;die&#x3C;/code&#x3E;s if that were the case. And you wouldn&#x27;t expect it to leak into production and sit there for years, which is what happened here.&#x3C;/p&#x3E;&#x3C;span style=&#x22;font-weight: bold; font-size: smaller; font-style: italic&#x22;&#x3E; Easy Reader Version: My favorite thing about Perl is that when they finally tried to make the syntax make sense, it pissed people off so badly they had to name the result as a new language, because they couldn&#x27;t call in Perl without Perl programmers rioting. &#x3C;/span&#x3E;&#x3C;style&#x3E;.comment { border: none; }&#x3C;/style&#x3E;&#x3C;div&#x3E;&#x3C;img src=&#x22;https://thedailywtf.com/images/inedo/buildmaster-icon.png&#x22; style=&#x22;display:block; float: left; margin: 0 10px 10px 0;&#x22; /&#x3E; [Advertisement] &#x3C;a href=&#x22;https://inedo.com/BuildMaster?utm_source=tdwtf&#x26;amp;utm_medium=footerad&#x26;amp;utm_term=2018&#x26;amp;utm_content=Self_Service&#x26;amp;utm_campaign=Buildmaster_Footer&#x22;&#x3E;BuildMaster&#x3C;/a&#x3E; allows you to create a self-service release management platform that allows different teams to manage their applications. &#x3C;a href=&#x22;https://inedo.com/BuildMaster/download?utm_source=tdwtf&#x26;amp;utm_medium=footerad&#x26;amp;utm_term=2018&#x26;amp;utm_content=Self_Service&#x26;amp;utm_campaign=Buildmaster_Footer&#x22;&#x3E;Explore how!&#x3C;/a&#x3E;&#x3C;/div&#x3E;&#x3C;div style=&#x22;clear: left;&#x22;&#x3E;&#x3C;/div&#x3E;&#x3C;/div&#x3E;</description>
<category>CodeSOD</category>
<guid isPermaLink="true">https://thedailywtf.com/articles/death-of-the-auth-er</guid>
<pubDate>Tue, 03 Nov 2026 06:30:00 GMT</pubDate>
<content:encoded>&#x3C;div&#x3E;&#x3C;p&#x3E;When writing Perl, it&#x27;s not unusual to want to &#x3C;code&#x3E;die&#x3C;/code&#x3E;. The &#x3C;code&#x3E;die&#x3C;/code&#x3E; function ends your Perl program with an error string, and you&#x27;ll often see code like: &#x3C;code&#x3E;die &#x22;My error&#x22; unless $i &#x26;gt; 5&#x3C;/code&#x3E; or &#x3C;code&#x3E;die &#x22;Other error&#x22; if check()&#x3C;/code&#x3E;, because Perl just loves the backwards conditionals. What&#x27;s even more fun with &#x3C;code&#x3E;die&#x3C;/code&#x3E; is &#x3C;a href=&#x22;https://perldoc.perl.org/functions/die&#x22;&#x3E;how it behaves with &#x3C;code&#x3E;eval&#x3C;/code&#x3E; blocks&#x3C;/a&#x3E;, so it doesn&#x27;t always kill your program, sometimes it is how you pass error strings back out of sections of your program.&#x3C;/p&#x3E;&#x3C;p&#x3E;And poor &#x3C;strong&#x3E;Bobby&#x3C;/strong&#x3E; has inherited some Perl that just really loves to &#x3C;code&#x3E;die&#x3C;/code&#x3E;.&#x3C;/p&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;language-perl&#x22;&#x3E;public function store()
{
    echo &#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x27;Hello&#x27;&#x3C;/span&#x3E;; &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;die&#x3C;/span&#x3E;;
    &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;if&#x3C;/span&#x3E; (Auth::attempt(Input::only(&#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x27;email&#x27;&#x3C;/span&#x3E;, &#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x27;password&#x27;&#x3C;/span&#x3E;)))
    {
        echo &#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x27;done&#x27;&#x3C;/span&#x3E;; &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;die&#x3C;/span&#x3E;;
        &#x3C;span class=&#x22;hljs-regexp&#x22;&#x3E;//&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;return&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x22;welcome &#x22;&#x3C;/span&#x3E;.Auth::user()-&#x26;gt;username
    }
    echo &#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x22;Oops! Fails&#x22;&#x3C;/span&#x3E;; &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;die&#x3C;/span&#x3E;;
    &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;return&#x3C;/span&#x3E; Redirect::back()-&#x26;gt;with_input();
}
&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;p&#x3E;Bobby didn&#x27;t send the source control history here, but I have a sense of what it likely was like, once. If they authenticate successfully, print a welcome message. If they don&#x27;t, redirect back to the logon page and let them try again. I suspect they wanted to disable the route. So first they disabled the success path, only to discover that the failure path kept redirecting, so they disabled that too. Finally, they added the &#x3C;code&#x3E;Hello&#x3C;/code&#x3E; at the top to disable the whole thing.&#x3C;/p&#x3E;&#x3C;p&#x3E;Why? Why did they do any of this? No idea. It &#x3C;em&#x3E;feels&#x3C;/em&#x3E; like debugging code, but you&#x27;d expect more &#x3C;code&#x3E;echo&#x3C;/code&#x3E;s and fewer &#x3C;code&#x3E;die&#x3C;/code&#x3E;s if that were the case. And you wouldn&#x27;t expect it to leak into production and sit there for years, which is what happened here.&#x3C;/p&#x3E;&#x3C;span style=&#x22;font-weight: bold; font-size: smaller; font-style: italic&#x22;&#x3E; Easy Reader Version: My favorite thing about Perl is that when they finally tried to make the syntax make sense, it pissed people off so badly they had to name the result as a new language, because they couldn&#x27;t call in Perl without Perl programmers rioting. &#x3C;/span&#x3E;&#x3C;style&#x3E;.comment { border: none; }&#x3C;/style&#x3E;&#x3C;div&#x3E;&#x3C;img src=&#x22;https://thedailywtf.com/images/inedo/buildmaster-icon.png&#x22; style=&#x22;display:block; float: left; margin: 0 10px 10px 0;&#x22; /&#x3E; [Advertisement] &#x3C;a href=&#x22;https://inedo.com/BuildMaster?utm_source=tdwtf&#x26;amp;utm_medium=footerad&#x26;amp;utm_term=2018&#x26;amp;utm_content=Self_Service&#x26;amp;utm_campaign=Buildmaster_Footer&#x22;&#x3E;BuildMaster&#x3C;/a&#x3E; allows you to create a self-service release management platform that allows different teams to manage their applications. &#x3C;a href=&#x22;https://inedo.com/BuildMaster/download?utm_source=tdwtf&#x26;amp;utm_medium=footerad&#x26;amp;utm_term=2018&#x26;amp;utm_content=Self_Service&#x26;amp;utm_campaign=Buildmaster_Footer&#x22;&#x3E;Explore how!&#x3C;/a&#x3E;&#x3C;/div&#x3E;&#x3C;div style=&#x22;clear: left;&#x22;&#x3E;&#x3C;/div&#x3E;&#x3C;/div&#x3E;</content:encoded>
</item>
<item>
<title>CodeSOD: Get It Now</title>
<link>https://thedailywtf.com/articles/get-it-now</link>
<description>&#x3C;div&#x3E;&#x3C;p&#x3E;&#x22;TODO&#x22; comments are an inescapable part of our work. Yes, yes, you &#x3C;em&#x3E;should&#x3C;/em&#x3E; just do it right the first time, everything should probably have a ticket in whatever your ticket system is for visibility, but at some point, you&#x27;re just going to leave a &#x22;TODO&#x22; behind.&#x3C;/p&#x3E;&#x3C;p&#x3E;But hopefully, the TODO gets TODONE, which is not what happened in &#x3C;strong&#x3E;Sam C&#x3C;/strong&#x3E;&#x27;s codebase.&#x3C;/p&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;language-php&#x22;&#x3E;&#x3C;span class=&#x22;hljs-function&#x22;&#x3E;&#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;function&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-title&#x22;&#x3E;getnow&#x3C;/span&#x3E;(&#x3C;span class=&#x22;hljs-params&#x22;&#x3E;&#x3C;/span&#x3E;)
&#x3C;/span&#x3E;{
    &#x3C;span class=&#x22;hljs-comment&#x22;&#x3E;//TODO&#x3C;/span&#x3E;
    &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;return&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x27;2012&#x27;&#x3C;/span&#x3E;;
}
&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;p&#x3E;It&#x27;s the &#x3C;a href=&#x22;https://xkcd.com/221/&#x22;&#x3E;XKCD&#x3C;/a&#x3E;, but for years. Or &#x3C;a href=&#x22;https://knowyourmeme.com/memes/what-year-is-it&#x22;&#x3E;WHAT YEAR IS IN&#x3C;/a&#x3E; memes.&#x3C;/p&#x3E;&#x3C;p&#x3E;At least it&#x27;s a relatively recent year, not some far off point from over a decade ago.&#x3C;/p&#x3E;&#x3C;p&#x3E;Wait. 2012 was &#x3C;em&#x3E;how&#x3C;/em&#x3E; long ago? That can&#x27;t be right. It was just a few years ago!&#x3C;/p&#x3E;&#x3C;span style=&#x22;font-weight: bold; font-size: smaller; font-style: italic&#x22;&#x3E; Easy Reader Version: The linear passage of time is a crime &#x3C;/span&#x3E;&#x3C;div&#x3E; [Advertisement] &#x3C;b&#x3E;Plan Your .NET 9 Migration with Confidence&#x3C;/b&#x3E;&#x3C;br /&#x3E;Your journey to .NET 9 is more than just one decision.Avoid migration migraines with the advice in this free guide. &#x3C;b&#x3E;&#x3C;a href=&#x22;https://inedo.com/support/whitepapers/dotnet-guide?utm_campaign=dotnet&#x26;amp;utm_source=tdwtf-footer&#x22;&#x3E;Download Free Guide Now!&#x3C;/a&#x3E;&#x3C;/b&#x3E;&#x3C;/div&#x3E;&#x3C;div style=&#x22;clear: left;&#x22;&#x3E;&#x3C;/div&#x3E;&#x3C;/div&#x3E;</description>
<category>CodeSOD</category>
<guid isPermaLink="true">https://thedailywtf.com/articles/get-it-now</guid>
<pubDate>Mon, 02 Nov 2026 06:30:00 GMT</pubDate>
<content:encoded>&#x3C;div&#x3E;&#x3C;p&#x3E;&#x22;TODO&#x22; comments are an inescapable part of our work. Yes, yes, you &#x3C;em&#x3E;should&#x3C;/em&#x3E; just do it right the first time, everything should probably have a ticket in whatever your ticket system is for visibility, but at some point, you&#x27;re just going to leave a &#x22;TODO&#x22; behind.&#x3C;/p&#x3E;&#x3C;p&#x3E;But hopefully, the TODO gets TODONE, which is not what happened in &#x3C;strong&#x3E;Sam C&#x3C;/strong&#x3E;&#x27;s codebase.&#x3C;/p&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;language-php&#x22;&#x3E;&#x3C;span class=&#x22;hljs-function&#x22;&#x3E;&#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;function&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-title&#x22;&#x3E;getnow&#x3C;/span&#x3E;(&#x3C;span class=&#x22;hljs-params&#x22;&#x3E;&#x3C;/span&#x3E;)
&#x3C;/span&#x3E;{
    &#x3C;span class=&#x22;hljs-comment&#x22;&#x3E;//TODO&#x3C;/span&#x3E;
    &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;return&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x27;2012&#x27;&#x3C;/span&#x3E;;
}
&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;p&#x3E;It&#x27;s the &#x3C;a href=&#x22;https://xkcd.com/221/&#x22;&#x3E;XKCD&#x3C;/a&#x3E;, but for years. Or &#x3C;a href=&#x22;https://knowyourmeme.com/memes/what-year-is-it&#x22;&#x3E;WHAT YEAR IS IN&#x3C;/a&#x3E; memes.&#x3C;/p&#x3E;&#x3C;p&#x3E;At least it&#x27;s a relatively recent year, not some far off point from over a decade ago.&#x3C;/p&#x3E;&#x3C;p&#x3E;Wait. 2012 was &#x3C;em&#x3E;how&#x3C;/em&#x3E; long ago? That can&#x27;t be right. It was just a few years ago!&#x3C;/p&#x3E;&#x3C;span style=&#x22;font-weight: bold; font-size: smaller; font-style: italic&#x22;&#x3E; Easy Reader Version: The linear passage of time is a crime &#x3C;/span&#x3E;&#x3C;div&#x3E; [Advertisement] &#x3C;b&#x3E;Plan Your .NET 9 Migration with Confidence&#x3C;/b&#x3E;&#x3C;br /&#x3E;Your journey to .NET 9 is more than just one decision.Avoid migration migraines with the advice in this free guide. &#x3C;b&#x3E;&#x3C;a href=&#x22;https://inedo.com/support/whitepapers/dotnet-guide?utm_campaign=dotnet&#x26;amp;utm_source=tdwtf-footer&#x22;&#x3E;Download Free Guide Now!&#x3C;/a&#x3E;&#x3C;/b&#x3E;&#x3C;/div&#x3E;&#x3C;div style=&#x22;clear: left;&#x22;&#x3E;&#x3C;/div&#x3E;&#x3C;/div&#x3E;</content:encoded>
</item>
<item>
<title>CodeSOD: Oh, K?</title>
<link>https://thedailywtf.com/articles/oh-k</link>
<description>&#x3C;div&#x3E;&#x3C;p&#x3E;&#x3C;strong&#x3E;Pierre&#x3C;/strong&#x3E; found this cry for help:&#x3C;/p&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;language-c&#x22;&#x3E; &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;for&#x3C;/span&#x3E; (j = &#x3C;span class=&#x22;hljs-number&#x22;&#x3E;0&#x3C;/span&#x3E;; j &#x26;lt; DISTRICT_CARDINALITY; j++) {
    &#x3C;span class=&#x22;hljs-comment&#x22;&#x3E;/*
    * A poor way to work around some sort of memory
    * violation.  k gets clobbered, so I buffer l with it.
    * Help?
    */&#x3C;/span&#x3E;
    &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;for&#x3C;/span&#x3E; (k = &#x3C;span class=&#x22;hljs-number&#x22;&#x3E;0&#x3C;/span&#x3E;, l = &#x3C;span class=&#x22;hljs-number&#x22;&#x3E;0&#x3C;/span&#x3E;; k &#x26;lt; customers; k++, l++) {
            &#x3C;span class=&#x22;hljs-comment&#x22;&#x3E;/* c_id */&#x3C;/span&#x3E;
            FPRINTF(output, &#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x22;%d&#x22;&#x3C;/span&#x3E;, l + &#x3C;span class=&#x22;hljs-number&#x22;&#x3E;1&#x3C;/span&#x3E;);
            METAPRINTF((output, &#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x22;%c&#x22;&#x3C;/span&#x3E;, delimiter));
&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;p&#x3E;Honestly, I&#x27;m always a little worried in C-like languages when the loop variable isn&#x27;t scoped to the loop and declared in place. Always concerning, so when there&#x27;s concerns with clobbering, I&#x27;m not surprised.&#x3C;/p&#x3E;&#x3C;p&#x3E;This iterates across a set of &#x22;districts&#x22;, and then iterates across a list of customers. Standard output functions are replaced with macros, and honestly, I don&#x27;t know that I want to know what happens in &#x3C;code&#x3E;METAPRINTF&#x3C;/code&#x3E;.&#x3C;/p&#x3E;&#x3C;p&#x3E;But fine, this iterates across a bunch of stuff and generates output. It&#x27;s the comment that we&#x27;re really curious about. &#x22;Some sort of memory violation&#x22;, so we duplicate our loop variable. What on earth could be happening here?&#x3C;/p&#x3E;&#x3C;p&#x3E;Well, Pierre found the &#x22;memory violation&#x22;, which is probably what you expected:&#x3C;/p&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;language-c&#x22;&#x3E;k = &#x3C;span class=&#x22;hljs-built_in&#x22;&#x3E;strlen&#x3C;/span&#x3E;(someOutputString) - &#x3C;span class=&#x22;hljs-number&#x22;&#x3E;8&#x3C;/span&#x3E;;
&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;p&#x3E;&#x3C;code&#x3E;k&#x3C;/code&#x3E; is used elsewhere in the loop as a variable. That&#x27;s not a memory violation, that&#x27;s just how variables work.&#x3C;/p&#x3E;&#x3C;p&#x3E;This leaves us with one possible conclusion: the developer who wrote the comment couldn&#x27;t find this bug. And given the weird use of macros here, I&#x27;m going to go out on a limb and guess that it&#x27;s not the developer&#x27;s fault; I strongly suspect the loop is so long, so complicated, and so obfuscated that very few developers could find that.&#x3C;/p&#x3E;&#x3C;p&#x3E;My earlier complaint about scoping the variable to the loop wouldn&#x27;t fix this, which I guess is on me. They still should really scope the variable to the loop.&#x3C;/p&#x3E;&#x3C;span style=&#x22;font-weight: bold; font-size: smaller; font-style: italic&#x22;&#x3E; Easy Reader Version: Don&#x27;t get me started on languages that do variable hoisting and lift variables to the top of the function no matter where you declare them. &#x3C;/span&#x3E;&#x3C;style&#x3E;.comment { border: none; }&#x3C;/style&#x3E;&#x3C;div&#x3E;&#x3C;img src=&#x22;https://thedailywtf.com/images/inedo/proget-icon.png&#x22; style=&#x22;display:block; float: left; margin: 0 10px 10px 0;&#x22; /&#x3E; [Advertisement] Keep all your packages and Docker containers in one place, scan for vulnerabilities, and control who can access different feeds. ProGet installs in minutes and has a powerful free version with a lot of great features that you can upgrade when ready.&#x3C;a href=&#x22;https://inedo.com/proget?utm_source=tdwtf&#x26;amp;utm_medium=footer&#x26;amp;utm_content=PlebsFooter&#x22;&#x3E;Learn more.&#x3C;/a&#x3E;&#x3C;/div&#x3E;&#x3C;div style=&#x22;clear: left;&#x22;&#x3E;&#x3C;/div&#x3E;&#x3C;/div&#x3E;</description>
<category>CodeSOD</category>
<guid isPermaLink="true">https://thedailywtf.com/articles/oh-k</guid>
<pubDate>Thu, 29 Oct 2026 06:30:00 GMT</pubDate>
<content:encoded>&#x3C;div&#x3E;&#x3C;p&#x3E;&#x3C;strong&#x3E;Pierre&#x3C;/strong&#x3E; found this cry for help:&#x3C;/p&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;language-c&#x22;&#x3E; &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;for&#x3C;/span&#x3E; (j = &#x3C;span class=&#x22;hljs-number&#x22;&#x3E;0&#x3C;/span&#x3E;; j &#x26;lt; DISTRICT_CARDINALITY; j++) {
    &#x3C;span class=&#x22;hljs-comment&#x22;&#x3E;/*
    * A poor way to work around some sort of memory
    * violation.  k gets clobbered, so I buffer l with it.
    * Help?
    */&#x3C;/span&#x3E;
    &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;for&#x3C;/span&#x3E; (k = &#x3C;span class=&#x22;hljs-number&#x22;&#x3E;0&#x3C;/span&#x3E;, l = &#x3C;span class=&#x22;hljs-number&#x22;&#x3E;0&#x3C;/span&#x3E;; k &#x26;lt; customers; k++, l++) {
            &#x3C;span class=&#x22;hljs-comment&#x22;&#x3E;/* c_id */&#x3C;/span&#x3E;
            FPRINTF(output, &#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x22;%d&#x22;&#x3C;/span&#x3E;, l + &#x3C;span class=&#x22;hljs-number&#x22;&#x3E;1&#x3C;/span&#x3E;);
            METAPRINTF((output, &#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x22;%c&#x22;&#x3C;/span&#x3E;, delimiter));
&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;p&#x3E;Honestly, I&#x27;m always a little worried in C-like languages when the loop variable isn&#x27;t scoped to the loop and declared in place. Always concerning, so when there&#x27;s concerns with clobbering, I&#x27;m not surprised.&#x3C;/p&#x3E;&#x3C;p&#x3E;This iterates across a set of &#x22;districts&#x22;, and then iterates across a list of customers. Standard output functions are replaced with macros, and honestly, I don&#x27;t know that I want to know what happens in &#x3C;code&#x3E;METAPRINTF&#x3C;/code&#x3E;.&#x3C;/p&#x3E;&#x3C;p&#x3E;But fine, this iterates across a bunch of stuff and generates output. It&#x27;s the comment that we&#x27;re really curious about. &#x22;Some sort of memory violation&#x22;, so we duplicate our loop variable. What on earth could be happening here?&#x3C;/p&#x3E;&#x3C;p&#x3E;Well, Pierre found the &#x22;memory violation&#x22;, which is probably what you expected:&#x3C;/p&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;language-c&#x22;&#x3E;k = &#x3C;span class=&#x22;hljs-built_in&#x22;&#x3E;strlen&#x3C;/span&#x3E;(someOutputString) - &#x3C;span class=&#x22;hljs-number&#x22;&#x3E;8&#x3C;/span&#x3E;;
&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;p&#x3E;&#x3C;code&#x3E;k&#x3C;/code&#x3E; is used elsewhere in the loop as a variable. That&#x27;s not a memory violation, that&#x27;s just how variables work.&#x3C;/p&#x3E;&#x3C;p&#x3E;This leaves us with one possible conclusion: the developer who wrote the comment couldn&#x27;t find this bug. And given the weird use of macros here, I&#x27;m going to go out on a limb and guess that it&#x27;s not the developer&#x27;s fault; I strongly suspect the loop is so long, so complicated, and so obfuscated that very few developers could find that.&#x3C;/p&#x3E;&#x3C;p&#x3E;My earlier complaint about scoping the variable to the loop wouldn&#x27;t fix this, which I guess is on me. They still should really scope the variable to the loop.&#x3C;/p&#x3E;&#x3C;span style=&#x22;font-weight: bold; font-size: smaller; font-style: italic&#x22;&#x3E; Easy Reader Version: Don&#x27;t get me started on languages that do variable hoisting and lift variables to the top of the function no matter where you declare them. &#x3C;/span&#x3E;&#x3C;style&#x3E;.comment { border: none; }&#x3C;/style&#x3E;&#x3C;div&#x3E;&#x3C;img src=&#x22;https://thedailywtf.com/images/inedo/proget-icon.png&#x22; style=&#x22;display:block; float: left; margin: 0 10px 10px 0;&#x22; /&#x3E; [Advertisement] Keep all your packages and Docker containers in one place, scan for vulnerabilities, and control who can access different feeds. ProGet installs in minutes and has a powerful free version with a lot of great features that you can upgrade when ready.&#x3C;a href=&#x22;https://inedo.com/proget?utm_source=tdwtf&#x26;amp;utm_medium=footer&#x26;amp;utm_content=PlebsFooter&#x22;&#x3E;Learn more.&#x3C;/a&#x3E;&#x3C;/div&#x3E;&#x3C;div style=&#x22;clear: left;&#x22;&#x3E;&#x3C;/div&#x3E;&#x3C;/div&#x3E;</content:encoded>
</item>
<item>
<title>CodeSOD: Session Recording</title>
<link>https://thedailywtf.com/articles/session-recording</link>
<description>&#x3C;div&#x3E;&#x3C;p&#x3E;We still get a fair bit of old school ASP .Net webforms code, which was cutting edge about twenty years ago, but remains a collection of bad choices that tried to make web programming feel like desktop programming. As an aside, what a reversed world we live in today, where everyone uses Electron and our desktop programming feels like web programming.&#x3C;/p&#x3E;&#x3C;p&#x3E;In any case, &#x3C;strong&#x3E;Thomas&#x3C;/strong&#x3E; sends us some pretty ugly webforms code.&#x3C;/p&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;language-vbscript&#x22;&#x3E;&#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;Me&#x3C;/span&#x3E;.Session(&#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x22;Albumid&#x22;&#x3C;/span&#x3E;) = CType(e.Item.FindControl(&#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x22;lblAlbumID&#x22;&#x3C;/span&#x3E;), Label).Text
&#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;If&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;Not&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;Me&#x3C;/span&#x3E;.Session(&#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x22;Albumid&#x22;&#x3C;/span&#x3E;) &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;Is&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-literal&#x22;&#x3E;Nothing&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;And&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;Not&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;Me&#x3C;/span&#x3E;.Session(&#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x22;Uid&#x22;&#x3C;/span&#x3E;) &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;Is&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-literal&#x22;&#x3E;Nothing&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;Then&#x3C;/span&#x3E;

    &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;Me&#x3C;/span&#x3E;.strDelSQL = &#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x22;Delete from tbl_Albumshare_Mast where Album_Id=&#x22;&#x3C;/span&#x3E; &#x26;amp; &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;Me&#x3C;/span&#x3E;.Session(&#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x22;Albumid&#x22;&#x3C;/span&#x3E;) &#x26;amp; &#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x22; and Sharer_ID=&#x22;&#x3C;/span&#x3E; &#x26;amp; &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;Me&#x3C;/span&#x3E;.Session(&#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x22;Uid&#x22;&#x3C;/span&#x3E;)
    &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;Me&#x3C;/span&#x3E;.objDB.ExecQry(&#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;Me&#x3C;/span&#x3E;.strDelSQL)
    &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;Me&#x3C;/span&#x3E;.&#x3C;span class=&#x22;hljs-built_in&#x22;&#x3E;Response&#x3C;/span&#x3E;.Redirect(&#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x22;frmmyalbumshare.aspx&#x22;&#x3C;/span&#x3E;, &#x3C;span class=&#x22;hljs-literal&#x22;&#x3E;False&#x3C;/span&#x3E;)

&#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;End&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;If&#x3C;/span&#x3E;
&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;p&#x3E;Broadly, the goal of this code is to take an album ID from the user and delete an album from the database where the ID matches and the album is owned by this user. And everything is horrible here.&#x3C;/p&#x3E;&#x3C;p&#x3E;First, the use of &#x3C;code&#x3E;e.Item.FindControl&#x3C;/code&#x3E; to look up the input field is suspicious. That&#x27;s usually what you do when you&#x27;ve dynamically generated controls, but I don&#x27;t think that&#x27;s happening here. Because we use &#x3C;code&#x3E;FindControl&#x3C;/code&#x3E; we have to cast it to &#x3C;code&#x3E;Label&#x3C;/code&#x3E;, and only then can we get the text property. That itself raises a question, because &#x3C;em&#x3E;why are user inputs getting stored in a label?&#x3C;/em&#x3E;. That&#x27;s not what labels are for. They&#x27;re clearly doing some sort of hacky lookup/autocomplete field thing and using the label to actually store the input, but presenting the user with a different UI for picking it. Not an uncommon pattern in those days, but a hidden field would be a more typical way of doing it.&#x3C;/p&#x3E;&#x3C;p&#x3E;We then construct a SQL injection vulnerability and run it against the database.&#x3C;/p&#x3E;&#x3C;p&#x3E;Then, we use a redirect to send the user to a different page. Again, a common thing to do back then, but a thing I hate: using HTTP 300 codes to redirect users as a form of navigation is awkward and weird.&#x3C;/p&#x3E;&#x3C;p&#x3E;Of course, none of that is precisely the WTF here. The real WTF is the developer apparently &#x3C;em&#x3E;hates&#x3C;/em&#x3E; local variables. &#x3C;code&#x3E;strDelSQL&#x3C;/code&#x3E; is a member variable- why do we need to store this in a class member? Especially because in the page lifecycle, we handle one request and then die; either this is unnecessary, or far, far worse, some other code is looking at this SQL query later. But far worse than a badly scoped variable is the overuse of session variables.&#x3C;/p&#x3E;&#x3C;p&#x3E;Thomas sends us this block as a representation, but the developer responsible just stored &#x3C;em&#x3E;everything&#x3C;/em&#x3E; they could in a session variable. While in this example, &#x22;Uid&#x22; probably makes sense, &#x22;Albumid&#x22; definitely doesn&#x27;t. And in other cases, basically every user form input gets stored in a session variable, and even worse: &#x3C;em&#x3E;they&#x27;re often used as loop variables&#x3C;/em&#x3E;. &#x3C;code&#x3E;while Session(&#x22;myloop&#x22;) &#x26;lt; 5&#x3C;/code&#x3E; type stuff.&#x3C;/p&#x3E;&#x3C;p&#x3E;And finally, we already know I hate hungarian notation, but here we have a client side form holdover that pollutes the user experience: the URL they get redirected to has a hungarian &#x3C;code&#x3E;frm&#x3C;/code&#x3E; prefix. It&#x27;s bad enough that you&#x27;re using hungarian notation, but don&#x27;t show that to your users! They really don&#x27;t need to see everything.&#x3C;/p&#x3E;&#x3C;span style=&#x22;font-weight: bold; font-size: smaller; font-style: italic&#x22;&#x3E; Easy Reader Version: Webforms were a mistake, but an *interesting* mistake, and a weird historical time capsule. &#x3C;/span&#x3E;&#x3C;div&#x3E;&#x3C;img src=&#x22;https://thedailywtf.com/images/inedo/proget-icon.png&#x22; style=&#x22;display:block; float: left; margin: 0 10px 10px 0;&#x22; /&#x3E; [Advertisement] Keep the plebs out of prod. Restrict NuGet feed privileges with ProGet. &#x3C;a href=&#x22;https://inedo.com/proget/private-nuget-server?utm_source=tdwtf&#x26;amp;utm_medium=footer&#x26;amp;utm_content=PlebsFooter&#x26;amp;utm_campaign=Cyclops2020&#x22;&#x3E;Learn more.&#x3C;/a&#x3E;&#x3C;/div&#x3E;&#x3C;div style=&#x22;clear: left;&#x22;&#x3E;&#x3C;/div&#x3E;&#x3C;/div&#x3E;</description>
<category>CodeSOD</category>
<guid isPermaLink="true">https://thedailywtf.com/articles/session-recording</guid>
<pubDate>Wed, 28 Oct 2026 06:30:00 GMT</pubDate>
<content:encoded>&#x3C;div&#x3E;&#x3C;p&#x3E;We still get a fair bit of old school ASP .Net webforms code, which was cutting edge about twenty years ago, but remains a collection of bad choices that tried to make web programming feel like desktop programming. As an aside, what a reversed world we live in today, where everyone uses Electron and our desktop programming feels like web programming.&#x3C;/p&#x3E;&#x3C;p&#x3E;In any case, &#x3C;strong&#x3E;Thomas&#x3C;/strong&#x3E; sends us some pretty ugly webforms code.&#x3C;/p&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;language-vbscript&#x22;&#x3E;&#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;Me&#x3C;/span&#x3E;.Session(&#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x22;Albumid&#x22;&#x3C;/span&#x3E;) = CType(e.Item.FindControl(&#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x22;lblAlbumID&#x22;&#x3C;/span&#x3E;), Label).Text
&#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;If&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;Not&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;Me&#x3C;/span&#x3E;.Session(&#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x22;Albumid&#x22;&#x3C;/span&#x3E;) &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;Is&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-literal&#x22;&#x3E;Nothing&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;And&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;Not&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;Me&#x3C;/span&#x3E;.Session(&#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x22;Uid&#x22;&#x3C;/span&#x3E;) &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;Is&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-literal&#x22;&#x3E;Nothing&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;Then&#x3C;/span&#x3E;

    &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;Me&#x3C;/span&#x3E;.strDelSQL = &#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x22;Delete from tbl_Albumshare_Mast where Album_Id=&#x22;&#x3C;/span&#x3E; &#x26;amp; &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;Me&#x3C;/span&#x3E;.Session(&#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x22;Albumid&#x22;&#x3C;/span&#x3E;) &#x26;amp; &#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x22; and Sharer_ID=&#x22;&#x3C;/span&#x3E; &#x26;amp; &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;Me&#x3C;/span&#x3E;.Session(&#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x22;Uid&#x22;&#x3C;/span&#x3E;)
    &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;Me&#x3C;/span&#x3E;.objDB.ExecQry(&#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;Me&#x3C;/span&#x3E;.strDelSQL)
    &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;Me&#x3C;/span&#x3E;.&#x3C;span class=&#x22;hljs-built_in&#x22;&#x3E;Response&#x3C;/span&#x3E;.Redirect(&#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x22;frmmyalbumshare.aspx&#x22;&#x3C;/span&#x3E;, &#x3C;span class=&#x22;hljs-literal&#x22;&#x3E;False&#x3C;/span&#x3E;)

&#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;End&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;If&#x3C;/span&#x3E;
&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;p&#x3E;Broadly, the goal of this code is to take an album ID from the user and delete an album from the database where the ID matches and the album is owned by this user. And everything is horrible here.&#x3C;/p&#x3E;&#x3C;p&#x3E;First, the use of &#x3C;code&#x3E;e.Item.FindControl&#x3C;/code&#x3E; to look up the input field is suspicious. That&#x27;s usually what you do when you&#x27;ve dynamically generated controls, but I don&#x27;t think that&#x27;s happening here. Because we use &#x3C;code&#x3E;FindControl&#x3C;/code&#x3E; we have to cast it to &#x3C;code&#x3E;Label&#x3C;/code&#x3E;, and only then can we get the text property. That itself raises a question, because &#x3C;em&#x3E;why are user inputs getting stored in a label?&#x3C;/em&#x3E;. That&#x27;s not what labels are for. They&#x27;re clearly doing some sort of hacky lookup/autocomplete field thing and using the label to actually store the input, but presenting the user with a different UI for picking it. Not an uncommon pattern in those days, but a hidden field would be a more typical way of doing it.&#x3C;/p&#x3E;&#x3C;p&#x3E;We then construct a SQL injection vulnerability and run it against the database.&#x3C;/p&#x3E;&#x3C;p&#x3E;Then, we use a redirect to send the user to a different page. Again, a common thing to do back then, but a thing I hate: using HTTP 300 codes to redirect users as a form of navigation is awkward and weird.&#x3C;/p&#x3E;&#x3C;p&#x3E;Of course, none of that is precisely the WTF here. The real WTF is the developer apparently &#x3C;em&#x3E;hates&#x3C;/em&#x3E; local variables. &#x3C;code&#x3E;strDelSQL&#x3C;/code&#x3E; is a member variable- why do we need to store this in a class member? Especially because in the page lifecycle, we handle one request and then die; either this is unnecessary, or far, far worse, some other code is looking at this SQL query later. But far worse than a badly scoped variable is the overuse of session variables.&#x3C;/p&#x3E;&#x3C;p&#x3E;Thomas sends us this block as a representation, but the developer responsible just stored &#x3C;em&#x3E;everything&#x3C;/em&#x3E; they could in a session variable. While in this example, &#x22;Uid&#x22; probably makes sense, &#x22;Albumid&#x22; definitely doesn&#x27;t. And in other cases, basically every user form input gets stored in a session variable, and even worse: &#x3C;em&#x3E;they&#x27;re often used as loop variables&#x3C;/em&#x3E;. &#x3C;code&#x3E;while Session(&#x22;myloop&#x22;) &#x26;lt; 5&#x3C;/code&#x3E; type stuff.&#x3C;/p&#x3E;&#x3C;p&#x3E;And finally, we already know I hate hungarian notation, but here we have a client side form holdover that pollutes the user experience: the URL they get redirected to has a hungarian &#x3C;code&#x3E;frm&#x3C;/code&#x3E; prefix. It&#x27;s bad enough that you&#x27;re using hungarian notation, but don&#x27;t show that to your users! They really don&#x27;t need to see everything.&#x3C;/p&#x3E;&#x3C;span style=&#x22;font-weight: bold; font-size: smaller; font-style: italic&#x22;&#x3E; Easy Reader Version: Webforms were a mistake, but an *interesting* mistake, and a weird historical time capsule. &#x3C;/span&#x3E;&#x3C;div&#x3E;&#x3C;img src=&#x22;https://thedailywtf.com/images/inedo/proget-icon.png&#x22; style=&#x22;display:block; float: left; margin: 0 10px 10px 0;&#x22; /&#x3E; [Advertisement] Keep the plebs out of prod. Restrict NuGet feed privileges with ProGet. &#x3C;a href=&#x22;https://inedo.com/proget/private-nuget-server?utm_source=tdwtf&#x26;amp;utm_medium=footer&#x26;amp;utm_content=PlebsFooter&#x26;amp;utm_campaign=Cyclops2020&#x22;&#x3E;Learn more.&#x3C;/a&#x3E;&#x3C;/div&#x3E;&#x3C;div style=&#x22;clear: left;&#x22;&#x3E;&#x3C;/div&#x3E;&#x3C;/div&#x3E;</content:encoded>
</item>
<item>
<title>News Roundup: Security Fourth</title>
<link>https://thedailywtf.com/articles/security-fourth</link>
<description>&#x3C;div&#x3E;&#x3C;p&#x3E;A bit ago, I broke with my usual pattern and &#x3C;a href=&#x22;https://thedailywtf.com/articles/the-frist-line-of-defense&#x22;&#x3E;wrote up some security issues&#x3C;/a&#x3E; that I felt were particularly funny. It was a change of pace, a &#x3C;em&#x3E;different&#x3C;/em&#x3E; thing, but not a thing that&#x27;d become a habit. After all, I&#x27;m not a security expert, this isn&#x27;t a security site, and seriously, what are the odds that suitably funny security issues would crop up again less than a week later?&#x3C;/p&#x3E;&#x3C;p&#x3E;Well.&#x3C;/p&#x3E;&#x3C;p&#x3E;Let&#x27;s start with the actual serious issue, &#x3C;a href=&#x22;https://www.huntress.com/blog/php2shell-leaked-critical-php-vulnerabilities&#x22;&#x3E;PHP2Shell&#x3C;/a&#x3E;. In terms of scope, every version of PHP for the past twenty years has had this bug. The general issue that permits the exploit was &#x3C;a href=&#x22;https://calif.io/php2shell/#an-interesting-timeline-of-events&#x22;&#x3E;known about&#x3C;/a&#x3E;, but wasn&#x27;t considered exploitable.&#x3C;/p&#x3E;&#x3C;p&#x3E;Oops.&#x3C;/p&#x3E;&#x3C;p&#x3E;The broad strokes of the bug is that it&#x27;s two separate bugs. The first allows someone to bypass the checks on a request&#x27;s size, thus giving them a direct route to triggering an out-of-memory error. The second is that, depending where you are in the processing pipeline, PHP doesn&#x27;t properly handle cleanup, allowing for use-after-free that can trigger code execution. It doesn&#x27;t matter what code you&#x27;ve written, this all happens before the request even hits your code.&#x3C;/p&#x3E;&#x3C;p&#x3E;Bigger oops.&#x3C;/p&#x3E;&#x3C;p&#x3E;This bug was found via LLM tools, which has lead to a lot of hype around the idea that we&#x27;ve &#x3C;a href=&#x22;https://www.wiz.io/blog/php2shell-php-rce#the-ai-inflection-point-26&#x22;&#x3E;entered some new era&#x3C;/a&#x3E;. I&#x27;ll certainly grant that the ability to throw compute at hacking challenges instead of human effort is going to shift the landscape, but I&#x27;m not quite willing to buy the apocalyptic prophecies. Especially when some of those prophets are telling us that their AIs will avoid deletion by &#x3C;a href=&#x22;https://www.cnbc.com/2026/10/13/anthropic-ai-models-self-replication-smart-devices.html&#x22;&#x3E;copying themselves onto your thermostat&#x3C;/a&#x3E;. I think it&#x27;s safe to say we&#x27;re going to see a lot of security incidents coming out of LLMs in the near future, not because they&#x27;re magic genius hackers, but because they&#x27;re pretty good at processing structured text and running tests.&#x3C;/p&#x3E;&#x3C;p&#x3E;For those of us living in the real world, the concern isn&#x27;t AIs, but HIs: human intelligences. In this case, the exploit was discovered back in August. Security researchers and the PHP Foundation put their heads down to work on it, and where necessary, notified so-called &#x22;critical infrastructure providers&#x22; to ensure that everyone was ready to address the issue. The problem there is that two people can keep a secret if one of them is dead, and a lot more than two people got roped in to deal with this.&#x3C;/p&#x3E;&#x3C;p&#x3E;Rumors were circulating in security circles. And cybersecurity firm &#x3C;a href=&#x22;https://www.computerweekly.com/news/366652674/Botched-PHP2Shell-disclosure-revealed-as-panic-continues&#x22;&#x3E;Chainguard&#x3C;/a&#x3E; decided this was good enough excuse to break the embargo and announce the flaw &#x3C;em&#x3E;before&#x3C;/em&#x3E; patches were available. No patches for a &#x3C;em&#x3E;flaw that impacts 20 years worth of software versions&#x3C;/em&#x3E; of widely deployed software.&#x3C;/p&#x3E;&#x3C;p&#x3E;Patches are out now, though only for versions 8.2 and up. Source patches are out back to 7.4, which is officially end-of-life, but I have to wonder how many official EOLed copies of PHP are out there.&#x3C;/p&#x3E;&#x3C;p&#x3E;On a lighter note, we can&#x27;t let the hijinks of eMudhra pass without comment. eMudhra is, among other things, a root certificate authority. They&#x27;ve got a bunch of key pairs that they use to sign certificates for other customers, thus vouching for those customers&#x27; identity. As a root CA, they were trusted by pretty much every TLS/SSL implementation on Earth; if you had a certificate from eMudhra, every browser would trust that you were who you said you were.&#x3C;/p&#x3E;&#x3C;p&#x3E;The only problem? One of their private keys was 4. Yes, it&#x27;s the &#x3C;a href=&#x22;https://xkcd.com/221/&#x22;&#x3E;XKCD&#x3C;/a&#x3E;.&#x3C;/p&#x3E;&#x3C;p&#x3E;Now, in their defense(?), eMudhra didn&#x27;t generate impossibly insecure keys. They performed a key signing ceremony and generated appropriately strong keys. Then they used an in-house tool to pack/unpack the keys, and this tool decided to truncate some of them down to one byte. Shockingly, even though ECC has relatively short key sizes, 8-bit ECC isn&#x27;t secure! You could derive the private key from the public key using only pencil and paper. But the worst part is that they did check the validity of the keys- &#x3C;em&#x3E;before they got truncated&#x3C;/em&#x3E;, giving them a false sense of security.&#x3C;/p&#x3E;&#x3C;p&#x3E;The good news, for eMudhra, is that this particular key signing ceremony generated &#x3C;a href=&#x22;https://ministryofcyberaffairs.com/news/emudhra-ca-key-compromise-explained-what-happened-and-what-to-do-0a37748d-4de2-4578-b3bd-488487663407&#x22;&#x3E;a total of 24 keys&#x3C;/a&#x3E;, and only 8 of them were truncated to the point of uselessness. I have it on good authority that &#x3C;a href=&#x22;https://www.youtube.com/watch?v=k5hWWe-ts2s&#x26;amp;list=RDk5hWWe-ts2s&#x26;amp;start_radio=1&#x26;amp;pp=ygUdbWVhdGxvYWYgMiBvdXQgb2YgMyBhaW4ndCBiYWSgBwE%3D&#x22;&#x3E;two out of three ain&#x27;t bad&#x3C;/a&#x3E;.&#x3C;/p&#x3E;&#x3C;p&#x3E;Now, after that disgrace, it&#x27;s no surprise that eMudhra is &#x3C;a href=&#x22;https://arstechnica.com/security/2026/10/disgraced-emudhra-drops-out-of-tls-business-following-certificate-debacle/&#x22;&#x3E;dropping out of the certificate authority business&#x3C;/a&#x3E;. Still, the press release where their chairman explains the rationale is some serious &#x3C;a href=&#x22;https://emudhra.com/en/press-release/emudhra-to-exit-global-ssl-tls-certificate-business&#x22;&#x3E;&#x22;screw you guys, I&#x27;m going home,&#x22;&#x3C;/a&#x3E; energy.&#x3C;/p&#x3E;&#x3C;blockquote&#x3E;&#x3C;p&#x3E;He added that global SSL/TLS is a small part of eMudhra&#x2019;s business contributing to about 1% of the global revenue. Due to increasing data sovereignty &#x26;amp; compliance requirements, complexity and cost associated with this business is increasing over the years. This, paired with the fact that some of the large entities issue the SSL/TLS free of cost, the business potential and RoI of this line of business also has considerably reduced for eMudhra when measured against our cumulative revenue base.&#x3C;br /&#x3E; However, the level of social media amplification around this incident has brought scrutiny that is out of proportion to SSL/TLS&#x2019;s place in our business. In view of this, after detailed deliberations our board has concluded that withdrawing from global SSL/TLS is the right decision for eMudhra and its shareholders. For many certifying authorities, SSL/TLS is the whole business. For eMudhra it is one part of a much broader digital solutions portfolio. We will put our energy where we create the most value for customers with Sharpened Focus on Core Enterprise Solutions and trust services other than SSL/TLS.&#x3C;/p&#x3E;&#x3C;/blockquote&#x3E;&#x3C;p&#x3E;eMudhra&#x27;s chairman added &#x22;There were no end entity certificates issued out of the affected CA&#x2019;s. Its infrastructure was not compromised and no data was breached. All physical and logical security controls remained intact.&#x22; That&#x27;s thin sauce, of course, because while eMudra may not have issued any certs under the broken keys, &#x3C;em&#x3E;anyone else could have&#x3C;/em&#x3E;. It&#x27;s not that everyone is overreacting to a non-event, and more that it&#x27;s a non-event only through sheer luck.&#x3C;/p&#x3E;&#x3C;p&#x3E;Also, removing a root CA from your trust store isn&#x27;t a trivial task, and at the time of this writing, there&#x27;s still &#x3C;em&#x3E;loads&#x3C;/em&#x3E; of cleanup that needs to happen as a result of this.&#x3C;/p&#x3E;&#x3C;p&#x3E;Something I learned while writing this is that eMudhra&#x27;s slogan is &#x22;Trust Delivered&#x22;. This is sorta like when my partner and I tried to get a coffee table delivered, and instead received a cardboard box full of wooden shards, because apparently someone though &#x22;air freight&#x22; meant &#x22;wait till the plane is roughly over my house and push the box out the back&#x22;. &#x3C;em&#x3E;Something&#x3C;/em&#x3E; was delivered, but it wasn&#x27;t a coffee table by the time I got it.&#x3C;/p&#x3E;&#x3C;span style=&#x22;font-weight: bold; font-size: smaller; font-style: italic&#x22;&#x3E; Easy Reader Version: It was a nice coffee table too. Cool little mid-century modern style thing, but high quality. &#x3C;/span&#x3E;&#x3C;div&#x3E;&#x3C;img src=&#x22;https://thedailywtf.com/images/inedo/proget-icon.png&#x22; style=&#x22;display:block; float: left; margin: 0 10px 10px 0;&#x22; /&#x3E; [Advertisement] Keep all your packages and Docker containers in one place, scan for vulnerabilities, and control who can access different feeds. ProGet installs in minutes and has a powerful free version with a lot of great features that you can upgrade when ready.&#x3C;a href=&#x22;https://inedo.com/proget?utm_source=tdwtf&#x26;amp;utm_medium=footer&#x26;amp;utm_content=PlebsFooter&#x22;&#x3E;Learn more.&#x3C;/a&#x3E;&#x3C;/div&#x3E;&#x3C;div style=&#x22;clear: left;&#x22;&#x3E;&#x3C;/div&#x3E;&#x3C;/div&#x3E;</description>
<category>News Roundup</category>
<guid isPermaLink="true">https://thedailywtf.com/articles/security-fourth</guid>
<pubDate>Tue, 27 Oct 2026 06:30:00 GMT</pubDate>
<content:encoded>&#x3C;div&#x3E;&#x3C;p&#x3E;A bit ago, I broke with my usual pattern and &#x3C;a href=&#x22;https://thedailywtf.com/articles/the-frist-line-of-defense&#x22;&#x3E;wrote up some security issues&#x3C;/a&#x3E; that I felt were particularly funny. It was a change of pace, a &#x3C;em&#x3E;different&#x3C;/em&#x3E; thing, but not a thing that&#x27;d become a habit. After all, I&#x27;m not a security expert, this isn&#x27;t a security site, and seriously, what are the odds that suitably funny security issues would crop up again less than a week later?&#x3C;/p&#x3E;&#x3C;p&#x3E;Well.&#x3C;/p&#x3E;&#x3C;p&#x3E;Let&#x27;s start with the actual serious issue, &#x3C;a href=&#x22;https://www.huntress.com/blog/php2shell-leaked-critical-php-vulnerabilities&#x22;&#x3E;PHP2Shell&#x3C;/a&#x3E;. In terms of scope, every version of PHP for the past twenty years has had this bug. The general issue that permits the exploit was &#x3C;a href=&#x22;https://calif.io/php2shell/#an-interesting-timeline-of-events&#x22;&#x3E;known about&#x3C;/a&#x3E;, but wasn&#x27;t considered exploitable.&#x3C;/p&#x3E;&#x3C;p&#x3E;Oops.&#x3C;/p&#x3E;&#x3C;p&#x3E;The broad strokes of the bug is that it&#x27;s two separate bugs. The first allows someone to bypass the checks on a request&#x27;s size, thus giving them a direct route to triggering an out-of-memory error. The second is that, depending where you are in the processing pipeline, PHP doesn&#x27;t properly handle cleanup, allowing for use-after-free that can trigger code execution. It doesn&#x27;t matter what code you&#x27;ve written, this all happens before the request even hits your code.&#x3C;/p&#x3E;&#x3C;p&#x3E;Bigger oops.&#x3C;/p&#x3E;&#x3C;p&#x3E;This bug was found via LLM tools, which has lead to a lot of hype around the idea that we&#x27;ve &#x3C;a href=&#x22;https://www.wiz.io/blog/php2shell-php-rce#the-ai-inflection-point-26&#x22;&#x3E;entered some new era&#x3C;/a&#x3E;. I&#x27;ll certainly grant that the ability to throw compute at hacking challenges instead of human effort is going to shift the landscape, but I&#x27;m not quite willing to buy the apocalyptic prophecies. Especially when some of those prophets are telling us that their AIs will avoid deletion by &#x3C;a href=&#x22;https://www.cnbc.com/2026/10/13/anthropic-ai-models-self-replication-smart-devices.html&#x22;&#x3E;copying themselves onto your thermostat&#x3C;/a&#x3E;. I think it&#x27;s safe to say we&#x27;re going to see a lot of security incidents coming out of LLMs in the near future, not because they&#x27;re magic genius hackers, but because they&#x27;re pretty good at processing structured text and running tests.&#x3C;/p&#x3E;&#x3C;p&#x3E;For those of us living in the real world, the concern isn&#x27;t AIs, but HIs: human intelligences. In this case, the exploit was discovered back in August. Security researchers and the PHP Foundation put their heads down to work on it, and where necessary, notified so-called &#x22;critical infrastructure providers&#x22; to ensure that everyone was ready to address the issue. The problem there is that two people can keep a secret if one of them is dead, and a lot more than two people got roped in to deal with this.&#x3C;/p&#x3E;&#x3C;p&#x3E;Rumors were circulating in security circles. And cybersecurity firm &#x3C;a href=&#x22;https://www.computerweekly.com/news/366652674/Botched-PHP2Shell-disclosure-revealed-as-panic-continues&#x22;&#x3E;Chainguard&#x3C;/a&#x3E; decided this was good enough excuse to break the embargo and announce the flaw &#x3C;em&#x3E;before&#x3C;/em&#x3E; patches were available. No patches for a &#x3C;em&#x3E;flaw that impacts 20 years worth of software versions&#x3C;/em&#x3E; of widely deployed software.&#x3C;/p&#x3E;&#x3C;p&#x3E;Patches are out now, though only for versions 8.2 and up. Source patches are out back to 7.4, which is officially end-of-life, but I have to wonder how many official EOLed copies of PHP are out there.&#x3C;/p&#x3E;&#x3C;p&#x3E;On a lighter note, we can&#x27;t let the hijinks of eMudhra pass without comment. eMudhra is, among other things, a root certificate authority. They&#x27;ve got a bunch of key pairs that they use to sign certificates for other customers, thus vouching for those customers&#x27; identity. As a root CA, they were trusted by pretty much every TLS/SSL implementation on Earth; if you had a certificate from eMudhra, every browser would trust that you were who you said you were.&#x3C;/p&#x3E;&#x3C;p&#x3E;The only problem? One of their private keys was 4. Yes, it&#x27;s the &#x3C;a href=&#x22;https://xkcd.com/221/&#x22;&#x3E;XKCD&#x3C;/a&#x3E;.&#x3C;/p&#x3E;&#x3C;p&#x3E;Now, in their defense(?), eMudhra didn&#x27;t generate impossibly insecure keys. They performed a key signing ceremony and generated appropriately strong keys. Then they used an in-house tool to pack/unpack the keys, and this tool decided to truncate some of them down to one byte. Shockingly, even though ECC has relatively short key sizes, 8-bit ECC isn&#x27;t secure! You could derive the private key from the public key using only pencil and paper. But the worst part is that they did check the validity of the keys- &#x3C;em&#x3E;before they got truncated&#x3C;/em&#x3E;, giving them a false sense of security.&#x3C;/p&#x3E;&#x3C;p&#x3E;The good news, for eMudhra, is that this particular key signing ceremony generated &#x3C;a href=&#x22;https://ministryofcyberaffairs.com/news/emudhra-ca-key-compromise-explained-what-happened-and-what-to-do-0a37748d-4de2-4578-b3bd-488487663407&#x22;&#x3E;a total of 24 keys&#x3C;/a&#x3E;, and only 8 of them were truncated to the point of uselessness. I have it on good authority that &#x3C;a href=&#x22;https://www.youtube.com/watch?v=k5hWWe-ts2s&#x26;amp;list=RDk5hWWe-ts2s&#x26;amp;start_radio=1&#x26;amp;pp=ygUdbWVhdGxvYWYgMiBvdXQgb2YgMyBhaW4ndCBiYWSgBwE%3D&#x22;&#x3E;two out of three ain&#x27;t bad&#x3C;/a&#x3E;.&#x3C;/p&#x3E;&#x3C;p&#x3E;Now, after that disgrace, it&#x27;s no surprise that eMudhra is &#x3C;a href=&#x22;https://arstechnica.com/security/2026/10/disgraced-emudhra-drops-out-of-tls-business-following-certificate-debacle/&#x22;&#x3E;dropping out of the certificate authority business&#x3C;/a&#x3E;. Still, the press release where their chairman explains the rationale is some serious &#x3C;a href=&#x22;https://emudhra.com/en/press-release/emudhra-to-exit-global-ssl-tls-certificate-business&#x22;&#x3E;&#x22;screw you guys, I&#x27;m going home,&#x22;&#x3C;/a&#x3E; energy.&#x3C;/p&#x3E;&#x3C;blockquote&#x3E;&#x3C;p&#x3E;He added that global SSL/TLS is a small part of eMudhra&#x2019;s business contributing to about 1% of the global revenue. Due to increasing data sovereignty &#x26;amp; compliance requirements, complexity and cost associated with this business is increasing over the years. This, paired with the fact that some of the large entities issue the SSL/TLS free of cost, the business potential and RoI of this line of business also has considerably reduced for eMudhra when measured against our cumulative revenue base.&#x3C;br /&#x3E; However, the level of social media amplification around this incident has brought scrutiny that is out of proportion to SSL/TLS&#x2019;s place in our business. In view of this, after detailed deliberations our board has concluded that withdrawing from global SSL/TLS is the right decision for eMudhra and its shareholders. For many certifying authorities, SSL/TLS is the whole business. For eMudhra it is one part of a much broader digital solutions portfolio. We will put our energy where we create the most value for customers with Sharpened Focus on Core Enterprise Solutions and trust services other than SSL/TLS.&#x3C;/p&#x3E;&#x3C;/blockquote&#x3E;&#x3C;p&#x3E;eMudhra&#x27;s chairman added &#x22;There were no end entity certificates issued out of the affected CA&#x2019;s. Its infrastructure was not compromised and no data was breached. All physical and logical security controls remained intact.&#x22; That&#x27;s thin sauce, of course, because while eMudra may not have issued any certs under the broken keys, &#x3C;em&#x3E;anyone else could have&#x3C;/em&#x3E;. It&#x27;s not that everyone is overreacting to a non-event, and more that it&#x27;s a non-event only through sheer luck.&#x3C;/p&#x3E;&#x3C;p&#x3E;Also, removing a root CA from your trust store isn&#x27;t a trivial task, and at the time of this writing, there&#x27;s still &#x3C;em&#x3E;loads&#x3C;/em&#x3E; of cleanup that needs to happen as a result of this.&#x3C;/p&#x3E;&#x3C;p&#x3E;Something I learned while writing this is that eMudhra&#x27;s slogan is &#x22;Trust Delivered&#x22;. This is sorta like when my partner and I tried to get a coffee table delivered, and instead received a cardboard box full of wooden shards, because apparently someone though &#x22;air freight&#x22; meant &#x22;wait till the plane is roughly over my house and push the box out the back&#x22;. &#x3C;em&#x3E;Something&#x3C;/em&#x3E; was delivered, but it wasn&#x27;t a coffee table by the time I got it.&#x3C;/p&#x3E;&#x3C;span style=&#x22;font-weight: bold; font-size: smaller; font-style: italic&#x22;&#x3E; Easy Reader Version: It was a nice coffee table too. Cool little mid-century modern style thing, but high quality. &#x3C;/span&#x3E;&#x3C;div&#x3E;&#x3C;img src=&#x22;https://thedailywtf.com/images/inedo/proget-icon.png&#x22; style=&#x22;display:block; float: left; margin: 0 10px 10px 0;&#x22; /&#x3E; [Advertisement] Keep all your packages and Docker containers in one place, scan for vulnerabilities, and control who can access different feeds. ProGet installs in minutes and has a powerful free version with a lot of great features that you can upgrade when ready.&#x3C;a href=&#x22;https://inedo.com/proget?utm_source=tdwtf&#x26;amp;utm_medium=footer&#x26;amp;utm_content=PlebsFooter&#x22;&#x3E;Learn more.&#x3C;/a&#x3E;&#x3C;/div&#x3E;&#x3C;div style=&#x22;clear: left;&#x22;&#x3E;&#x3C;/div&#x3E;&#x3C;/div&#x3E;</content:encoded>
</item>
<item>
<title>Securely Useless</title>
<link>https://thedailywtf.com/articles/securely-useless</link>
<description>&#x3C;div&#x3E;&#x3C;p&#x3E;Submitter &#x3C;b&#x3E;Chops&#x3C;/b&#x3E; relates a tale of chasing &#x22;The Standard&#x22; at any cost:&#x3C;/p&#x3E;&#x3C;blockquote&#x3E;&#x3C;p&#x3E;A company had been forced, kicking and screaming, into the 20th century, and then into the 21st. Their range of dumb hardware was no longer being bought by customers who expected at least some way to get the data off it, and a USB stick wouldn&#x27;t cut it.&#x3C;/p&#x3E;&#x3C;p style=&#x22;float:right; padding-left:10px; padding-bottom:10px;&#x22;&#x3E;&#x3C;a href=&#x22;https://commons.wikimedia.org/wiki/File:Networks.svg&#x22; title=&#x22;Nicu B. 2004-2016, CC0, via Wikimedia Commons&#x22;&#x3E;&#x3C;img alt=&#x22;Computer network&#x22; itemprop=&#x22;image&#x22; src=&#x22;https://thumb.wikimedia.org/wikipedia/commons/thumb/5/52/Networks.svg/250px-Networks.svg.png?utm_source=commons.wikimedia.org&#x26;amp;utm_campaign=index&#x26;amp;utm_content=thumbnail&#x22; width=&#x22;300&#x22; /&#x3E;&#x3C;/a&#x3E;&#x3C;/p&#x3E;&#x3C;p&#x3E;The techno-fearful hired an external IT company and instructed them to ensure that the company adhered to the UK&#x27;s &#x22;CyberEssentials&#x22; programme of IT security.&#x3C;/p&#x3E;&#x3C;p&#x3E;Unfortunately, this meant that the nascent software development capability was immediately hamstrung, as people were denied the right to install and run unapproved software (including software that needed admin level rights in order to work, such as process monitor tools used as standard in software dev and test), could not easily connect across networks (also vital for the software dev), could not add various hardware to the network (such as the company&#x27;s own products, which made testing them awfully difficult) and so on.&#x3C;/p&#x3E;&#x3C;p&#x3E;A criminal underworld of mystery PCs slowly grew into place, plugging into the network to get things done, disavowed by anyone who saw them. Tunnels grew up, IP addresses were handed round on notepaper (no DNS approvals), a shadow world of software development in the back alleys of the network. Until finally it was too much, and approval was given for a second, less secure network. The plan was that the real core business, the really important parts, they would stay on the high-security side. There would be a second network, with a single bridge, which would serve the various software development and test systems, and also host the myriad new internal services growing up (wikis, servers, tools and so on). This way, the real core business would definitely remain secure, and compliant, and the software side of it and all that would not compromise the heart of the business.&#x3C;/p&#x3E;&#x3C;p&#x3E;The heart of the business ended up being a network share containing a decade of out-of-date, unsearchable documentation for products that were mostly no longer sold. It is super-secure, and the business heads confirm whole-heartedly that the company adheres to the CyberEssentials programme 100% with zero compromise.&#x3C;/p&#x3E;&#x3C;p&#x3E;There&#x27;s just a carefully separated set of servers and PCs, not the true core of the business but about eight times the size and full of essential activity, on a secondary network.&#x3C;/p&#x3E;&#x3C;/blockquote&#x3E;&#x3C;div&#x3E;&#x3C;img src=&#x22;https://thedailywtf.com/images/inedo/buildmaster-icon.png&#x22; style=&#x22;display:block; float: left; margin: 0 10px 10px 0;&#x22; /&#x3E; [Advertisement] &#x3C;a href=&#x22;https://inedo.com/BuildMaster?utm_source=tdwtf&#x26;amp;utm_medium=footerad&#x26;amp;utm_term=2018&#x26;amp;utm_content=Self_Service&#x26;amp;utm_campaign=Buildmaster_Footer&#x22;&#x3E;BuildMaster&#x3C;/a&#x3E; allows you to create a self-service release management platform that allows different teams to manage their applications. &#x3C;a href=&#x22;https://inedo.com/BuildMaster/download?utm_source=tdwtf&#x26;amp;utm_medium=footerad&#x26;amp;utm_term=2018&#x26;amp;utm_content=Self_Service&#x26;amp;utm_campaign=Buildmaster_Footer&#x22;&#x3E;Explore how!&#x3C;/a&#x3E;&#x3C;/div&#x3E;&#x3C;div style=&#x22;clear: left;&#x22;&#x3E;&#x3C;/div&#x3E;&#x3C;/div&#x3E;</description>
<category>Feature Articles</category>
<guid isPermaLink="true">https://thedailywtf.com/articles/securely-useless</guid>
<pubDate>Mon, 26 Oct 2026 06:30:00 GMT</pubDate>
<content:encoded>&#x3C;div&#x3E;&#x3C;p&#x3E;Submitter &#x3C;b&#x3E;Chops&#x3C;/b&#x3E; relates a tale of chasing &#x22;The Standard&#x22; at any cost:&#x3C;/p&#x3E;&#x3C;blockquote&#x3E;&#x3C;p&#x3E;A company had been forced, kicking and screaming, into the 20th century, and then into the 21st. Their range of dumb hardware was no longer being bought by customers who expected at least some way to get the data off it, and a USB stick wouldn&#x27;t cut it.&#x3C;/p&#x3E;&#x3C;p style=&#x22;float:right; padding-left:10px; padding-bottom:10px;&#x22;&#x3E;&#x3C;a href=&#x22;https://commons.wikimedia.org/wiki/File:Networks.svg&#x22; title=&#x22;Nicu B. 2004-2016, CC0, via Wikimedia Commons&#x22;&#x3E;&#x3C;img alt=&#x22;Computer network&#x22; itemprop=&#x22;image&#x22; src=&#x22;https://thumb.wikimedia.org/wikipedia/commons/thumb/5/52/Networks.svg/250px-Networks.svg.png?utm_source=commons.wikimedia.org&#x26;amp;utm_campaign=index&#x26;amp;utm_content=thumbnail&#x22; width=&#x22;300&#x22; /&#x3E;&#x3C;/a&#x3E;&#x3C;/p&#x3E;&#x3C;p&#x3E;The techno-fearful hired an external IT company and instructed them to ensure that the company adhered to the UK&#x27;s &#x22;CyberEssentials&#x22; programme of IT security.&#x3C;/p&#x3E;&#x3C;p&#x3E;Unfortunately, this meant that the nascent software development capability was immediately hamstrung, as people were denied the right to install and run unapproved software (including software that needed admin level rights in order to work, such as process monitor tools used as standard in software dev and test), could not easily connect across networks (also vital for the software dev), could not add various hardware to the network (such as the company&#x27;s own products, which made testing them awfully difficult) and so on.&#x3C;/p&#x3E;&#x3C;p&#x3E;A criminal underworld of mystery PCs slowly grew into place, plugging into the network to get things done, disavowed by anyone who saw them. Tunnels grew up, IP addresses were handed round on notepaper (no DNS approvals), a shadow world of software development in the back alleys of the network. Until finally it was too much, and approval was given for a second, less secure network. The plan was that the real core business, the really important parts, they would stay on the high-security side. There would be a second network, with a single bridge, which would serve the various software development and test systems, and also host the myriad new internal services growing up (wikis, servers, tools and so on). This way, the real core business would definitely remain secure, and compliant, and the software side of it and all that would not compromise the heart of the business.&#x3C;/p&#x3E;&#x3C;p&#x3E;The heart of the business ended up being a network share containing a decade of out-of-date, unsearchable documentation for products that were mostly no longer sold. It is super-secure, and the business heads confirm whole-heartedly that the company adheres to the CyberEssentials programme 100% with zero compromise.&#x3C;/p&#x3E;&#x3C;p&#x3E;There&#x27;s just a carefully separated set of servers and PCs, not the true core of the business but about eight times the size and full of essential activity, on a secondary network.&#x3C;/p&#x3E;&#x3C;/blockquote&#x3E;&#x3C;div&#x3E;&#x3C;img src=&#x22;https://thedailywtf.com/images/inedo/buildmaster-icon.png&#x22; style=&#x22;display:block; float: left; margin: 0 10px 10px 0;&#x22; /&#x3E; [Advertisement] &#x3C;a href=&#x22;https://inedo.com/BuildMaster?utm_source=tdwtf&#x26;amp;utm_medium=footerad&#x26;amp;utm_term=2018&#x26;amp;utm_content=Self_Service&#x26;amp;utm_campaign=Buildmaster_Footer&#x22;&#x3E;BuildMaster&#x3C;/a&#x3E; allows you to create a self-service release management platform that allows different teams to manage their applications. &#x3C;a href=&#x22;https://inedo.com/BuildMaster/download?utm_source=tdwtf&#x26;amp;utm_medium=footerad&#x26;amp;utm_term=2018&#x26;amp;utm_content=Self_Service&#x26;amp;utm_campaign=Buildmaster_Footer&#x22;&#x3E;Explore how!&#x3C;/a&#x3E;&#x3C;/div&#x3E;&#x3C;div style=&#x22;clear: left;&#x22;&#x3E;&#x3C;/div&#x3E;&#x3C;/div&#x3E;</content:encoded>
</item>
<item>
<title>Representative Line: Readable Formats</title>
<link>https://thedailywtf.com/articles/readable-formats</link>
<description>&#x3C;div&#x3E;&#x3C;p&#x3E;We all love format strings for generating human readable text. Certainly, they&#x27;re a better choice than string concatenation. Even if I have a blind spot that keeps me from remembering the &#x3C;code&#x3E;printf&#x3C;/code&#x3E; format tokens, I still prefer to use format strings.&#x3C;/p&#x3E;&#x3C;p&#x3E;&#x3C;strong&#x3E;Jasmine&#x3C;/strong&#x3E; has a co-worker that does use format strings, but they also miss using string concatenation. So they&#x27;ve found a way to combine them, and avoid the perils of making readable code that describes the format of their text.&#x3C;/p&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;language-csharp&#x22;&#x3E;myField.DataFormatString = &#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x22;{0:#,##0.&#x22;&#x3C;/span&#x3E; + &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;new&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-built_in&#x22;&#x3E;string&#x3C;/span&#x3E;(&#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x27;0&#x27;&#x3C;/span&#x3E;, &#x3C;span class=&#x22;hljs-number&#x22;&#x3E;2&#x3C;/span&#x3E;) + &#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x22;;(#,##0.&#x22;&#x3C;/span&#x3E; + &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;new&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-built_in&#x22;&#x3E;string&#x3C;/span&#x3E;(&#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x27;0&#x27;&#x3C;/span&#x3E;, &#x3C;span class=&#x22;hljs-number&#x22;&#x3E;2&#x3C;/span&#x3E;) + &#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x22;)}&#x22;&#x3C;/span&#x3E;;
&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;p&#x3E;Now, in their defense, I can see how this code started its life. At some point, they wanted to make the number of decimal places a parameter. And sure, this is an easy way to do that and retain the intent, though this whole thing could be cleaned up with just a simple &#x3C;code&#x3E;decimalPlaces = new string(&#x27;0&#x27;, 2)&#x3C;/code&#x3E;, which would make the concatenation less confusing to read.&#x3C;/p&#x3E;&#x3C;p&#x3E;Related, while I was checking the documentation on the .NET formatting strings, I learned that they have a per-mille format specifier &#x3C;a href=&#x22;https://learn.microsoft.com/en-us/dotnet/standard/base-types/custom-numeric-format-strings#the--custom-specifier-4&#x22;&#x3E;which requires writing a unicode sigil&#x3C;/a&#x3E; on most keyboards.&#x3C;/p&#x3E;&#x3C;p&#x3E;I&#x27;m sorry, but seeing &#x3C;code&#x3E;string perMilleFmt = &#x22;#0.## &#x22; + &#x27;\u2030&#x27;;&#x3C;/code&#x3E; in my code would be TRWTF.&#x3C;/p&#x3E;&#x3C;span style=&#x22;font-weight: bold; font-size: smaller; font-style: italic&#x22;&#x3E; Easy Reader Version: Todo: write a version of ALGOL that uses just the unicode escape characters. Y&#x27;know, for readability. &#x3C;/span&#x3E;&#x3C;div&#x3E; [Advertisement] Picking up &#x3C;b&#x3E;NuGet&#x3C;/b&#x3E; is easy. Getting good at it takes time. &#x3C;a href=&#x22;https://inedo.com/support/whitepapers/nuget-guide?utm_source=tdwtf&#x26;amp;utm_medium=Footerad&#x26;amp;utm_campaign=nuget&#x22;&#x3E;Download our guide to learn the best practice of NuGet for the Enterprise.&#x3C;/a&#x3E;&#x3C;/div&#x3E;&#x3C;div style=&#x22;clear: left;&#x22;&#x3E;&#x3C;/div&#x3E;&#x3C;/div&#x3E;</description>
<category>Representative Line</category>
<guid isPermaLink="true">https://thedailywtf.com/articles/readable-formats</guid>
<pubDate>Thu, 22 Oct 2026 06:30:00 GMT</pubDate>
<content:encoded>&#x3C;div&#x3E;&#x3C;p&#x3E;We all love format strings for generating human readable text. Certainly, they&#x27;re a better choice than string concatenation. Even if I have a blind spot that keeps me from remembering the &#x3C;code&#x3E;printf&#x3C;/code&#x3E; format tokens, I still prefer to use format strings.&#x3C;/p&#x3E;&#x3C;p&#x3E;&#x3C;strong&#x3E;Jasmine&#x3C;/strong&#x3E; has a co-worker that does use format strings, but they also miss using string concatenation. So they&#x27;ve found a way to combine them, and avoid the perils of making readable code that describes the format of their text.&#x3C;/p&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;language-csharp&#x22;&#x3E;myField.DataFormatString = &#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x22;{0:#,##0.&#x22;&#x3C;/span&#x3E; + &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;new&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-built_in&#x22;&#x3E;string&#x3C;/span&#x3E;(&#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x27;0&#x27;&#x3C;/span&#x3E;, &#x3C;span class=&#x22;hljs-number&#x22;&#x3E;2&#x3C;/span&#x3E;) + &#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x22;;(#,##0.&#x22;&#x3C;/span&#x3E; + &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;new&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-built_in&#x22;&#x3E;string&#x3C;/span&#x3E;(&#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x27;0&#x27;&#x3C;/span&#x3E;, &#x3C;span class=&#x22;hljs-number&#x22;&#x3E;2&#x3C;/span&#x3E;) + &#x3C;span class=&#x22;hljs-string&#x22;&#x3E;&#x22;)}&#x22;&#x3C;/span&#x3E;;
&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;p&#x3E;Now, in their defense, I can see how this code started its life. At some point, they wanted to make the number of decimal places a parameter. And sure, this is an easy way to do that and retain the intent, though this whole thing could be cleaned up with just a simple &#x3C;code&#x3E;decimalPlaces = new string(&#x27;0&#x27;, 2)&#x3C;/code&#x3E;, which would make the concatenation less confusing to read.&#x3C;/p&#x3E;&#x3C;p&#x3E;Related, while I was checking the documentation on the .NET formatting strings, I learned that they have a per-mille format specifier &#x3C;a href=&#x22;https://learn.microsoft.com/en-us/dotnet/standard/base-types/custom-numeric-format-strings#the--custom-specifier-4&#x22;&#x3E;which requires writing a unicode sigil&#x3C;/a&#x3E; on most keyboards.&#x3C;/p&#x3E;&#x3C;p&#x3E;I&#x27;m sorry, but seeing &#x3C;code&#x3E;string perMilleFmt = &#x22;#0.## &#x22; + &#x27;\u2030&#x27;;&#x3C;/code&#x3E; in my code would be TRWTF.&#x3C;/p&#x3E;&#x3C;span style=&#x22;font-weight: bold; font-size: smaller; font-style: italic&#x22;&#x3E; Easy Reader Version: Todo: write a version of ALGOL that uses just the unicode escape characters. Y&#x27;know, for readability. &#x3C;/span&#x3E;&#x3C;div&#x3E; [Advertisement] Picking up &#x3C;b&#x3E;NuGet&#x3C;/b&#x3E; is easy. Getting good at it takes time. &#x3C;a href=&#x22;https://inedo.com/support/whitepapers/nuget-guide?utm_source=tdwtf&#x26;amp;utm_medium=Footerad&#x26;amp;utm_campaign=nuget&#x22;&#x3E;Download our guide to learn the best practice of NuGet for the Enterprise.&#x3C;/a&#x3E;&#x3C;/div&#x3E;&#x3C;div style=&#x22;clear: left;&#x22;&#x3E;&#x3C;/div&#x3E;&#x3C;/div&#x3E;</content:encoded>
</item>
<item>
<title>CodeSOD: Doing the Assignment</title>
<link>https://thedailywtf.com/articles/doing-the-assignment</link>
<description>&#x3C;div&#x3E;&#x3C;p&#x3E;Today&#x27;s code maybe isn&#x27;t much of a WTF, but it does point in the general direction of, &#x22;Damn, you live like this?&#x22; Poor &#x3C;strong&#x3E;Nancy&#x3C;/strong&#x3E; unfortunately does.&#x3C;/p&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;language-java&#x22;&#x3E;&#x3C;span class=&#x22;hljs-type&#x22;&#x3E;int&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-variable&#x22;&#x3E;x&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-operator&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-number&#x22;&#x3E;3&#x3C;/span&#x3E;;
&#x3C;span class=&#x22;hljs-type&#x22;&#x3E;int&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-variable&#x22;&#x3E;y&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-operator&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-number&#x22;&#x3E;4&#x3C;/span&#x3E;;
&#x3C;span class=&#x22;hljs-type&#x22;&#x3E;int&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-variable&#x22;&#x3E;z&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-operator&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-number&#x22;&#x3E;4&#x3C;/span&#x3E;;
x = y = z;
&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;p&#x3E;Each variable is declared and initialized, and then they&#x27;re set equal to each other. It just raises the question though, &#x3C;em&#x3E;why do it this way&#x3C;/em&#x3E;? Why not declare them and then &#x3C;code&#x3E;x = y = z = 4&#x3C;/code&#x3E;, if we want that? Or maybe, for more clarity, &#x3C;code&#x3E;int x = DEFAULT_VALUE;&#x3C;/code&#x3E; would be more legible, and we can skip the multiple assignments on one line. &#x3C;em&#x3E;Why does &#x3C;code&#x3E;x&#x3C;/code&#x3E; get set to 3 but then overwritten&#x3C;/em&#x3E;?&#x3C;/p&#x3E;&#x3C;span style=&#x22;font-weight: bold; font-size: smaller; font-style: italic&#x22;&#x3E; Easy Reader Version: I&#x27;m never fond of x = y = z. It points at being *clever*, and as oft stated, I *hate clever*. &#x3C;/span&#x3E;&#x3C;div&#x3E;&#x3C;img src=&#x22;https://thedailywtf.com/images/inedo/proget-icon.png&#x22; style=&#x22;display:block; float: left; margin: 0 10px 10px 0;&#x22; /&#x3E; [Advertisement] ProGet&#x2019;s got you covered with security and access controls on your NuGet feeds. &#x3C;a href=&#x22;https://inedo.com/proget/private-nuget-server?utm_source=tdwtf&#x26;amp;utm_medium=footer&#x26;amp;utm_content=GotYouCoveredFooter&#x26;amp;utm_campaign=Cyclops2020&#x22;&#x3E;Learn more.&#x3C;/a&#x3E;&#x3C;/div&#x3E;&#x3C;div style=&#x22;clear: left;&#x22;&#x3E;&#x3C;/div&#x3E;&#x3C;/div&#x3E;</description>
<category>CodeSOD</category>
<guid isPermaLink="true">https://thedailywtf.com/articles/doing-the-assignment</guid>
<pubDate>Wed, 21 Oct 2026 06:30:00 GMT</pubDate>
<content:encoded>&#x3C;div&#x3E;&#x3C;p&#x3E;Today&#x27;s code maybe isn&#x27;t much of a WTF, but it does point in the general direction of, &#x22;Damn, you live like this?&#x22; Poor &#x3C;strong&#x3E;Nancy&#x3C;/strong&#x3E; unfortunately does.&#x3C;/p&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;language-java&#x22;&#x3E;&#x3C;span class=&#x22;hljs-type&#x22;&#x3E;int&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-variable&#x22;&#x3E;x&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-operator&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-number&#x22;&#x3E;3&#x3C;/span&#x3E;;
&#x3C;span class=&#x22;hljs-type&#x22;&#x3E;int&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-variable&#x22;&#x3E;y&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-operator&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-number&#x22;&#x3E;4&#x3C;/span&#x3E;;
&#x3C;span class=&#x22;hljs-type&#x22;&#x3E;int&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-variable&#x22;&#x3E;z&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-operator&#x22;&#x3E;=&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-number&#x22;&#x3E;4&#x3C;/span&#x3E;;
x = y = z;
&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;p&#x3E;Each variable is declared and initialized, and then they&#x27;re set equal to each other. It just raises the question though, &#x3C;em&#x3E;why do it this way&#x3C;/em&#x3E;? Why not declare them and then &#x3C;code&#x3E;x = y = z = 4&#x3C;/code&#x3E;, if we want that? Or maybe, for more clarity, &#x3C;code&#x3E;int x = DEFAULT_VALUE;&#x3C;/code&#x3E; would be more legible, and we can skip the multiple assignments on one line. &#x3C;em&#x3E;Why does &#x3C;code&#x3E;x&#x3C;/code&#x3E; get set to 3 but then overwritten&#x3C;/em&#x3E;?&#x3C;/p&#x3E;&#x3C;span style=&#x22;font-weight: bold; font-size: smaller; font-style: italic&#x22;&#x3E; Easy Reader Version: I&#x27;m never fond of x = y = z. It points at being *clever*, and as oft stated, I *hate clever*. &#x3C;/span&#x3E;&#x3C;div&#x3E;&#x3C;img src=&#x22;https://thedailywtf.com/images/inedo/proget-icon.png&#x22; style=&#x22;display:block; float: left; margin: 0 10px 10px 0;&#x22; /&#x3E; [Advertisement] ProGet&#x2019;s got you covered with security and access controls on your NuGet feeds. &#x3C;a href=&#x22;https://inedo.com/proget/private-nuget-server?utm_source=tdwtf&#x26;amp;utm_medium=footer&#x26;amp;utm_content=GotYouCoveredFooter&#x26;amp;utm_campaign=Cyclops2020&#x22;&#x3E;Learn more.&#x3C;/a&#x3E;&#x3C;/div&#x3E;&#x3C;div style=&#x22;clear: left;&#x22;&#x3E;&#x3C;/div&#x3E;&#x3C;/div&#x3E;</content:encoded>
</item>
<item>
<title>The Outage</title>
<link>https://thedailywtf.com/articles/the-outage</link>
<description>&#x3C;div&#x3E;&#x3C;p&#x3E;At my employer, we use a service called Coveralls, which is a code coverage reporting tool that hooks into your CI pipeline. It takes your &#x3C;code&#x3E;lcov&#x3C;/code&#x3E; reports and gives you some insights, and also makes it easy to cause the CI pipeline to fail if newly added code doesn&#x27;t have reasonable coverage.&#x3C;/p&#x3E;&#x3C;p&#x3E;I have no strong feelings about the tool, but on February 24th, our CI jobs started failing, and our CI step that talked to Coveralls was the culprit. Coveralls had gone down. That happened to us, and a lot of other people. It was a widespread outage impacting anybody who used their service.&#x3C;/p&#x3E;&#x3C;p&#x3E;Coveralls actively published updates as the outage dragged on, and boy, &#x3C;em&#x3E;did it drag on&#x3C;/em&#x3E;. Between them posting nearly identical updates minutes or even seconds apart and the general desperation that snuck into their outage notes after the first few days, I couldn&#x27;t help but find their notes hilarious.&#x3C;/p&#x3E;&#x3C;p&#x3E;They&#x27;ve &#x3C;a href=&#x22;https://status.coveralls.io/incidents/pdbt7vdzlvpj&#x22;&#x3E;published their post-mortem&#x3C;/a&#x3E;, and the short version is that despite them paying their bills, Amazon decided they hadn&#x27;t, and shut down their services. But it took them roughly 68 hours to figure that out.&#x3C;/p&#x3E;&#x3C;p&#x3E;If you scroll down past the post-mortem, you can see their outage notes. This is an unauthorized, dramatic reading of those notes. We&#x27;ve taken some liberties in interpreting it.&#x3C;/p&#x3E;&#x3C;iframe allow=&#x22;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#x22; allowfullscreen=&#x22;&#x22; frameborder=&#x22;0&#x22; height=&#x22;480&#x22; referrerpolicy=&#x22;strict-origin-when-cross-origin&#x22; src=&#x22;https://www.youtube.com/embed/YgVKi4B6nrs&#x22; title=&#x22;&#x22; width=&#x22;720&#x22;&#x3E;&#x3C;/iframe&#x3E;&#x3C;p&#x3E;I hope this is taken in a good spirit, because they were just doing their best when this happened. I don&#x27;t think most companies would be able to maintain operations when their cloud provider decides to lock their accounts. But I don&#x27;t care who you are: begging your users to email you if they can help you migrate off AWS is &#x3C;em&#x3E;funny&#x3C;/em&#x3E;.&#x3C;/p&#x3E;&#x3C;span style=&#x22;font-weight: bold; font-size: smaller; font-style: italic&#x22;&#x3E; Easy Reader Version: Yes, I am in fact the kind of person who thinks an eight minute video where all the dialogue comes from outage notes is funny. &#x3C;/span&#x3E;&#x3C;div&#x3E;&#x3C;img src=&#x22;https://thedailywtf.com/images/inedo/buildmaster-icon.png&#x22; style=&#x22;display:block; float: left; margin: 0 10px 10px 0;&#x22; /&#x3E; [Advertisement] &#x3C;a href=&#x22;https://inedo.com/BuildMaster?utm_source=tdwtf&#x26;amp;utm_medium=footerad&#x26;amp;utm_term=2018&#x26;amp;utm_content=Confidence&#x26;amp;utm_campaign=Buildmaster_Footer&#x22;&#x3E;Utilize BuildMaster&#x3C;/a&#x3E; to release your software with confidence, at the pace your business demands. &#x3C;a href=&#x22;https://inedo.com/BuildMaster/download?utm_source=tdwtf&#x26;amp;utm_medium=footerad&#x26;amp;utm_term=2018&#x26;amp;utm_content=Confidence&#x26;amp;utm_campaign=Buildmaster_Footer&#x22;&#x3E;Download&#x3C;/a&#x3E; today! &#x3C;/div&#x3E;&#x3C;div style=&#x22;clear: left;&#x22;&#x3E;&#x3C;/div&#x3E;&#x3C;/div&#x3E;</description>
<category>Feature Articles</category>
<guid isPermaLink="true">https://thedailywtf.com/articles/the-outage</guid>
<pubDate>Tue, 20 Oct 2026 06:30:00 GMT</pubDate>
<content:encoded>&#x3C;div&#x3E;&#x3C;p&#x3E;At my employer, we use a service called Coveralls, which is a code coverage reporting tool that hooks into your CI pipeline. It takes your &#x3C;code&#x3E;lcov&#x3C;/code&#x3E; reports and gives you some insights, and also makes it easy to cause the CI pipeline to fail if newly added code doesn&#x27;t have reasonable coverage.&#x3C;/p&#x3E;&#x3C;p&#x3E;I have no strong feelings about the tool, but on February 24th, our CI jobs started failing, and our CI step that talked to Coveralls was the culprit. Coveralls had gone down. That happened to us, and a lot of other people. It was a widespread outage impacting anybody who used their service.&#x3C;/p&#x3E;&#x3C;p&#x3E;Coveralls actively published updates as the outage dragged on, and boy, &#x3C;em&#x3E;did it drag on&#x3C;/em&#x3E;. Between them posting nearly identical updates minutes or even seconds apart and the general desperation that snuck into their outage notes after the first few days, I couldn&#x27;t help but find their notes hilarious.&#x3C;/p&#x3E;&#x3C;p&#x3E;They&#x27;ve &#x3C;a href=&#x22;https://status.coveralls.io/incidents/pdbt7vdzlvpj&#x22;&#x3E;published their post-mortem&#x3C;/a&#x3E;, and the short version is that despite them paying their bills, Amazon decided they hadn&#x27;t, and shut down their services. But it took them roughly 68 hours to figure that out.&#x3C;/p&#x3E;&#x3C;p&#x3E;If you scroll down past the post-mortem, you can see their outage notes. This is an unauthorized, dramatic reading of those notes. We&#x27;ve taken some liberties in interpreting it.&#x3C;/p&#x3E;&#x3C;iframe allow=&#x22;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#x22; allowfullscreen=&#x22;&#x22; frameborder=&#x22;0&#x22; height=&#x22;480&#x22; referrerpolicy=&#x22;strict-origin-when-cross-origin&#x22; src=&#x22;https://www.youtube.com/embed/YgVKi4B6nrs&#x22; title=&#x22;&#x22; width=&#x22;720&#x22;&#x3E;&#x3C;/iframe&#x3E;&#x3C;p&#x3E;I hope this is taken in a good spirit, because they were just doing their best when this happened. I don&#x27;t think most companies would be able to maintain operations when their cloud provider decides to lock their accounts. But I don&#x27;t care who you are: begging your users to email you if they can help you migrate off AWS is &#x3C;em&#x3E;funny&#x3C;/em&#x3E;.&#x3C;/p&#x3E;&#x3C;span style=&#x22;font-weight: bold; font-size: smaller; font-style: italic&#x22;&#x3E; Easy Reader Version: Yes, I am in fact the kind of person who thinks an eight minute video where all the dialogue comes from outage notes is funny. &#x3C;/span&#x3E;&#x3C;div&#x3E;&#x3C;img src=&#x22;https://thedailywtf.com/images/inedo/buildmaster-icon.png&#x22; style=&#x22;display:block; float: left; margin: 0 10px 10px 0;&#x22; /&#x3E; [Advertisement] &#x3C;a href=&#x22;https://inedo.com/BuildMaster?utm_source=tdwtf&#x26;amp;utm_medium=footerad&#x26;amp;utm_term=2018&#x26;amp;utm_content=Confidence&#x26;amp;utm_campaign=Buildmaster_Footer&#x22;&#x3E;Utilize BuildMaster&#x3C;/a&#x3E; to release your software with confidence, at the pace your business demands. &#x3C;a href=&#x22;https://inedo.com/BuildMaster/download?utm_source=tdwtf&#x26;amp;utm_medium=footerad&#x26;amp;utm_term=2018&#x26;amp;utm_content=Confidence&#x26;amp;utm_campaign=Buildmaster_Footer&#x22;&#x3E;Download&#x3C;/a&#x3E; today! &#x3C;/div&#x3E;&#x3C;div style=&#x22;clear: left;&#x22;&#x3E;&#x3C;/div&#x3E;&#x3C;/div&#x3E;</content:encoded>
</item>
<item>
<title>A Vat of Terrible Experiences</title>
<link>https://thedailywtf.com/articles/a-vat-of-terrible-experiences</link>
<description>&#x3C;div&#x3E;&#x3C;p&#x3E;Taxes are a royal pain for everyone. Amazon has found a unique way to make them even worse, as &#x3C;b&#x3E;Kris W.&#x3C;/b&#x3E; attests:&#x3C;/p&#x3E;&#x3C;blockquote&#x3E;&#x3C;p&#x3E;I recently bought a &#x20AC;9.61 kitchen knife on Amazon Spain. My card was charged &#x20AC;7.94 instead. After some investigation, I discovered that Amazon had applied an old VAT registration number I&#x27;d added to my personal account years ago, and had classified my purchase as a VAT-exempt intra-EU business transaction. The invoice even contained my business address from 2022, which no longer appeared anywhere in my account settings. I just wanted to remove the VAT number so I could go back to buying kitchen utensils without accidentally generating international tax paperwork.&#x3C;/p&#x3E;&#x3C;p style=&#x22;float:right; padding-left:10px; padding-bottom:10px;&#x22;&#x3E;&#x3C;a href=&#x22;https://commons.wikimedia.org/wiki/File:European_VAT_Taxes.svg&#x22; title=&#x22;Wikideas1, CC0, via Wikimedia Commons&#x22;&#x3E;&#x3C;img alt=&#x22;European VAT Taxes&#x22; itemprop=&#x22;image&#x22; src=&#x22;https://thumb.wikimedia.org/wikipedia/commons/thumb/7/78/European_VAT_Taxes.svg/250px-European_VAT_Taxes.svg.png?utm_source=commons.wikimedia.org&#x26;amp;utm_campaign=index&#x26;amp;utm_content=thumbnail&#x22; width=&#x22;300&#x22; /&#x3E;&#x3C;/a&#x3E;&#x3C;/p&#x3E;&#x3C;p&#x3E;Unfortunately, Amazon no longer provided any visible way to manage that VAT number. Their customer support chatbot insisted I provide the order number from which I wanted the VAT number removed. A human agent confidently explained that I must have entered it into a secondary address field, and instructed me to delete and recreate my shipping address. Another support representative sent me an extensive list of documents I&#x27;d need to provide, including my passport, airline boarding passes, proof of export outside the EU, or my NATO identification card. Apparently removing a VAT number from an Amazon account is a process normally reserved for international travelers, Andorran residents, and military alliances.&#x3C;/p&#x3E;&#x3C;p&#x3E;Eventually, I found Amazon&#x27;s official help page. It explicitly stated that VAT numbers could be removed either by contacting Customer Service or by creating an Amazon Business account to use the self-service option. After another round of correspondence, Customer Service informed me that they were &#x3C;i&#x3E;not allowed&#x3C;/i&#x3E; to remove VAT numbers and instructed me to use the Business settings that my personal account didn&#x27;t have. So I followed the documentation and created a Business account using my existing email address. During registration, Amazon required me to enter the very VAT number I was trying to remove, then promptly congratulated me by email on successfully adding and activating it.&#x3C;/p&#x3E;&#x3C;p&#x3E;But I couldn&#x27;t access the Business settings yet. Amazon couldn&#x27;t verify my business and demanded official documentation, so I obtained two freshly-issued certificates from two separate Spanish government agencies to prove that I was, in fact, a self-employed software developer. I uploaded both documents and waited. Eventually, my shiny new Amazon Business account was approved. I now had a separate Business account, complete with its own purchasing features and complimentary Business Prime membership. At last, I could navigate to the promised VAT-management page!&#x3C;/p&#x3E;&#x3C;p&#x3E;The page displayed my VAT number, confirmed it was valid, and offered a button to add more tax information. Beside the existing number, however, there was no &#x3C;b&#x3E;Edit&#x3C;/b&#x3E; button. No &#x3C;b&#x3E;Delete&#x3C;/b&#x3E; button. No self-service removal option whatsoever. There was only a link saying, &#x3C;i&#x3E;Contact Customer Service to change your tax ID.&#x3C;/i&#x3E;&#x3C;/p&#x3E;&#x3C;p&#x3E;Naturally, the link led to a generic help center. After creating an entire business account, submitting government paperwork, and successfully registering the same VAT number a second time, I had arrived precisely where I started: Customer Service, which had already explained that it was not allowed to remove VAT numbers.&#x3C;/p&#x3E;&#x3C;/blockquote&#x3E;&#x3C;div&#x3E; [Advertisement] Picking up &#x3C;b&#x3E;NuGet&#x3C;/b&#x3E; is easy. Getting good at it takes time. &#x3C;a href=&#x22;https://inedo.com/support/whitepapers/nuget-guide?utm_source=tdwtf&#x26;amp;utm_medium=Footerad&#x26;amp;utm_campaign=nuget&#x22;&#x3E;Download our guide to learn the best practice of NuGet for the Enterprise.&#x3C;/a&#x3E;&#x3C;/div&#x3E;&#x3C;div style=&#x22;clear: left;&#x22;&#x3E;&#x3C;/div&#x3E;&#x3C;/div&#x3E;</description>
<category>Feature Articles</category>
<guid isPermaLink="true">https://thedailywtf.com/articles/a-vat-of-terrible-experiences</guid>
<pubDate>Mon, 19 Oct 2026 06:30:00 GMT</pubDate>
<content:encoded>&#x3C;div&#x3E;&#x3C;p&#x3E;Taxes are a royal pain for everyone. Amazon has found a unique way to make them even worse, as &#x3C;b&#x3E;Kris W.&#x3C;/b&#x3E; attests:&#x3C;/p&#x3E;&#x3C;blockquote&#x3E;&#x3C;p&#x3E;I recently bought a &#x20AC;9.61 kitchen knife on Amazon Spain. My card was charged &#x20AC;7.94 instead. After some investigation, I discovered that Amazon had applied an old VAT registration number I&#x27;d added to my personal account years ago, and had classified my purchase as a VAT-exempt intra-EU business transaction. The invoice even contained my business address from 2022, which no longer appeared anywhere in my account settings. I just wanted to remove the VAT number so I could go back to buying kitchen utensils without accidentally generating international tax paperwork.&#x3C;/p&#x3E;&#x3C;p style=&#x22;float:right; padding-left:10px; padding-bottom:10px;&#x22;&#x3E;&#x3C;a href=&#x22;https://commons.wikimedia.org/wiki/File:European_VAT_Taxes.svg&#x22; title=&#x22;Wikideas1, CC0, via Wikimedia Commons&#x22;&#x3E;&#x3C;img alt=&#x22;European VAT Taxes&#x22; itemprop=&#x22;image&#x22; src=&#x22;https://thumb.wikimedia.org/wikipedia/commons/thumb/7/78/European_VAT_Taxes.svg/250px-European_VAT_Taxes.svg.png?utm_source=commons.wikimedia.org&#x26;amp;utm_campaign=index&#x26;amp;utm_content=thumbnail&#x22; width=&#x22;300&#x22; /&#x3E;&#x3C;/a&#x3E;&#x3C;/p&#x3E;&#x3C;p&#x3E;Unfortunately, Amazon no longer provided any visible way to manage that VAT number. Their customer support chatbot insisted I provide the order number from which I wanted the VAT number removed. A human agent confidently explained that I must have entered it into a secondary address field, and instructed me to delete and recreate my shipping address. Another support representative sent me an extensive list of documents I&#x27;d need to provide, including my passport, airline boarding passes, proof of export outside the EU, or my NATO identification card. Apparently removing a VAT number from an Amazon account is a process normally reserved for international travelers, Andorran residents, and military alliances.&#x3C;/p&#x3E;&#x3C;p&#x3E;Eventually, I found Amazon&#x27;s official help page. It explicitly stated that VAT numbers could be removed either by contacting Customer Service or by creating an Amazon Business account to use the self-service option. After another round of correspondence, Customer Service informed me that they were &#x3C;i&#x3E;not allowed&#x3C;/i&#x3E; to remove VAT numbers and instructed me to use the Business settings that my personal account didn&#x27;t have. So I followed the documentation and created a Business account using my existing email address. During registration, Amazon required me to enter the very VAT number I was trying to remove, then promptly congratulated me by email on successfully adding and activating it.&#x3C;/p&#x3E;&#x3C;p&#x3E;But I couldn&#x27;t access the Business settings yet. Amazon couldn&#x27;t verify my business and demanded official documentation, so I obtained two freshly-issued certificates from two separate Spanish government agencies to prove that I was, in fact, a self-employed software developer. I uploaded both documents and waited. Eventually, my shiny new Amazon Business account was approved. I now had a separate Business account, complete with its own purchasing features and complimentary Business Prime membership. At last, I could navigate to the promised VAT-management page!&#x3C;/p&#x3E;&#x3C;p&#x3E;The page displayed my VAT number, confirmed it was valid, and offered a button to add more tax information. Beside the existing number, however, there was no &#x3C;b&#x3E;Edit&#x3C;/b&#x3E; button. No &#x3C;b&#x3E;Delete&#x3C;/b&#x3E; button. No self-service removal option whatsoever. There was only a link saying, &#x3C;i&#x3E;Contact Customer Service to change your tax ID.&#x3C;/i&#x3E;&#x3C;/p&#x3E;&#x3C;p&#x3E;Naturally, the link led to a generic help center. After creating an entire business account, submitting government paperwork, and successfully registering the same VAT number a second time, I had arrived precisely where I started: Customer Service, which had already explained that it was not allowed to remove VAT numbers.&#x3C;/p&#x3E;&#x3C;/blockquote&#x3E;&#x3C;div&#x3E; [Advertisement] Picking up &#x3C;b&#x3E;NuGet&#x3C;/b&#x3E; is easy. Getting good at it takes time. &#x3C;a href=&#x22;https://inedo.com/support/whitepapers/nuget-guide?utm_source=tdwtf&#x26;amp;utm_medium=Footerad&#x26;amp;utm_campaign=nuget&#x22;&#x3E;Download our guide to learn the best practice of NuGet for the Enterprise.&#x3C;/a&#x3E;&#x3C;/div&#x3E;&#x3C;div style=&#x22;clear: left;&#x22;&#x3E;&#x3C;/div&#x3E;&#x3C;/div&#x3E;</content:encoded>
</item>
<item>
<title>The Frist Line of Defense</title>
<link>https://thedailywtf.com/articles/the-frist-line-of-defense</link>
<description>&#x3C;div&#x3E;&#x3C;p&#x3E;We don&#x27;t cover a lot of security issues here, simply because they&#x27;re not usually &#x3C;em&#x3E;funny&#x3C;/em&#x3E;. But sometimes, they are. So here&#x27;s a quick hit about some recent ones.&#x3C;/p&#x3E;&#x3C;p&#x3E;We start with a very bad month for the Danish social security system, the Central Register of Persons (CPR). Last week, they detected a breach &#x3C;a href=&#x22;https://www.theregister.com/security/2026/10/06/denmarks-id-register-spills-more-peoples-details-than-the-country-has-residents/5301307&#x22;&#x3E;which exposed the personal details of 8.8m people&#x3C;/a&#x3E;. Per the Register article, a cybersecurity specialist correctly pointed out that treating your ID number as if it were a secret was a terrible idea in the first place, but unfortunately, so many systems have grown up around the idea that full knowledge of your state issued ID number as proof of identity, that the security expert is screaming into the wind. They&#x27;re right, but it&#x27;s going to take a lot to change.&#x3C;/p&#x3E;&#x3C;p&#x3E;Okay, Denmark&#x27;s social security service was hacked. What&#x27;s so funny about that?&#x3C;/p&#x3E;&#x3C;p&#x3E;Well, the mechanism of the hack appears to go thusly. First, third party companies have access to the database, which they can use to send notifications to their customers via CPR. That connection is secured with a password, and one of those third parties secured their account with the kind of password you&#x27;d use to protect the precious air of the planet Druidia. Also known as the kind of &#x3C;a href=&#x22;https://www.youtube.com/watch?v=a6iW-8xPw3k&#x26;amp;pp=ygUocGFzc3dvcmQgc29tZSBpZGlvdCBoYXMgb24gdGhlaXIgbHVnZ2FnZQ%3D%3D&#x22;&#x3E;password some idiot would put on their luggage&#x3C;/a&#x3E;: &#x22;123456&#x22;. (&#x3C;a href=&#x22;https://politiken.dk/danmark/art11016363/%C2%BBOh-my-god%C2%AB-Fynsk-virksomhed-havde-mindst-tre-profiler-med-adgangskoden-123456&#x22;&#x3E;paywalled, Danish article&#x3C;/a&#x3E;).&#x3C;/p&#x3E;&#x3C;p&#x3E;The hacker accessed the system on September 10th, and spent ten days searching through the system. The intrusion wasn&#x27;t detected until October 2nd, when CPR went to send an invoice to the third party company and noticed, &#x22;Boy, that&#x27;s more searches than they have customers.&#x22; Now, obviously, CPR should have never even allowed such a low complexity password, but also, the third party company shouldn&#x27;t have &#x3C;em&#x3E;used&#x3C;/em&#x3E; such a low security password.&#x3C;/p&#x3E;&#x3C;p&#x3E;Now, if you&#x27;ll excuse me, I have to change the combination on my luggage. &#x3C;span style=&#x22;font-weight: bold; font-size: smaller; font-style: italic&#x22;&#x3E; I jest, in America, you aren&#x27;t legally allowed to put a secure lock on your luggage, every lock you travel with has to be openable by the TSA, which is one of the reasons why I never check a bag if I can help it. &#x3C;/span&#x3E;&#x3C;/p&#x3E;&#x3C;p&#x3E;In other news, I&#x27;m not particularly fond of blockchain stuff. Mostly, the whole distributed ledger seems like a solution in search of problems, and &#x22;trading tokens as if they&#x27;re money&#x22; is the best thing anybody&#x27;s been able to come up with. Back in my consulting days, when blockchains were all over the news, I was consulting with a large retailer, and they were exploring using blockchain in their supply chain. &#x22;How does that work?&#x22; I asked innocently. &#x22;It&#x27;ll have blockchain in it.&#x22; &#x22;Sure, but what does the blockchain get you?&#x22; &#x22;We&#x27;ll be using blockchain. If there&#x27;s like, an e. coli outbreak, we can trace where it came from.&#x22; &#x22;Couldn&#x27;t you get that out of a regular database?&#x22; &#x22;But this&#x27;ll have blockchain.&#x22;&#x3C;/p&#x3E;&#x3C;p&#x3E;In any case, blockchain companies getting hacked and having all their users&#x27; assets stolen is practically a daily occurrence. Not really notable. But a recent hack &#x3C;a href=&#x22;https://www.bleepingcomputer.com/news/security/ledger-confirms-hardware-wallet-spy-implant-behind-crypto-thefts/&#x22;&#x3E;is legitimately interesting&#x3C;/a&#x3E;.&#x3C;/p&#x3E;&#x3C;p&#x3E;A company, called Ledger, sells &#x22;hardware wallets&#x22;. Instead of storing your keys on some third party&#x27;s servers (where it&#x27;ll get hacked and you&#x27;ll lose all your &#x22;money&#x22;), you store them on a hardware device that you put in a safe. It&#x27;s not connected to the internet, and thus is unhackable. Or so you&#x27;d &#x3C;em&#x3E;think&#x3C;/em&#x3E;. But if enough people are buying those devices, a supply chain attack becomes potentially very lucrative. And that&#x27;s exactly what happened. &#x3C;em&#x3E;Someone&#x3C;/em&#x3E; in the &#x3C;a href=&#x22;https://www.coindesk.com/tech/2026/10/12/ledger-says-unauthorized-implant-found-in-at-least-one-device-sold-by-cryptobilis&#x22;&#x3E;supply chain&#x3C;/a&#x3E; cracked a bunch of these devices open, and inserted new hardware. They attached a microcontroller to the screen leads, that allowed it to read what was on the screen (and thus detect when the screen was displaying a recovery code that could be used to access the wallet), and a cellular modem that allowed it to literally phone home with that information.&#x3C;/p&#x3E;&#x3C;p&#x3E;In total, these hackers walked away with the equivalent of nearly $100M in cryptocurrency.&#x3C;/p&#x3E;&#x3C;p&#x3E;All the devices passed through Ledger, where they were inspected before being sold. Presumably, they were sealed with tamper-resistant packaging. It&#x27;s plausible that the tamperer was downstream from here and the customers didn&#x27;t fully inspect the packaging. Even your most savvy user generally doesn&#x27;t check that kind of thing, and I suspect a lot of these customers aren&#x27;t actually all that savvy. But also, companies in the crypto space tend to be... we&#x27;ll say, &#x3C;em&#x3E;more eager than cautious&#x3C;/em&#x3E;, so I wouldn&#x27;t be surprised if the tampering happened upstream and didn&#x27;t get caught by their inspection process.&#x3C;/p&#x3E;&#x3C;p&#x3E;Security is hard in the best case. It&#x27;s much harder when you&#x27;re putting the final onus of security on end users who may have thousands or even millions of dollars locked behind a single key. Or when passwords are hard, so you pick an easy one to remember.&#x3C;/p&#x3E;&#x3C;span style=&#x22;font-weight: bold; font-size: smaller; font-style: italic&#x22;&#x3E; Easy Reader Version: in an objective sense, Spaceballs is one of Mel Brooks&#x27; lesser contributions to the parody genre. On the other hand, if you&#x27;re seven years old when you watch it, and are a child obsessed with Star Wars, it&#x27;ll leave a mark in your brain that you can&#x27;t escape. &#x3C;/span&#x3E;&#x3C;div&#x3E; [Advertisement] &#x3C;b&#x3E;Plan Your .NET 9 Migration with Confidence&#x3C;/b&#x3E;&#x3C;br /&#x3E;Your journey to .NET 9 is more than just one decision.Avoid migration migraines with the advice in this free guide. &#x3C;b&#x3E;&#x3C;a href=&#x22;https://inedo.com/support/whitepapers/dotnet-guide?utm_campaign=dotnet&#x26;amp;utm_source=tdwtf-footer&#x22;&#x3E;Download Free Guide Now!&#x3C;/a&#x3E;&#x3C;/b&#x3E;&#x3C;/div&#x3E;&#x3C;div style=&#x22;clear: left;&#x22;&#x3E;&#x3C;/div&#x3E;&#x3C;/div&#x3E;</description>
<category>Feature Articles</category>
<guid isPermaLink="true">https://thedailywtf.com/articles/the-frist-line-of-defense</guid>
<pubDate>Thu, 15 Oct 2026 06:30:00 GMT</pubDate>
<content:encoded>&#x3C;div&#x3E;&#x3C;p&#x3E;We don&#x27;t cover a lot of security issues here, simply because they&#x27;re not usually &#x3C;em&#x3E;funny&#x3C;/em&#x3E;. But sometimes, they are. So here&#x27;s a quick hit about some recent ones.&#x3C;/p&#x3E;&#x3C;p&#x3E;We start with a very bad month for the Danish social security system, the Central Register of Persons (CPR). Last week, they detected a breach &#x3C;a href=&#x22;https://www.theregister.com/security/2026/10/06/denmarks-id-register-spills-more-peoples-details-than-the-country-has-residents/5301307&#x22;&#x3E;which exposed the personal details of 8.8m people&#x3C;/a&#x3E;. Per the Register article, a cybersecurity specialist correctly pointed out that treating your ID number as if it were a secret was a terrible idea in the first place, but unfortunately, so many systems have grown up around the idea that full knowledge of your state issued ID number as proof of identity, that the security expert is screaming into the wind. They&#x27;re right, but it&#x27;s going to take a lot to change.&#x3C;/p&#x3E;&#x3C;p&#x3E;Okay, Denmark&#x27;s social security service was hacked. What&#x27;s so funny about that?&#x3C;/p&#x3E;&#x3C;p&#x3E;Well, the mechanism of the hack appears to go thusly. First, third party companies have access to the database, which they can use to send notifications to their customers via CPR. That connection is secured with a password, and one of those third parties secured their account with the kind of password you&#x27;d use to protect the precious air of the planet Druidia. Also known as the kind of &#x3C;a href=&#x22;https://www.youtube.com/watch?v=a6iW-8xPw3k&#x26;amp;pp=ygUocGFzc3dvcmQgc29tZSBpZGlvdCBoYXMgb24gdGhlaXIgbHVnZ2FnZQ%3D%3D&#x22;&#x3E;password some idiot would put on their luggage&#x3C;/a&#x3E;: &#x22;123456&#x22;. (&#x3C;a href=&#x22;https://politiken.dk/danmark/art11016363/%C2%BBOh-my-god%C2%AB-Fynsk-virksomhed-havde-mindst-tre-profiler-med-adgangskoden-123456&#x22;&#x3E;paywalled, Danish article&#x3C;/a&#x3E;).&#x3C;/p&#x3E;&#x3C;p&#x3E;The hacker accessed the system on September 10th, and spent ten days searching through the system. The intrusion wasn&#x27;t detected until October 2nd, when CPR went to send an invoice to the third party company and noticed, &#x22;Boy, that&#x27;s more searches than they have customers.&#x22; Now, obviously, CPR should have never even allowed such a low complexity password, but also, the third party company shouldn&#x27;t have &#x3C;em&#x3E;used&#x3C;/em&#x3E; such a low security password.&#x3C;/p&#x3E;&#x3C;p&#x3E;Now, if you&#x27;ll excuse me, I have to change the combination on my luggage. &#x3C;span style=&#x22;font-weight: bold; font-size: smaller; font-style: italic&#x22;&#x3E; I jest, in America, you aren&#x27;t legally allowed to put a secure lock on your luggage, every lock you travel with has to be openable by the TSA, which is one of the reasons why I never check a bag if I can help it. &#x3C;/span&#x3E;&#x3C;/p&#x3E;&#x3C;p&#x3E;In other news, I&#x27;m not particularly fond of blockchain stuff. Mostly, the whole distributed ledger seems like a solution in search of problems, and &#x22;trading tokens as if they&#x27;re money&#x22; is the best thing anybody&#x27;s been able to come up with. Back in my consulting days, when blockchains were all over the news, I was consulting with a large retailer, and they were exploring using blockchain in their supply chain. &#x22;How does that work?&#x22; I asked innocently. &#x22;It&#x27;ll have blockchain in it.&#x22; &#x22;Sure, but what does the blockchain get you?&#x22; &#x22;We&#x27;ll be using blockchain. If there&#x27;s like, an e. coli outbreak, we can trace where it came from.&#x22; &#x22;Couldn&#x27;t you get that out of a regular database?&#x22; &#x22;But this&#x27;ll have blockchain.&#x22;&#x3C;/p&#x3E;&#x3C;p&#x3E;In any case, blockchain companies getting hacked and having all their users&#x27; assets stolen is practically a daily occurrence. Not really notable. But a recent hack &#x3C;a href=&#x22;https://www.bleepingcomputer.com/news/security/ledger-confirms-hardware-wallet-spy-implant-behind-crypto-thefts/&#x22;&#x3E;is legitimately interesting&#x3C;/a&#x3E;.&#x3C;/p&#x3E;&#x3C;p&#x3E;A company, called Ledger, sells &#x22;hardware wallets&#x22;. Instead of storing your keys on some third party&#x27;s servers (where it&#x27;ll get hacked and you&#x27;ll lose all your &#x22;money&#x22;), you store them on a hardware device that you put in a safe. It&#x27;s not connected to the internet, and thus is unhackable. Or so you&#x27;d &#x3C;em&#x3E;think&#x3C;/em&#x3E;. But if enough people are buying those devices, a supply chain attack becomes potentially very lucrative. And that&#x27;s exactly what happened. &#x3C;em&#x3E;Someone&#x3C;/em&#x3E; in the &#x3C;a href=&#x22;https://www.coindesk.com/tech/2026/10/12/ledger-says-unauthorized-implant-found-in-at-least-one-device-sold-by-cryptobilis&#x22;&#x3E;supply chain&#x3C;/a&#x3E; cracked a bunch of these devices open, and inserted new hardware. They attached a microcontroller to the screen leads, that allowed it to read what was on the screen (and thus detect when the screen was displaying a recovery code that could be used to access the wallet), and a cellular modem that allowed it to literally phone home with that information.&#x3C;/p&#x3E;&#x3C;p&#x3E;In total, these hackers walked away with the equivalent of nearly $100M in cryptocurrency.&#x3C;/p&#x3E;&#x3C;p&#x3E;All the devices passed through Ledger, where they were inspected before being sold. Presumably, they were sealed with tamper-resistant packaging. It&#x27;s plausible that the tamperer was downstream from here and the customers didn&#x27;t fully inspect the packaging. Even your most savvy user generally doesn&#x27;t check that kind of thing, and I suspect a lot of these customers aren&#x27;t actually all that savvy. But also, companies in the crypto space tend to be... we&#x27;ll say, &#x3C;em&#x3E;more eager than cautious&#x3C;/em&#x3E;, so I wouldn&#x27;t be surprised if the tampering happened upstream and didn&#x27;t get caught by their inspection process.&#x3C;/p&#x3E;&#x3C;p&#x3E;Security is hard in the best case. It&#x27;s much harder when you&#x27;re putting the final onus of security on end users who may have thousands or even millions of dollars locked behind a single key. Or when passwords are hard, so you pick an easy one to remember.&#x3C;/p&#x3E;&#x3C;span style=&#x22;font-weight: bold; font-size: smaller; font-style: italic&#x22;&#x3E; Easy Reader Version: in an objective sense, Spaceballs is one of Mel Brooks&#x27; lesser contributions to the parody genre. On the other hand, if you&#x27;re seven years old when you watch it, and are a child obsessed with Star Wars, it&#x27;ll leave a mark in your brain that you can&#x27;t escape. &#x3C;/span&#x3E;&#x3C;div&#x3E; [Advertisement] &#x3C;b&#x3E;Plan Your .NET 9 Migration with Confidence&#x3C;/b&#x3E;&#x3C;br /&#x3E;Your journey to .NET 9 is more than just one decision.Avoid migration migraines with the advice in this free guide. &#x3C;b&#x3E;&#x3C;a href=&#x22;https://inedo.com/support/whitepapers/dotnet-guide?utm_campaign=dotnet&#x26;amp;utm_source=tdwtf-footer&#x22;&#x3E;Download Free Guide Now!&#x3C;/a&#x3E;&#x3C;/b&#x3E;&#x3C;/div&#x3E;&#x3C;div style=&#x22;clear: left;&#x22;&#x3E;&#x3C;/div&#x3E;&#x3C;/div&#x3E;</content:encoded>
</item>
<item>
<title>Representative Line: A Diamond in the Rough</title>
<link>https://thedailywtf.com/articles/a-diamond-in-the-rough</link>
<description>&#x3C;div&#x3E;&#x3C;p&#x3E;&#x3C;strong&#x3E;Mandy&#x3C;/strong&#x3E;&#x27;s co-worker recently learned about virtual inheritance in C++. It&#x27;s become their new favorite button to push, and they &#x3C;em&#x3E;only&#x3C;/em&#x3E; use virtual inheritance.&#x3C;/p&#x3E;&#x3C;p&#x3E;Virtual inheritance is one workaround for the &#x22;&#x3C;a href=&#x22;https://en.wikipedia.org/wiki/Multiple_inheritance#The_diamond_problem&#x22;&#x3E;diamond problem&#x3C;/a&#x3E;&#x22;, where you have an inheritance tree that &#x22;recombines&#x22; via multiple inheritance: when a child class has a Hapsburg-esque parentage, it&#x27;s hard to decide which inherited methods are being invoked or overridden.&#x3C;/p&#x3E;&#x3C;p&#x3E;In C++, imagine you have class A, which gets derived into classes B and C. Class D then uses multiple inheritance to inherit from B and C. In practice, this means that D inherits from A twice, and would have two internal copies of all of A&#x27;s members.&#x3C;/p&#x3E;&#x3C;p&#x3E;If, on the other hand, you have B and C inherit &#x3C;em&#x3E;virtually&#x3C;/em&#x3E; (&#x3C;code&#x3E;class B : public virtual A&#x3C;/code&#x3E;), then class D will only actually inherit a single copy of A.&#x3C;/p&#x3E;&#x3C;p&#x3E;If you&#x27;re reading this and going, &#x22;Boy, this just sounds like another reason to avoid multiple inheritance,&#x22; you&#x27;re probably right. The important thing, though, is inheriting virtually &#x3C;em&#x3E;impacts how your child classes&#x3C;/em&#x3E; will inherit. It only matters if you have child classes.&#x3C;/p&#x3E;&#x3C;p&#x3E;Which brings us back to Mandy&#x27;s co-worker. He read somewhere that defaulting to virtual inheritance all the time was safer, so he did that all the time. &#x3C;em&#x3E;All. The. Time&#x3C;/em&#x3E;.&#x3C;/p&#x3E;&#x3C;p&#x3E;Including in this case:&#x3C;/p&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;language-cpp&#x22;&#x3E;&#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;class&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-title class_&#x22;&#x3E;SomeSpecificDerivedClass&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;final&#x3C;/span&#x3E; : &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;public&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;virtual&#x3C;/span&#x3E; SomeBaseClass
&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;p&#x3E;The class here is marked &#x3C;code&#x3E;final&#x3C;/code&#x3E;. It can&#x27;t be inherited from. The use of &#x3C;code&#x3E;virtual&#x3C;/code&#x3E; accomplishes nothing.&#x3C;/p&#x3E;&#x3C;span style=&#x22;font-weight: bold; font-size: smaller; font-style: italic&#x22;&#x3E; Easy Reader Version: Now that C++ has concepts, that&#x27;s a much easier way to get type safety without loads of weird inheritance trees. &#x3C;/span&#x3E;&#x3C;div&#x3E;&#x3C;img src=&#x22;https://thedailywtf.com/images/inedo/buildmaster-icon.png&#x22; style=&#x22;display:block; float: left; margin: 0 10px 10px 0;&#x22; /&#x3E; [Advertisement] &#x3C;a href=&#x22;https://inedo.com/BuildMaster?utm_source=tdwtf&#x26;amp;utm_medium=footerad&#x26;amp;utm_term=2018&#x26;amp;utm_content=Self_Service&#x26;amp;utm_campaign=Buildmaster_Footer&#x22;&#x3E;BuildMaster&#x3C;/a&#x3E; allows you to create a self-service release management platform that allows different teams to manage their applications. &#x3C;a href=&#x22;https://inedo.com/BuildMaster/download?utm_source=tdwtf&#x26;amp;utm_medium=footerad&#x26;amp;utm_term=2018&#x26;amp;utm_content=Self_Service&#x26;amp;utm_campaign=Buildmaster_Footer&#x22;&#x3E;Explore how!&#x3C;/a&#x3E;&#x3C;/div&#x3E;&#x3C;div style=&#x22;clear: left;&#x22;&#x3E;&#x3C;/div&#x3E;&#x3C;/div&#x3E;</description>
<category>Representative Line</category>
<guid isPermaLink="true">https://thedailywtf.com/articles/a-diamond-in-the-rough</guid>
<pubDate>Wed, 14 Oct 2026 06:30:00 GMT</pubDate>
<content:encoded>&#x3C;div&#x3E;&#x3C;p&#x3E;&#x3C;strong&#x3E;Mandy&#x3C;/strong&#x3E;&#x27;s co-worker recently learned about virtual inheritance in C++. It&#x27;s become their new favorite button to push, and they &#x3C;em&#x3E;only&#x3C;/em&#x3E; use virtual inheritance.&#x3C;/p&#x3E;&#x3C;p&#x3E;Virtual inheritance is one workaround for the &#x22;&#x3C;a href=&#x22;https://en.wikipedia.org/wiki/Multiple_inheritance#The_diamond_problem&#x22;&#x3E;diamond problem&#x3C;/a&#x3E;&#x22;, where you have an inheritance tree that &#x22;recombines&#x22; via multiple inheritance: when a child class has a Hapsburg-esque parentage, it&#x27;s hard to decide which inherited methods are being invoked or overridden.&#x3C;/p&#x3E;&#x3C;p&#x3E;In C++, imagine you have class A, which gets derived into classes B and C. Class D then uses multiple inheritance to inherit from B and C. In practice, this means that D inherits from A twice, and would have two internal copies of all of A&#x27;s members.&#x3C;/p&#x3E;&#x3C;p&#x3E;If, on the other hand, you have B and C inherit &#x3C;em&#x3E;virtually&#x3C;/em&#x3E; (&#x3C;code&#x3E;class B : public virtual A&#x3C;/code&#x3E;), then class D will only actually inherit a single copy of A.&#x3C;/p&#x3E;&#x3C;p&#x3E;If you&#x27;re reading this and going, &#x22;Boy, this just sounds like another reason to avoid multiple inheritance,&#x22; you&#x27;re probably right. The important thing, though, is inheriting virtually &#x3C;em&#x3E;impacts how your child classes&#x3C;/em&#x3E; will inherit. It only matters if you have child classes.&#x3C;/p&#x3E;&#x3C;p&#x3E;Which brings us back to Mandy&#x27;s co-worker. He read somewhere that defaulting to virtual inheritance all the time was safer, so he did that all the time. &#x3C;em&#x3E;All. The. Time&#x3C;/em&#x3E;.&#x3C;/p&#x3E;&#x3C;p&#x3E;Including in this case:&#x3C;/p&#x3E;&#x3C;pre&#x3E;&#x3C;code class=&#x22;language-cpp&#x22;&#x3E;&#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;class&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-title class_&#x22;&#x3E;SomeSpecificDerivedClass&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;final&#x3C;/span&#x3E; : &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;public&#x3C;/span&#x3E; &#x3C;span class=&#x22;hljs-keyword&#x22;&#x3E;virtual&#x3C;/span&#x3E; SomeBaseClass
&#x3C;/code&#x3E;&#x3C;/pre&#x3E;&#x3C;p&#x3E;The class here is marked &#x3C;code&#x3E;final&#x3C;/code&#x3E;. It can&#x27;t be inherited from. The use of &#x3C;code&#x3E;virtual&#x3C;/code&#x3E; accomplishes nothing.&#x3C;/p&#x3E;&#x3C;span style=&#x22;font-weight: bold; font-size: smaller; font-style: italic&#x22;&#x3E; Easy Reader Version: Now that C++ has concepts, that&#x27;s a much easier way to get type safety without loads of weird inheritance trees. &#x3C;/span&#x3E;&#x3C;div&#x3E;&#x3C;img src=&#x22;https://thedailywtf.com/images/inedo/buildmaster-icon.png&#x22; style=&#x22;display:block; float: left; margin: 0 10px 10px 0;&#x22; /&#x3E; [Advertisement] &#x3C;a href=&#x22;https://inedo.com/BuildMaster?utm_source=tdwtf&#x26;amp;utm_medium=footerad&#x26;amp;utm_term=2018&#x26;amp;utm_content=Self_Service&#x26;amp;utm_campaign=Buildmaster_Footer&#x22;&#x3E;BuildMaster&#x3C;/a&#x3E; allows you to create a self-service release management platform that allows different teams to manage their applications. &#x3C;a href=&#x22;https://inedo.com/BuildMaster/download?utm_source=tdwtf&#x26;amp;utm_medium=footerad&#x26;amp;utm_term=2018&#x26;amp;utm_content=Self_Service&#x26;amp;utm_campaign=Buildmaster_Footer&#x22;&#x3E;Explore how!&#x3C;/a&#x3E;&#x3C;/div&#x3E;&#x3C;div style=&#x22;clear: left;&#x22;&#x3E;&#x3C;/div&#x3E;&#x3C;/div&#x3E;</content:encoded>
</item>
</channel>
</rss>