<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Incident-Response on Schallberts Blog</title><link>https://blog.schallbert.de/tags/incident-response/</link><description>Recent content in Incident-Response on Schallberts Blog</description><generator>Hugo</generator><language>de</language><lastBuildDate>Wed, 21 Oct 2026</lastBuildDate><atom:link href="https://blog.schallbert.de/tags/incident-response/index.xml" rel="self" type="application/rss+xml"/><item><title>PHP2shell: Kritische Sicherheitslücken</title><link>https://blog.schallbert.de/php2shell-critical-vulnerability-rce/</link><pubDate>Wed, 21 Oct 2026</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/php2shell-critical-vulnerability-rce/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2026-10-21-php2shell-cover.avif"&#10; class="post-cover"&#10; alt="Image: The logo for php2shell. It is blue, block-like pixel text on black background."&#10; title="PHP2shell: Kritische Sicherheitslücken" /&gt;&#10;&lt;h2 id="schritt-1-erkennen-wir-haben-ein-problem"&gt;Schritt 1 Erkennen: Wir haben ein Problem.&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;TLDR&lt;/strong&gt;: PHP hat ganz aktuell &lt;a href="https://www.php.net/archive/2026.php#2026-10-20-1" target="_blank" rel="noopener noreferrer" class="external-link"&gt;zwei kritische Schwachstellen&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;, die Remote Code Execution ermöglichen. Ihre IDs: &lt;a href="https://cert.europa.eu/publications/security-advisories/2026-018/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;CVE-2026-109618 und CVE-2026-109619&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;. Da ihre Ursachen nicht im Frontend sondern in der Engine stecken, hilft nur ein Update auf &lt;a href="https://watchtowr.com/intelligence/php-cve-2026-109618-faq/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;PHP 8.5.12, 8.4.27, 8.3.36, oder 8.2.35&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&#10;&lt;figure class="media-frame media-frame--center"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2026-10-21-phps-php2shell-notice.avif" alt="Image: Screenshot of the PHP News Archive webpage on 21-Oct-2026 about a critical vulnerability allowing Remote Code Execution if exploited even before any application code runs."&gt;&lt;/figure&gt;&#10;&lt;p&gt;&amp;ldquo;&lt;a href="https://www.php.net/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;PHP&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; nutze ich nicht auf &lt;a href="https://blog.schallbert.de/projects/migrating-jekyll-to-hugo/"&gt;meiner Website&lt;/a&gt;&amp;rdquo;, denke ich, als ich heute Vormittag die folgende Nachricht erhalte:&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&amp;ldquo;Hi, kurzer Hinweis: Gegebenenfalls [&amp;hellip;] alles was php nutzt, erstmal abklemmen, [&amp;hellip;] Patch kommt später heute.&amp;rdquo;&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;Oder bin ich doch betroffen&amp;hellip;? Immerhin nutze ich eine managed Nextcloud-Instanz, und &lt;a href="https://docs.nextcloud.com/server/stable/developer_manual/getting_started/glossary.html" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Nextcloud ist doch u.A. in &lt;em&gt;PHP&lt;/em&gt; geschrieben&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;&amp;hellip;? Während ich diese Zeilen schreibe, &lt;a href="https://github.com/nextcloud/all-in-one/releases/tag/v14.4.1" target="_blank" rel="noopener noreferrer" class="external-link"&gt;wird ein Fix für Nextcloud verfügbar&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;. Alles muss also sehr schnell gehen. Heute werden unter Garantie viele Überstunden gemacht.&lt;/p&gt;&#10;&lt;h3 id="status-21102026-1030-mesz"&gt;Status 21.10.2026, 10:30 MESZ&lt;/h3&gt;&#10;&lt;p&gt;Spulen wir zehn Stunden zurück. Es gibt noch keinen Fix. Die Information über die CVEs wurde geleakt und ist jetzt selbst bereits ein paar Stunden alt. Laut &lt;a href="https://en.wikipedia.org/wiki/PHP2Shell" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Wikipedia nutzen &lt;code&gt;69%&lt;/code&gt; aller Websites PHP&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;. Das Ausnutzen einer so hochkritischen Lücke (&lt;a href="https://blog.schallbert.de/gitea-critical-vulnerability-active-exploitation-rce/#cvss-scoring"&gt;Score&lt;/a&gt; &lt;code&gt;9.2&lt;/code&gt;) bei einer derart weitverbreiteten Technologie hat erwartbar massive Auswirkungen. Entsprechend nervös ist &amp;ldquo;das Internet&amp;rdquo;.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&amp;ldquo;[&amp;hellip;] organisations should consider isolating internet-facing applications from public networks until a fix is applied and verified. &lt;a href="https://cert.europa.eu/publications/security-advisories/2026-018/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;CERT-EU&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;, pulled 21.10.2026, 10:40&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;Interessant, die Empfehlung ist also ernsthaft &amp;ldquo;erstmal vom Netz nehmen&amp;rdquo;.&lt;/p&gt;&#10;&lt;h2 id="schritt-2-sofortmaßnahmen-nextcloud-vom-netz-trennen"&gt;Schritt 2 Sofortmaßnahmen: Nextcloud vom Netz trennen&lt;/h2&gt;&#10;&lt;p&gt;Um einem möglichen Angriff zuvor zu kommen versuche ich folglich, meine Instanz vom Netz zu nehmen. Dafür logge ich mich bei meinem Hoster ein, wechsle auf das Tab &amp;ldquo;Einstellungen&amp;rdquo;, und klicke auf den Reiter &lt;code&gt;ownCloud Console&lt;/code&gt;. Dies ist Nextclouds command-line interface.&lt;/p&gt;&#10;&lt;p&gt;Dort muss ich feststellen, dass kein Befehl zum Abschalten oder de-publishing zur Verfügung steht. Also wähle ich den Nächstbesten:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;occ maintenance:mode --on&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ich versetze meine Instanz also &lt;a href="https://docs.nextcloud.com/server/stable/admin_manual/maintenance/backup.html#maintenance-mode" target="_blank" rel="noopener noreferrer" class="external-link"&gt;in den Wartungsmodus&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;. Dies verhindert neue Logins und friert die Datenbank ein. Anschließend lese ich mich ein wenig in die CVEs ein um herauszufinden, ob mein Schritt genügt.&lt;/p&gt;&#10;&lt;p&gt;Tut er wohl nicht.&lt;/p&gt;&#10;&lt;p&gt;In verschiedenen Foren und auf &lt;a href="https://thehackernews.com/2026/10/php2shell-two-unpatched-critical-php.html" target="_blank" rel="noopener noreferrer" class="external-link"&gt;HackerNews&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; erfahre ich, dass eine nicht authentisierte Anfrage bereits den Angriff auslösen kann, bevor überhaupt PHP-Code auf der Serverseite ausgeführt wird.&lt;/p&gt;&#10;&lt;p&gt;Es ist also egal, in welchen Zustand ich meine Instanz versetze - solange sie am Netz ist, bleibt sie angreifbar.&lt;/p&gt;&#10;&lt;h2 id="schritt-3-vorläufige-eindämmung-nextcloud-instanz-deaktivieren-lassen"&gt;Schritt 3 Vorläufige Eindämmung: Nextcloud-Instanz deaktivieren lassen&lt;/h2&gt;&#10;&lt;p&gt;Ich finde auch mit Hilfe diverser Online-Suchanfragen keinen Weg, meine mangaged-Instanz abzuschalten. Ich überlege kurz, die Namensauflösung und das DNS-Routing zu killen. Mir wird aber schnell klar: Bis sich das durchpropagiert, ist der Fix längst draußen.&lt;/p&gt;&#10;&lt;h3 id="status-21102026-1143-mesz"&gt;Status 21.10.2026 11:43 MESZ&lt;/h3&gt;&#10;&lt;p&gt;Ich schreibe also ein Support-Ticket an meinen Hoster mit der Bitte um Hilfe beim Herunternehmen meiner Instanz.&lt;/p&gt;&#10;&lt;figure class="media-frame media-frame--right"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2026-10-21-hoster-response-takedown.avif" alt="Image: Screenshot of an E-mail from my hoster, stating that my Nextcloud instance has been deactivated until a patch is available and in place."&gt;&lt;/figure&gt;&#10;&lt;h3 id="status-21102026-1201-mesz"&gt;Status 21.10.2026 12:01 MESZ&lt;/h3&gt;&#10;&lt;p&gt;Ich erhalte eine Mail vom Hoster!&lt;/p&gt;&#10;&lt;p&gt;Tatsache, ich kann die Instanz nicht mehr erreichen und erhalte eine &lt;code&gt;ERR_CERT_COMMON_NAME_INVALID&lt;/code&gt;-Meldung. Klicke ich diese weg, erscheint &lt;strong&gt;REQUESTED PAGE LOCKED&lt;/strong&gt;. Gute Arbeit. Die Reaktionszeit meines Anbieters inlusive Rückmeldung an den Kunden betrug &lt;code&gt;18min&lt;/code&gt;.&lt;/p&gt;&#10;&lt;figure class="media-frame media-frame--center"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2026-10-21-instance-locked.avif" alt="Image: A flatscreen showing a &amp;#39;no entry&amp;#39; symbol, connected to multiple small boxes that look like mini servers. Image caption says &amp;#39;Requested page locked&amp;#39;."&gt;&lt;/figure&gt;&#10;&lt;p&gt;Nun wechsle ich den Modus vom Akteur zum Beobachter. Ich sehe erste Exploit-Versuche (oder zumindest Beteuerungen davon) im Web und muss an eine Folie eines Vortrages denken (Zeitstempel &lt;code&gt;11:24&lt;/code&gt;), den ich vor kurzem gesehen habe: &lt;a href="https://kernel-recipes.org/en/2026/security-in-the-llm-age/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Security in the LLM age&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;Dort zeigt ein Linux-Kernel Sachverständiger, dass wir in 2026 im Schnitt sieben Tage &lt;em&gt;vor&lt;/em&gt; einem Patch in betroffener Software bereits Exploits in freier Wildbahn sehen.&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-log" data-lang="log"&gt;discover --&amp;gt; disclose --&amp;gt; patch --&amp;gt; deploy&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Diese traditionelle Ereigniskette funktioniert nur bei &amp;ldquo;langsamen&amp;rdquo; Angreifern gut. Wir benötigen etwas, um wieder vor die Lage zu kommen.&lt;/p&gt;&#10;&lt;h2 id="schritt-4-beobachten-der-situation-verfügbarkeit-des-patches-einspielen-erster-betreiber"&gt;Schritt 4 Beobachten der Situation: Verfügbarkeit des Patches, Einspielen erster Betreiber&lt;/h2&gt;&#10;&lt;p&gt;Laut &lt;a href="https://thehackernews.com/2026/10/php-issues-emergency-patches-for-two.html" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Hackernews&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; wird der Patch um etwa &lt;strong&gt;16:00 MESZ&lt;/strong&gt; verfügbar. Ich besorge mir den RSS-Feed meines Hosters und warte auf Meldung.&lt;/p&gt;&#10;&lt;h3 id="status-21102026-1420-mesz"&gt;Status 21.10.2026 14:20 MESZ&lt;/h3&gt;&#10;&lt;p&gt;Auch das Bundesamt für Sicherheit in der Informationstechnik hat einen &lt;a href="https://www.bsi.bund.de/SharedDocs/Cybersicherheitswarnungen/DE/2026/2026-297981-1032.pdf?__blob=publicationFile&amp;amp;v=4" target="_blank" rel="noopener noreferrer" class="external-link"&gt;BSI-IT-Sicherheitshinweis&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; herausgegeben, wo mit der &amp;ldquo;Kritikalität 3/Orange&amp;rdquo; vor der Lücke gewarnt und folgendes angemerkt wird:&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&amp;ldquo;Der Patch für die Schwachstelle ist heute 16 Uhr deutscher Zeit (14:00 UTC) angekündigt und sollte unverzüglich zu diesem Zeitpunkt installiert werden.&amp;rdquo; - BSI, 21.10.2026&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;figure class="media-frame media-frame--right"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2026-10-21-hoster-vulnerability-notice.avif" alt="Image: Screenshot of my hoster&amp;#39;s notification feed for the PHP vulnerabilities in question. There are multiple entries at different points in time, all dated 21-Oct-2026."&gt;&lt;/figure&gt;&#10;&lt;h3 id="status-21102026-1634-mesz"&gt;Status 21.10.2026 16:34 MESZ&lt;/h3&gt;&#10;&lt;p&gt;Mein Hoster &lt;a href="https://status.hetzner.com/de/incident/f4144d55-38c3-48d1-8664-7a3429355cd7" target="_blank" rel="noopener noreferrer" class="external-link"&gt;meldet, dass die Patches nun verfügbar seien&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; und mit der Implementierung begonnen würde. Betroffen sind nicht nur die Nextcloud-Instanzen, sondern auch seine komplette Administrationsoberfläche sowie sein Webmailer.&lt;/p&gt;&#10;&lt;h3 id="status-21102026-1952-mesz"&gt;Status 21.10.2026 19:52 MESZ&lt;/h3&gt;&#10;&lt;p&gt;Mein Hoster meldet Vollzug für die von ihm betriebenen Webhosting-Angebote und Managed Servers.&lt;/p&gt;&#10;&lt;h3 id="status-21102026-2240-mesz"&gt;Status 21.10.2026 22:40 MESZ&lt;/h3&gt;&#10;&lt;p&gt;Die Hetzner-Anwendung &lt;em&gt;KonsoleH&lt;/em&gt;, über die ich meine Nextcloud-Instanz verwalte, ist down.&lt;/p&gt;&#10;&lt;h3 id="status-21102026-2300-mesz"&gt;Status 21.10.2026 23:00 MESZ&lt;/h3&gt;&#10;&lt;p&gt;&lt;em&gt;KonsoleH&lt;/em&gt; ist wieder live (und gepatcht).&lt;/p&gt;&#10;&lt;h2 id="schritt-5-erkenntnis-und-schlussfolgerung"&gt;Schritt 5 Erkenntnis und Schlussfolgerung&lt;/h2&gt;&#10;&lt;p&gt;Was lerne ich aus den Ereignissen dieses turbulenten Tages? Wie gehe ich in Zukunft mit Sicherheitslücken um? Und wie erkenne ich überhaupt, dass ein Problem vorliegt?&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Nicht nur der Service als Ganzes ist angreifbar sondern auch seine Komponenten. &amp;ndash;&amp;gt; Kenne alle Komponenten und achte auf Schwachstellen und Patches!&lt;/li&gt;&#10;&lt;li&gt;Die Gegenspieler sind (durch LLMs) unglaublich schnell geworden. &amp;ndash;&amp;gt; Rechne mit Exploit vor Patch-Verfügbarkeit!&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Eine Liste geeigneter Quellen für Verwundbarkeiten, Neuigkeiten und Patches stelle ich mir gerade zusammen. Sobald die Liste stabil ist, werde ich darüber berichten.&lt;/p&gt;&#10;&lt;h2 id="schritt-6-aktionen"&gt;Schritt 6 Aktionen&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Sensible Daten wenn möglich aus dem Netz nehmen. Gedankengang: Was wäre, wenn das weg kommt? Reicht Verfügbarkeit im LAN/Intranet?&lt;/li&gt;&#10;&lt;li&gt;Besseres Monitoring und Abuse detection sind nur konsequent: Früh erkennen, früh sperren, früh melden, früh abschalten, sofort patchen.&lt;/li&gt;&#10;&lt;li&gt;Standardbezugsquellen für Informationen zu verwendeter Software besorgen. CVE-List-Scanner bauen? HackerNews-Filter?&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="nachtrag-22102026-0930-mesz"&gt;Nachtrag: 22.10.2026 09:30 MESZ&lt;/h3&gt;&#10;&lt;p&gt;Der Hoster hat meine Nextcloud-Instanz gepatcht und wieder online genommen. Alle Systeme normal. Es gibt nun auch einen &lt;a href="https://de.wikipedia.org/wiki/PHP2Shell" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Wikipedia-Eintrag&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; zum Thema, der sehr aktuell gehalten wird.&lt;/p&gt;&#10;&lt;h2 id="schritt-7-erste-reflektion"&gt;Schritt 7 Erste Reflektion&lt;/h2&gt;&#10;&lt;p&gt;Nun sind ein paar Tage ins Land gegangen, seitdem die beiden Sicherheitslücken öffentlichkeiswirksam bekanntgemacht und Patches bereitgestellt wurden. Werfen wir mal einen Blick in die Netzlandschaft.&lt;/p&gt;&#10;&lt;h3 id="status-24102026-1630-mesz"&gt;Status 24.10.2026 16:30 MESZ&lt;/h3&gt;&#10;&lt;p&gt;Es gibt inzwischen viele, viele Machbarkeitsnachweise (PoC, Proof of Concept) für und über die Ausnutzung der PHP-Sicherheitslücken, &lt;a href="https://github.com/search?q=php2shell&amp;amp;type=repositories" target="_blank" rel="noopener noreferrer" class="external-link"&gt;allem voran auf der Plattform Github&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;Ich selbst bin leider auf dem Themenfeld nicht sachkundig und muss mich auf die Einschätzung anderer verlassen, was Qualität dieser PoCs angeht, wie die es um die Ausnutzbarkeit in der freien Wildbahn wirklich bestellt ist und was die Hintergründe dazu betrifft, dass ausgerechnet diese Lücke medial so starke Resonanz zu erfahren scheint.&lt;/p&gt;&#10;&lt;p&gt;Im Allgemeinen gilt selbstverständlich &lt;strong&gt;&amp;ldquo;Erst patchen, dann nachfragen&amp;rdquo;&lt;/strong&gt;. So habe ich es ja auch gemacht. Wenn ich noch einmal Felix von Leitner zitieren darf:&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&amp;ldquo;Eine der Lektionen aus 20 Jahren Arbeit im Security-Umfeld ist, dass wenn einer behauptet, es gibt einen Bug, und der andere behauptet, der sei aber nicht exploitbar, dass sich dann im Nachhinein so gut wie immer raustellt, dass der doch exploitbar war.&amp;rdquo; - Feliks von Leitner aka &lt;a href="https://codeberg.org/tomas-jakobs/fefe-blog-backup/src/branch/main/content/2014/04" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Fefe, 12.April 2014&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;, abgerufen am 24.10.2026&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;Zur Ausnutzbarkeit schreibt die sich selbst als Bedrohungsaufklärungsseite &amp;ldquo;Threat intelligence&amp;rdquo; bezeichnende &lt;a href="https://flare.io/learn/resources/blog/php2shell-exploits-underground-analysis" target="_blank" rel="noopener noreferrer" class="external-link"&gt;flare.io&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;, dass die meisten PoCs für PHP2shell nur in der Laborumgebung funktionierten. Auf echte Ziele seien sie kaum anwendbar - endweder, weil Betriebsinterna über die angegriffene Systeme erforderlich seien, weil sie andere Schwachstellen wie die Abschaltung von Speicherrandomisierung voraussetzen, oder weil die PoCs selbst &amp;ldquo;AI-Slop&amp;rdquo; darstellten: schlecht oder kaum validierte, mieserabel geschriebene Software, die mehr verspreche als sie halte.&lt;/p&gt;&#10;&lt;p&gt;Ähnlich äußert sich &lt;a href="https://eliastaylor.com/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;eliastaylor&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;:&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&amp;ldquo;There isn&amp;rsquo;t an easy exploit for this PHP vulnerability.&amp;rdquo; - &lt;a href="https://eliastaylor.com/noexploit/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;https://eliastaylor.com/noexploit/&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;, abgerufen am 24.10.2026&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;Sein Argument ist knapp zehn Stunden nach Veröffentlichung von Angriffsvektor und Patch, dass&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;keiner der Exploit-PoCs funktioniert, nicht einmal bei einer Standardinstallation und -Konfiguration von Pre-Patch-PHP&lt;/li&gt;&#10;&lt;li&gt;die beiden CVEs weit weniger kritisch sind als andere Sicherheitslücken der Geschichte (&lt;a href="https://en.wikipedia.org/wiki/Heartbleed" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Heartbleed&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; bei Open SSL wird exemplarisch genannt)&lt;/li&gt;&#10;&lt;li&gt;die Exploits alle nicht von echten Leuten handgeschrieben, sondern mit Hilfe von LLMs generiert seien&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Der Kern der Argumentation geht dahin, dass Leute ihre Denkarbeit an Sprachmodelle abgäben und selbst gar nicht mehr prüften, ob das System tut was es sagt; geschweige denn den vom System geschriebenen Code läsen, verstünden und verbesserten. Bösartige Botnets würden noch immer von Menschen handgeschrieben, und das brauche seine Zeit, wenn die Lücken nicht offensichtlich und trivial auszunutzen seien.&lt;/p&gt;&#10;&lt;p&gt;Als kleine Übung für eine eigene Einschätzung der Lage empfehle ich die Lektüre der &amp;ldquo;Issue&amp;rdquo;-Diskussionen, die bei vielen PHP2Shell-PoCs auf Github öffentlich bereitstehen.&lt;/p&gt;&#10;&lt;p&gt;Das Große Medienecho hat aber auch etwas Gutes: &lt;a href="https://phpvulnerabilities.app/affected-products/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Die Welt patcht anscheinend schnell&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;. Ich habe mir die Resonanz auf diversen Foren, deutschen und internationalen, überflogen: Überall treiben Menschen ihre Hoster mit Patches vor sich her, diskutieren miteinander die Auswirkungen und welche betroffenen Anbieter bereits Updates herausgebacht haben.&lt;/p&gt;&#10;&lt;p&gt;Bleibt die Frage offen, wem das Ganze nützt. Ich habe schon ein paar Vermutungen. Für Schlussfolgerungen und meine Urteilsbildung ist es allderings noch zu früh.&lt;/p&gt;&#10;&lt;h3 id="status-27102026-1700-mesz"&gt;Status 27.10.2026 17:00 MESZ&lt;/h3&gt;&#10;&lt;p&gt;Die Sicherheitslücke gilt &lt;a href="https://www.cisa.gov/news-events/alerts/2026/10/26/cisa-adds-two-known-exploited-vulnerabilities-catalog" target="_blank" rel="noopener noreferrer" class="external-link"&gt;offiziell bestätigt als ausgenutzt&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&#10;&lt;h2 id="schritt-8-beobachtungen-analysieren-und-informationskanäle-justieren"&gt;Schritt 8 Beobachtungen analysieren und Informationskanäle justieren&lt;/h2&gt;&#10;&lt;p&gt;Ich lege den Fokus nun auf Berichte zur Ausnutzung der Sicherheitslücken. Die Menge an POCs ist für Einzelpersonen unüberschaubar geworden. Erste Privatpersonen und &lt;a href="https://blog.cloudflare.com/php-ctf/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Firmen wie Cloudflare&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; haben begonnen, ein &lt;a href="https://en.wikipedia.org/wiki/Capture_the_flag_%28cybersecurity%29-Wettbewerbe" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Capture The Flag&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; auszuloben: Sie stellen absichtlich angreifbare PHP-Instanzen online und fordern auf, sie zu knacken und dies zu beweisen.&lt;/p&gt;&#10;&lt;p&gt;Ein sehr kluger Schritt, um die Spreu vom Weizen zu trennen. Auf diese Weise müssen die Leute ihre POCs gegen Sparringspartner ins Feld führen, die ihren Stack nicht offenlegen. Als zusätzliche Schwierigkeit fordern einige Anbieter auf, dass vorher außerdem andere ihrer Standard-Abwehrmechanismen wie &lt;a href="https://en.wikipedia.org/wiki/Web_application_firewall" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Web Application Firewalls&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; überwunden werden müssen. Schafft es ein POC hindurch, kann er als als unter realistischen Bedingungen durchgeführte Schwachstellenausnutzung gelten.&lt;/p&gt;&#10;&lt;h3 id="den-poc-verstehen"&gt;Den POC verstehen&lt;/h3&gt;&#10;&lt;p&gt;Ich habe (dank an &lt;a href="https://eliastaylor.com/altmans-cave/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;eliastaylor&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;) den POC gefunden, welcher die &amp;ldquo;StealMyBitcoin&amp;rdquo; &lt;a href="https://github.com/KillaBoi/StealMyBitcoin-PoC/blob/main/stealmybitcoin_poc.py" target="_blank" rel="noopener noreferrer" class="external-link"&gt;PHP2Shell-CTF gelöst hat&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;. Interessant sind sowohl die Kommentare in der Python-Datei über den Mechanismus des Exploits als auch die Diskussion auf Github zu Modellvariante, Prompt und Konfiguration des verwendeten LLM.&lt;/p&gt;&#10;&lt;p&gt;Ich verstehe die Quellen und Kommentare rund um diesen POC so, dass er die Probleme der vorigen Versuche elegant löst:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;PHP beim Multipart-Upload effektiv in die Speicherklemme bringen: Anstatt tausende Anfragen in kürzester Zeit zu senden (und zu hoffen, dass er den &amp;ldquo;richtigen&amp;rdquo; Worker-Thread trifft), verwendet diese Attacke &amp;ldquo;deeply nested field names&amp;rdquo;&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;, welche die Payload gering, jedoch den Speicheraufwand mit nur einer Anfrage serverseitig explodieren lassen.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Dies geht gegen die Lücke &lt;code&gt;CVE-2026-109618&lt;/code&gt; &amp;ldquo;out-of-memory handling can interrupt PHP while internal request data is only partially initialized. Request cleanup may then treat the invalid data as valid&amp;rdquo;. Ziel des &lt;a href="https://github.com/KillaBoi/StealMyBitcoin-PoC/blob/f394a6065f01f0afd48b867404017de01cd9811b/stealmybitcoin_poc.py#L228" target="_blank" rel="noopener noreferrer" class="external-link"&gt;&lt;code&gt;heap_consumer&lt;/code&gt;&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; ist es nun, die herumliegenden, durch den Speicherüberlauf abgelaufene Daten zu manipulieren.&lt;/p&gt;&#10;&lt;ol start="2"&gt;&#10;&lt;li&gt;ASLR, randomisiertes Ablegen im Speicher umgehen: Anstatt ASLR im Feld zu ignorieren (oder in der Laborumgebung schlicht abzuschalten) müssen Speicherüberlauf, Manipulation und erneute Anfrage zum Einlesen der manipulierten Daten zwingend in derselben Session und auf demselben, überlasteten Worker geschehen&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;. Ansonsten ist der betroffene Speicherbereich kaum wiederzufinden und wird irgendwann durch das System, welches den gestoppten Worker entdeckt, zurückgesetzt. Daher muss der Exploit den Schadcode bereits platziert haben, wenn PHP den zugehörigen Destruktor aufruft und damit schließlich die RCE ausführt.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Dies geht dann gegen die Zweite CVE im Bunde: &lt;code&gt;CVE-2026-109619&lt;/code&gt; &amp;ldquo;request-owned internal state can survive after its backing memory has been freed. A later request handled by the same worker may use that stale state before normal initialization resets it.&amp;rdquo;&lt;/p&gt;&#10;&lt;p&gt;Wäre jetzt cool hierzu mal eine PHP-Engine-Sachverständige zu hören :)&lt;/p&gt;&#10;&lt;p&gt;Damit steht auch der dunklen Seite in der Breite ein Exploit zur Verfügung, der bei &amp;ldquo;einfachen Zielen&amp;rdquo; ohne Härtung eine (automatisierte) Ausnutzung machbar erscheinen lässt.&lt;/p&gt;&#10;&lt;h3 id="härtung"&gt;Härtung&lt;/h3&gt;&#10;&lt;p&gt;Lösen kann das Problem nur der Patch. Folgende Härtungsmaßnahmen können gegen diesen speziellen Angriffsvektor zumindest den Widerstand erhöhen:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Das Kommando &lt;code&gt;PHP_SESSION_UPLOAD_PROGRESS&lt;/code&gt;, durch den der Angriff durchgeführt wird, gar nicht erst anbieten oder aber keine Anfragen in sehr kurzer Abfolge, in derselben Session, oder von derselben Maschine zulassen.&lt;/li&gt;&#10;&lt;li&gt;Die Anzahl Worker auf Maximum drehen, auch wenn dies auf die Leistung der Maschine geht. Dies macht das Wiedereinfangen und Ausnutzen desjenigen Workers schwieriger, welcher zuvor korrumpiert wurde.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="später-am-selben-tag"&gt;Später am selben Tag&lt;/h3&gt;&#10;&lt;p&gt;&lt;a href="https://thehackernews.com/2026/10/cisa-confirms-active-exploitation-of.html" target="_blank" rel="noopener noreferrer" class="external-link"&gt;The Hacker News&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; bestätigt die Ausnutzung und zählt betroffene Firmen bzw. Großkonzerne und Lieferanten auf. Der Tenor: Patchen, patchen, patchen!&lt;/p&gt;&#10;&lt;h2 id="status-28102026-2130-mesz"&gt;Status 28.10.2026 21:30 MESZ&lt;/h2&gt;&#10;&lt;p&gt;Cloudflare hat inzwischen neue Firewall-Regeln für &lt;a href="https://developers.cloudflare.com/waf/change-log/changelog/#2026-10-28" target="_blank" rel="noopener noreferrer" class="external-link"&gt;ihre WAF&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; veröffentlicht, die Angreifende schon vor Erreichen der Zielserver abfangen soll. &lt;a href="https://thehackernews.com/2026/10/php2shell-attack-roots-25-servers.html" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Hackernews&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; berichtet über konkrete Vorfälle mit ersten Schäden. &lt;a href="https://thehackernews.com/2026/10/attackers-exploit-php2shell-flaws-in.html" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Threat intelligence Firmen&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; bestätigen dies.&lt;/p&gt;&#10;&lt;p&gt;Zum Abrunden des Status hier noch eine &lt;a href="https://yourmom2shell.com/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;nette Sammlungsseite mit Informationen über x-2-shell-Schwachstellen&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&#10;&lt;div class="footnotes" role="doc-endnotes"&gt;&#10;&lt;hr&gt;&#10;&lt;ol&gt;&#10;&lt;li id="fn:1"&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/KillaBoi/StealMyBitcoin-PoC/blob/f394a6065f01f0afd48b867404017de01cd9811b/stealmybitcoin_poc.py#L218" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Quelle: Exploit-Code&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li id="fn:2"&gt;&#10;&lt;p&gt;&lt;a href="https://infosecmonkey.com/php2shell-cve-2026-109618-109619-explained/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Quelle: infosecmonkey.com&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>Kritische Schwachstellen bei Gitea (und Forgejo)</title><link>https://blog.schallbert.de/gitea-critical-vulnerability-active-exploitation-rce/</link><pubDate>Sun, 04 Oct 2026</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/gitea-critical-vulnerability-active-exploitation-rce/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2026-10-04-gitea-lower-than-V27-vulnerable-cve.avif"&#10; class="post-cover"&#10; alt="Image: The logo of Gitea, a cup of tea. It is boiling hot, and steam is emanating from the cup&amp;#39;s contents. In one of the steam clouds, there is a Jolly Roger. The image caption says &amp;#39;Gitea "&#10; title="Kritische Schwachstellen bei Gitea (und Forgejo)" /&gt;&#10;&lt;aside class="update-box update-box--error" role="note"&gt;&#10; &lt;span class="update-box__icon" aria-hidden="true"&gt;&#10; ⛔&#10; &lt;/span&gt;&#10;&#10; &lt;div class="update-box__body"&gt;&#10; &lt;div class="update-box__heading"&gt;&#10; &lt;strong class="update-box__title"&gt;&#10; &#10; Update: Forgejo v16.0.4 und abwärts ebenfalls betroffen&#10; &#10; &lt;/strong&gt;&#10;&#10; &lt;time datetime="2026-10-02T00:00:00Z"&gt;&#10; 02. Okt. 2026&#10; &lt;/time&gt;&#10; &#10; &lt;/div&gt;&#10;&#10; &#10; &lt;div class="update-box__content"&gt;&#10; Die &lt;a href="https://forgejo.org/releases/16.x/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Release notes&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; lesend, betrachte ich die Software-Forge-Lösung &lt;a href="https://forgejo.org/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Forgejo&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; (ein Fork von Gitea) als ebenfalls von den unten beschriebenen CVEs betroffen. Erst mit v16.0.5 vom 17.09.2026 aufwärts sind sämtliche in diesem Artikel diskutierten CVEs behoben. Kommt im Artikel also das Wort &amp;lsquo;Gitea&amp;rsquo; vor, ist Forgejo ausdrücklich mitgemeint.&#10; &lt;/div&gt;&#10; &#10; &lt;/div&gt;&#10;&lt;/aside&gt;&#10;&lt;h2 id="gewahrwerdung"&gt;Gewahrwerdung&lt;/h2&gt;&#10;&lt;p&gt;Wie so oft beginnt auch diese Geschichte mit einem Netzwerk der menschlichen Kommunikation. Dieser &lt;a href="https://blog.schallbert.de/gitea-critical-vulnerability-active-exploitation-rce/#credits"&gt;unersetzliche Austausch&lt;/a&gt; hat schon viel zur Sicherheit der Software beigetragen, mit der ich diesen Blog betreibe. Nun kann ich eine weitere Sicherheitslücke schließen. Aber der Reihe nach.&lt;/p&gt;&#10;&lt;h3 id="gitea-als-angriffsziel"&gt;Gitea als Angriffsziel&lt;/h3&gt;&#10;&lt;p&gt;Ich hörte, dass die selbst gehostete Versionsverwaltungslösung &lt;a href="https://en.wikipedia.org/wiki/Gitea" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Gitea&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; eines meiner Bekannten Ziel einer Attacke geworden ist. Hierbei wurde eine &lt;a href="https://www.crowdstrike.com/en-us/cybersecurity-101/cyberattacks/remote-code-execution/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;RCE&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; (Remote Code Execution) möglich und tatsächlich auch ausgeführt.&lt;/p&gt;&#10;&lt;h3 id="warum-ist-gitea-ein-attraktives-ziel"&gt;Warum ist Gitea ein attraktives Ziel?&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Diebstahl von (Firmen)geheimnissen: Bei Zugriff auf Repositories ist vertraulicher Quellcode gefährdet, offengelegt zu werden.&lt;/li&gt;&#10;&lt;li&gt;Abfluss von Zugangsdaten: Wird ein größeres Produkt mit Schnittstellen in Gitea verwaltet, sind &lt;a href="https://en.wikipedia.org/wiki/API_key" target="_blank" rel="noopener noreferrer" class="external-link"&gt;API keys&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;, Konten und Passwörter in Gefahr, falls sie unverschlüsselt vorliegen. Abhilfe schaffen Tools wie &lt;a href="https://dev.to/vnjogani/a-guide-to-git-secret-49g3" target="_blank" rel="noopener noreferrer" class="external-link"&gt;git-secret&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;; sie werden aber durch Einführen zusätzlicher Komplexität noch nicht flächendeckend eingesetzt.&lt;/li&gt;&#10;&lt;li&gt;Klassische Rechteeskalation: Unter Umständen kann man durch Ausbruch aus der Gitea-Software die ganze Maschine übernehmen.&lt;/li&gt;&#10;&lt;li&gt;Nutzen des &lt;a href="https://gitea.com/gitea/runner" target="_blank" rel="noopener noreferrer" class="external-link"&gt;runner&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;: Schafft man es den Runner zu kapern, kann man auch ohne erweiterte Rechte Ressourcen der Hostmaschine in Beschlag nehmen und für eigene Zwecke missbrauchen (Stichwort &lt;a href="https://dev.to/golu12/crypto-mining-is-killing-all-free-cicd-platforms-28ip" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Cryptominers in CI/CD&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="was-ist-eine-rce"&gt;Was ist eine RCE?&lt;/h3&gt;&#10;&lt;p&gt;Eine Remote Code Execution ist ein erfolgreicher Angriff, bei dem nicht autorisierter Code ohne Zutun von Besitzer oder Administration der befallenen Ressource aus der Ferne über das Netzwerk eingespielt und ausgeführt werden kann.&lt;/p&gt;&#10;&lt;h2 id="das-gitea-ökosystem"&gt;Das Gitea-Ökosystem&lt;/h2&gt;&#10;&lt;p&gt;Als Versionsverwaltung und &lt;a href="https://en.wikipedia.org/wiki/Forge_%28software%29" target="_blank" rel="noopener noreferrer" class="external-link"&gt;forge&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; gehört zum Basisumfang von Gitea die Möglichkeit, webbasiert und kollaborativ Software zu entwickeln und zu bauen. Daher ist vorgesehen, dass sich Nutzer registrieren und unter Umständen sogar &lt;a href="https://github.com/features/actions" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Aktionen&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; ausführen können, damit Software automatisiert gebaut und/oder ausgeliefert werden kann.&lt;/p&gt;&#10;&lt;p&gt;Genau dieses automatische Nachladen und Ausführen von Code kann böse Folgen haben, wenn Sicherheitslücken in der Verwaltungssoftware selbst bestehen.&lt;/p&gt;&#10;&lt;h3 id="verwundbarkeit-durch-offene-registrierung"&gt;Verwundbarkeit durch offene Registrierung&lt;/h3&gt;&#10;&lt;p&gt;Lässt man als Betreiberin die Registrierung neuer Accounts (&amp;ldquo;self-registration&amp;rdquo;) in Giteas Konfiguration auf dem Standardwert &lt;code&gt;DISABLE_REGISTRATION = false&lt;/code&gt;, so können sich Nutzerinnen selbst einschreiben, eigene Repository anlegen, issues aufmachen und alles tun, was ohne Adminrechte möglich ist.&lt;/p&gt;&#10;&lt;p&gt;Hat man zusätzlich noch den Standardwert &lt;code&gt;REQUIRE_SIGNIN_VIEW = false&lt;/code&gt; gesetzt, können auch unauthentisierte Besucher öffentliche Repositories sehen, die Seiten von Gitea browsen und vor allem die öffentliche &lt;a href="https://docs.gitea.com/api/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;API des Gitea Endpoints&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; ansprechen.&lt;/p&gt;&#10;&lt;h3 id="verwundbarkeit-durch-standardkonfiguration-für-reverse-proxies"&gt;Verwundbarkeit durch Standardkonfiguration für Reverse Proxies&lt;/h3&gt;&#10;&lt;p&gt;In der Standardkonfiguration des Gitea Docker image vertraut Gitea &lt;code&gt;&amp;lt;V1.26.3&lt;/code&gt; allen Proxies.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# gitea/app.ini&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;[security]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;REVERSE_PROXY_LIMIT&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;REVERSE_PROXY_TRUSTED_PROXIES&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;* # This is a vulnerability!&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="die-sicherheitslücken"&gt;Die Sicherheitslücken&lt;/h2&gt;&#10;&lt;p&gt;Womit haben wir es hier zu tun? Mit mehreren kritischen Sicherheitslücken des Ausmaßes &lt;code&gt;9.8/10&lt;/code&gt; &lt;a href="https://www.first.org/cvss/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;CVSS score&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;, von denen es bekannte Fälle der Ausnutzung gibt.&lt;/p&gt;&#10;&lt;figure class="media-frame media-frame--center"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2026-10-04-cvss-calculator.avif" alt="Image: Common vulnerability scoring system calculator. The selectors are switched in a way that reproduces a critical vulnerability over a network vector without user interaction as discussed in this post."&gt;&lt;/figure&gt;&#10;&lt;h3 id="cvss-scoring"&gt;Exkurs: Die CVSS-Bewertung&lt;/h3&gt;&#10;&lt;p&gt;Zur Einordnung der Bewertung von &amp;ldquo;kritisch&amp;rdquo;: Die CVSS-Kriterien sind ähnlich aufgebaut wie in der klassischen Gefahren- und &lt;a href="https://de.wikipedia.org/wiki/Risikoanalyse" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Risikoanalyse&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;, einem Zweig der Ingenieurswissenschaften. Anders als dort liegt der Fokus allerdings nicht in der Analyse möglicher Fehlerfälle, Schweregrad, Eintritts- und Ausfallwahrscheinlichkeit oder Detektierbarkeit, sondern auf dem Schwierigkeitsgrad der Ausnutzung und möglicher Auswirkungen.&lt;/p&gt;&#10;&lt;h3 id="bedeutung-der-cvss-einzelwerte"&gt;Bedeutung der CVSS-Einzelwerte&lt;/h3&gt;&#10;&lt;p&gt;Je höher der CVSS-Wert, desto einfacher ist die Sicherheitslücke auszunutzen und desto gravierender sind mögliche Folgen hinsichtlich der Datensicherheitskriterien (&lt;a href="https://en.wikipedia.org/wiki/CIA_triad" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Confidentiality, Integrity, Availability&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;).&lt;/p&gt;&#10;&lt;p&gt;Das Bild oben zeigt eine Konstellation, in der eine mögliche Attacke aus der Ferne (Netzwerk) mit geringem Aufwand (Complexity, meint Systemhärtung) ohne Randbedingungen (Requirement, z.B. das Anfahren einer vulnerablen Stelle im Code, Vorhandensein eines bestimmten Zustandes des angegriffenen Systems, Auslösen einer &lt;a href="https://en.wikipedia.org/wiki/Race_condition" target="_blank" rel="noopener noreferrer" class="external-link"&gt;race condition&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; etc.), ohne zusätzliche Rechte (als Gast ohne Authentisierung oder Autorisierung) oder Interaktion mit dem User oder der Administratorin des Systems durchgeführt werden kann.&lt;/p&gt;&#10;&lt;p&gt;Das wäre für sich genommen noch nicht schlimm, wenn niemand das System benötigt &lt;code&gt;Score 0.0&lt;/code&gt; und nichts Interessantes darauf gespeichert ist. Liegen dort allerdings sensitive Daten &lt;code&gt;Confidentiality, 8.7&lt;/code&gt; oder zum Beispiel eine Datenbank, deren Werte sich nun manipulieren lassen &lt;code&gt;Integrity, 8.7&lt;/code&gt;, oder wird auch nur die Verfügbarkeit von benötigten Daten eingeschränkt &lt;code&gt;Availability, 8.7&lt;/code&gt;, befindet man sich bereits im Bereich &lt;code&gt;High&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;Mit diesem Wissen nehmen wir nun den Transfer auf die kritischen Lücken von Gitea vor.&lt;/p&gt;&#10;&lt;h3 id="cve-2026-20896-authentication-bug-in-gitea-through-reverse-proxies"&gt;CVE-2026-20896: Authentication bug in Gitea through reverse-proxies&lt;/h3&gt;&#10;&lt;p&gt;Kommt ein Angreifer hinter den Reverse Proxy (oder ist gar kein Reverse Proxy vorgeschaltet), kann er eine Anfrage mit &lt;code&gt;X-WEBAUTH-USER&lt;/code&gt; im Header direkt an die Gitea-Instanz senden und sich für einen Reverse Proxy ausgeben. Ist Gitea gleichzeitig darauf eingestellt, &lt;a href="https://app.opencve.io/cve/CVE-2026-20896" target="_blank" rel="noopener noreferrer" class="external-link"&gt;allen reverse proxies zu vertrauen&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; &lt;code&gt;REVERSE_PROXY_TRUSTED_PROXIES = *&lt;/code&gt;, so geht es davon aus, dass bereits &lt;a href="https://df00tech.com/detections/blog/cve-2026-20896" target="_blank" rel="noopener noreferrer" class="external-link"&gt;authentisiert wurde und eine gültige Session vorliegt&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;. Der Angreifer erhält also Nutzerrechte mit Schreibzugriff auf Repositories, obwohl er nicht mal einen Account angelegt hat.&lt;/p&gt;&#10;&lt;p&gt;Das eigentliche Lücke ist hier das unhinterfragte Vertrauen gegenüber dem Sender des Headers ohne weiteren Abgleich mit einem Session Token oder ähnlichem; das Annehmen desselben von fremden Quellen erzeugt lediglich die Verwundbarkeit.&lt;/p&gt;&#10;&lt;p&gt;Für diesen Bug gibt es &lt;a href="https://www.cloudlinktech.com/news/active-attacks-exploit-critical-gitea-docker-auth-bug/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Belege für bereits erfolgte Attacken&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&#10;&lt;h3 id="cve-2026-59774-file-read-flaw-for-anything-the-gitea-service-account-can-read"&gt;CVE-2026-59774: File-read flaw for anything the Gitea Service Account can read&lt;/h3&gt;&#10;&lt;p&gt;Diese kritische Sicherheitslücke basiert auf einer unzureichenden Eingabeprüfung des &lt;a href="https://docs.gitea.com/next/administration/external-renderers/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;eingebauten Textrenderers von Gitea&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; für &lt;a href="https://en.wikipedia.org/wiki/Org-mode" target="_blank" rel="noopener noreferrer" class="external-link"&gt;org-mode&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; Dateien. Eine detaillierte Beschreibung des Vektors und zu möglichen Wegen eines Angriffs kann auf &lt;a href="https://www.satyamrastogi.com/blog/gitea-org-mode-unauthenticated-file-read-cve-2026-59774/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Saytam Rastogis&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; hervorragendem Blog nachgelesen werden.&lt;/p&gt;&#10;&lt;p&gt;Kurzgesagt kann sich ein Angreifer mit Zugriff auf zumindest ein öffentliches Repository eine bösartige &lt;code&gt;.org&lt;/code&gt;-Datei zusammenbasteln, mit deren Hilfe er Giteas Konfiguration &lt;code&gt;app.ini&lt;/code&gt; auslesen und damit auf darin enthaltene Secrets zugreifen kann, welche ihm erweiterte Rechte zugestehen oder ihn zumindest lateral auf dem System bewegen lassen.&lt;/p&gt;&#10;&lt;p&gt;Dies kann laut &lt;a href="https://thehackernews.com/2026/08/critical-gitea-flaw-let-unauthenticated.html" target="_blank" rel="noopener noreferrer" class="external-link"&gt;hacker news&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; und &lt;a href="https://github.com/go-gitea/gitea/security/advisories/GHSA-6v53-hr58-556r" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Giteas eigenen Leuten&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; zufolge beispielsweise auch dazu ausgenutzt werden, die Registration Token eines Runners auszulesen und selbigen zu übernehmen.&lt;/p&gt;&#10;&lt;h3 id="cve-2026-60004-rce-allowing-attacker-with-ordinary-user-rights-to-execute-arbitrary-shell-commands-as-the-gitea-os-user"&gt;CVE-2026-60004: RCE allowing attacker with ordinary user rights to execute arbitrary shell commands as the Gitea OS user.&lt;/h3&gt;&#10;&lt;p&gt;Diese Sicherheitslücke ist deswegen besonders schlimm, weil sie zusätzlich eine &lt;a href="https://www.thehackerwire.com/vulnerability/CVE-2026-60004/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;privilege escalation ermöglicht&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&amp;ldquo;The vulnerability in question is CVE-2026-60004 (CVSS score: 9.8), a case of remote code execution that allows an attacker with ordinary write access to a repository to execute arbitrary shell commands as the Gitea OS user.&amp;rdquo; &lt;a href="https://thehackernews.com/2026/08/critical-gitea-rce-actively-exploited.html" target="_blank" rel="noopener noreferrer" class="external-link"&gt;thehackernews&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;, Aug-2026&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;Das Ausnutzen dieser Lücke kann den Angreifer also die gesamte Gitea-Instanz übernehmen lassen, sofern er Schreibzugriff auf irgendein (evtl. sogar öffentliches) Repository hat.&lt;/p&gt;&#10;&lt;h2 id="das-lagebild"&gt;Das Lagebild&lt;/h2&gt;&#10;&lt;p&gt;&lt;figure class="media-frame media-frame--right"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2026-10-04-gitea-cve-chaining.avif" alt="Image: A decision tree, connecting the dots between the three discussed CVEs. Baseline message is that the system has to be regarded as compromised in case an attacker is able to get ordinary write access to any repository on the instance which can be done by exploiting any of the discussed CVEs."&gt;&lt;/figure&gt;&#10;Es gibt noch weitere kritische Sicherheitslücken, allerdings könen sich Angreifer mit einer Kombination der obigen Darstellungen ohne großen Aufwand&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Als normale User auf dem Gitea-System bewegen, &lt;em&gt;ohne sich registriert zu haben&lt;/em&gt;, und &lt;em&gt;ohne SSH-Zugriff&lt;/em&gt; zu benötigen&lt;/li&gt;&#10;&lt;li&gt;Sich als Gitea-Service User ausgeben&lt;/li&gt;&#10;&lt;li&gt;Actions übernehmen oder sogar Workflows injizieren und ausführen&lt;/li&gt;&#10;&lt;li&gt;Mit etwas Mehraufwand die gesamte Instanz übernehmen, verschlüsseln, Lösegeld verlangen usw.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Was mein Bekannter erlebt hat betraf die Punkte eins und drei. Der Angriff wurde sehr wahrscheinlich automatisiert ausgeführt, nachdem das Internet auf verwundbare Instanzen gescannt worden war.&lt;/p&gt;&#10;&lt;p&gt;Zusammengefasst kann man im vorliegenden Fall von einer &lt;a href="https://www.techtimes.com/articles/325724/20260827/cisa-confirms-gitea-cve-2026-60004-exploited-cryptominer-hits-5000-exposed-dev-servers.htm" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Mass-Exploitation Campaign&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; für Cryptomining ausgehen.&lt;/p&gt;&#10;&lt;h3 id="der-cryptominer"&gt;Der Cryptominer&lt;/h3&gt;&#10;&lt;p&gt;Bei meinem Bekannten wird folgende Datei als statisch gelinkte Executable (!) auf dem System abgelegt: &lt;code&gt;gitea/data/gitea/sys_health_s3&lt;/code&gt;&#10;Der Hash der Datei legt seiner Ansicht nach nahe, dass ein &lt;a href="https://github.com/xmrig/xmrig" target="_blank" rel="noopener noreferrer" class="external-link"&gt;XMRig cyptominer&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; als &lt;a href="https://www.cloudflare.com/learning/security/glossary/malicious-payload/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;bösartige Payload&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; eingesetzt wurde, der mit &lt;code&gt;pool.hashvault.pro&lt;/code&gt; kommuniziert und dabei einen Großteil der verfügbaren CPU-Leistung für sich beansprucht.&lt;/p&gt;&#10;&lt;h3 id="noch-größerer-schaden-möglich"&gt;Noch größerer Schaden möglich&lt;/h3&gt;&#10;&lt;p&gt;Sogar für den auslegungsüberschreitenden Stöfall habe ich &lt;a href="https://thehackernews.com/2026/09/red-heron-exploits-gitea-rce-to.html" target="_blank" rel="noopener noreferrer" class="external-link"&gt;ein aktuelles (Sep-2026) Beispiel auf Hackernews&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; finden können: Diebstahl von Quellcode, Sammlung von Zugangsdaten, Privilege escalation bis hin zum &lt;code&gt;root&lt;/code&gt;-Zugriff auf das betroffene System.&lt;/p&gt;&#10;&lt;h2 id="wie-entdecke-ich-einen-angriff"&gt;Wie entdecke ich einen Angriff?&lt;/h2&gt;&#10;&lt;p&gt;Schlimmstenfalls gar nicht. Sind Profis zielgerichtet am Werk, können allenfalls die Logdateien zum Zeitpunkt direkt nach dem Einbruch Aufschluss geben. Im Falle, dass man sie sofort liest und interpretieren kann. Aber ich schweife ab&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;&#10;&lt;p&gt;Dannoch sollte man sich folgende Fragen stellen:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Betreibe ich eine vulnerable Gitea-Version (&lt;code&gt;&amp;lt;1.27.2&lt;/code&gt;)?&lt;/li&gt;&#10;&lt;li&gt;Verzichte ich auf eine Monitoring-Lösung, die bei Auffälligkeiten warnt?&lt;/li&gt;&#10;&lt;li&gt;Liegt eine ungewöhnlich &lt;em&gt;hohe CPU-Last&lt;/em&gt; des Systems vor (Deutet auf Kryptominer-Befall hin)?&lt;/li&gt;&#10;&lt;li&gt;Für diesen konkreten Miner kann man zusätzlich nachsehen, ob auf dem System folgende Datei zu finden ist:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;find / -name &lt;span style="color:#e6db74"&gt;&amp;#39;.sys_health_s3&amp;#39;&lt;/span&gt; 2&amp;gt;/dev/null&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Beantwortet man sich nur eine dieser Fragen mit &lt;code&gt;ja&lt;/code&gt;, ist zügiges Handeln angebracht. Dabei ist durch den Schweregrad der Sicherheitslücken das gesamte Hostsystem als kompromittiert anzusehen, insbesondere wenn der Gitea-Container oder ein eventuell eingebundener Runner &lt;code&gt;rootful&lt;/code&gt; läuft, also mit dem Docker Socket ausgestattet wurde.&lt;/p&gt;&#10;&lt;h3 id="bei-befall-quarantäne"&gt;Bei Befall: Quarantäne&lt;/h3&gt;&#10;&lt;p&gt;Nächste Schritte: Sofort die betroffene Maschine isolieren und vom Netz nehmen. Die Container herunterfahren, Hostmaschine durchbooten und Updates nachladen. Aschließend die Docker Registry auf Stand bringen und über die Logdateien (Zeitstempel!) ermitteln, ob andere Teile des Systems betroffen sind. Für weitere Details siehe &lt;a href="https://blog.schallbert.de/gitea-out-of-memory/"&gt;mein Artikel über einen selbsterlebten Angriff auf Gitea&lt;/a&gt;.&lt;/p&gt;&#10;&lt;h2 id="lösungen"&gt;Lösungen&lt;/h2&gt;&#10;&lt;h3 id="gitea-updaten"&gt;Gitea Updaten!&lt;/h3&gt;&#10;&lt;p&gt;Gitea muss dringend auf eine Version &lt;code&gt;&amp;gt;1.27.1&lt;/code&gt; gebracht werden. Dafür kann beispielsweise die &lt;code&gt;docker-compose.yml&lt;/code&gt; geändert und die Container danach durchgebootet werden:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# docker-compose.yml&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;gitea&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;gitea/gitea:latest&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container_name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;gitea&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Weitere Informationen zu aktuellen Fixes finden sich auf &lt;a href="https://blog.gitea.com/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Giteas Blog&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;. Der Major Release auf Version 27 löst eine ellenlange Liste an kritischen Sicherheitslücken. Ich habe in diesem Artikel nur ein paar davon herausgepickt, da sie mein direktes Umfeld betreffen und ihre Ausnutzung bekannt ist.&lt;/p&gt;&#10;&lt;h3 id="gitea-und-runner-rootless-ausführen"&gt;Gitea und Runner &lt;code&gt;rootless&lt;/code&gt; ausführen&lt;/h3&gt;&#10;&lt;p&gt;Führt das Ausnutzen einer Sicherheitslücke zum Verlust von Gitea oder dem Action Runner, sollte nicht auch noch das Hostsystem kompromittiert werden. Der Betrieb in einem Container kann den Schadensumfang deutlich reduzieren. Das Aufsetzen einer &lt;a href="https://blog.schallbert.de/gitea-act-runner-dind/"&gt;&lt;code&gt;rootless&lt;/code&gt;-Lösung habe ich daher hier beschrieben&lt;/a&gt;.&lt;/p&gt;&#10;&lt;h2 id="zusätzliche-maßnahmen-härtung"&gt;Zusätzliche Maßnahmen (Härtung)&lt;/h2&gt;&#10;&lt;h3 id="cve-2026-20896-netzwerkzugriff-erschweren"&gt;CVE-2026-20896: Netzwerkzugriff erschweren&lt;/h3&gt;&#10;&lt;p&gt;Bei den folgenden Schritten folge ich der &lt;a href="https://df00tech.com/detections/CVE-2026-20896#kql" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Empfehlung von d00ftech&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Einfügen des Adressraumes des selbst verwendeten Reverse Proxy. Dafür gilt erst einmal herauszufinden, unter welcher Adresse der Reverse Proxy im Netzwerk erreichbar ist. Auf meinem Server beispielsweise laufen Gitea und Reverse Proxy (Caddy) in Docker. Daher finde ich die IP-Adresse wie folgt:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker inspect caddy &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --format&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;{{range $name, $network := .NetworkSettings.Networks}}{{$name}}: {{$network.IPAddress}}{{&amp;#34;\n&amp;#34;}}{{end}}&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;caddy-proxy: 172.20.0.2&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dieser Wert wird nun in der &lt;code&gt;gitea/app.ini&lt;/code&gt; eingetragen:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;[security]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;REVERSE_PROXY_LIMIT&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;REVERSE_PROXY_TRUSTED_PROXIES&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;172.20.0.2/32&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="2"&gt;&#10;&lt;li&gt;Direkten Netzwerkzugriff auf Gitea unter Umgehung des eigenen Reverse Proxy blockieren. Dazu darf der Port von Gitea (meist &lt;code&gt;3000&lt;/code&gt;) nicht in der Portfreigabe beispielsweise der Docker-Konfiguration erscheinen:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# docker-compose.yml&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;services&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;gitea&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ports&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#34;3000:3000&amp;#34;&lt;/span&gt; &lt;span style="color:#75715e"&gt;# remove this!&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="cve-2026-59774-gitea-updaten"&gt;CVE-2026-59774: Gitea updaten!&lt;/h3&gt;&#10;&lt;p&gt;Es gibt zwar die Möglichkeit, den org-mode renderer in der &lt;code&gt;app.ini&lt;/code&gt; zu deaktivieren (Siehe &lt;a href="https://docs.gitea.com/next/administration/external-renderers/#appini-file-configuration" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Gitea Documentation&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; zum Thema), der weitaus bessere Weg ist aus meiner Sicht aber das Update von Gitea selbst!&lt;/p&gt;&#10;&lt;h3 id="cve-2026-60004-falls-möglich-self-registration-abschalten"&gt;CVE-2026-60004: Falls möglich Self-Registration abschalten&lt;/h3&gt;&#10;&lt;p&gt;Der eigentliche Fix ist nur durch ein Update der Gitea-Version möglich. Für kleinere Instanzen mit wenigen Usern mag es zusätzlich zweckmäßig erscheinen, die Selbstregistrierung für neue User abzuschalten. Sie müssen eine Registrierung von nun an bei den Administratoren anfragen (sofern sie nicht eine der anderen oben beschriebenen CVEs ausnutzen).&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# gitea/app.ini&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;[service]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;DISABLE_REGISTRATION&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Weitere hilfreiche Einstellungen sind:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;REGISTER_EMAIL_CONFIRM&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;true # Requires user&amp;#39;s email to be confirmed for registration to complete&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;ENABLE_OPENID_SIGNUP&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;false # Disallow logons via external API&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;REQUIRE_SIGNIN_VIEW&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;true # Force users to login before they can view content or use the public API &lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ausblick-und-fazit"&gt;Ausblick und Fazit&lt;/h2&gt;&#10;&lt;p&gt;Versionsverwaltungen sind sehr atttraktive Ziele für gleich einen ganzen Strauß an Angreifertypen: Von Cryptominern wegen der Möglichkeit der Ressourcenübernahme über Ransomware-Gruppen wegen der Quellcodedateien und möglicher Zugangsdaten bis hin zu hochprofessionellen, zielgerichteten Angreifern und staatlichen Akteuren dadurch, dass die Software eine Art Infrastruktur darstellt.&lt;/p&gt;&#10;&lt;p&gt;Daher:&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&amp;ldquo;Alle Patches einspielen. Immer. Sofort. Ohne Ausnahmen.&amp;rdquo; - &lt;a href="https://codeberg.org/tomas-jakobs/fefe-blog-backup/src/branch/main/content/assets/hackback/hackback.htm#L509" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Felix von Leitner&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;, sagt aber auch das &lt;a href="https://www.bsi.bund.de/DE/Themen/Verbraucherinnen-und-Verbraucher/Informationen-und-Empfehlungen/Cyber-Sicherheitsempfehlungen/Updates-Browser-Open-Source-Software/Wichtige-Softwareupdates/wichtige-softwareupdates_node.html" target="_blank" rel="noopener noreferrer" class="external-link"&gt;BSI&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;Was mich ein wenig ratlos zurücklässt ist die schiere Zahl und Kritikalität der gestopften Sicherheitslücken (35 CVEs binnen eines Monats laut Giteas eigenem Blog!). Aus meiner blauäugigen Sicherheitsperspektive ist diese Lösung ein Schweizer Käse und ich bin mir nicht sicher, ob ich Gitea weiter betreiben sollte.&lt;/p&gt;&#10;&lt;h3 id="sofort-härtung-durchführen"&gt;Sofort: Härtung durchführen&lt;/h3&gt;&#10;&lt;p&gt;Na klar: Gitea auf &lt;code&gt;latest&lt;/code&gt; bringen und die oben beschriebenen Härtungsmaßnahmen durchführen.&lt;/p&gt;&#10;&lt;h3 id="kurzfristig-automatische-updates"&gt;Kurzfristig: Automatische Updates&lt;/h3&gt;&#10;&lt;p&gt;In den nächsten Tagen und Wochen werde ich mich damit beschäftigen, die Docker Registry automatisch nach Updates für meine Software zu durchsuchen und sie ebenso automatisch auf meinem Server auszurollen. &lt;a href="https://blog.schallbert.de/auto-upgrade-docker-images/"&gt;Blog-Post dazu hier&lt;/a&gt;.&lt;/p&gt;&#10;&lt;h3 id="mittelfristig-her-mit-monitoring"&gt;Mittelfristig: Her mit Monitoring&lt;/h3&gt;&#10;&lt;p&gt;Ich werde mich auf die Suche machen nach einer kleinen und leichten Monitoring-Lösung, die Auffälligkeiten wie &amp;ldquo;CPU-Last ungewöhnlich hoch seit HH:MM:SS&amp;rdquo; meldet und &lt;a href="https://oneuptime.com/blog/post/2026-01-06-docker-health-checks/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;healthchecks&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; durchführen und überwachen kann. Dabei darf sie selbst kein Einfallstor dastellen, muss also praktisch ohne Rechte auskommen. Ob das wohl einfach möglich ist?&lt;/p&gt;&#10;&lt;h3 id="mittelfristig-2-weg-mit-den-secrets"&gt;Mittelfristig 2: Weg mit den Secrets&lt;/h3&gt;&#10;&lt;p&gt;Unverschlüsselte Secrets haben in Repositories nichts verloren. Selbst auf dem Server selbst ist eine &lt;code&gt;.env&lt;/code&gt;-Datei, die dort herumliegt, als nicht mehr sicher zu werten. Auch hier werde ich mir Gedanken machen und entsprechend berichten, wenn ich eine Lösung ausgerollt habe.&lt;/p&gt;&#10;&lt;h3 id="mittelfristig-3-news-feeds-einrichten"&gt;Mittelfristig 3: News-Feeds einrichten&lt;/h3&gt;&#10;&lt;p&gt;Hierunter fallen Abos z.B. von Newslettern oder RSS-Feeds idealerweise aller meiner Softwareanbieter, IT-Security-Institutionen oder -Journalisten und weiteren Quellen, aus denen ich Sicherheitslücken, Patches und Maßnahmen zur Systemhärtung entnehmen kann.&lt;/p&gt;&#10;&lt;h3 id="credits"&gt;Langfristig: Mit Leuten weiterhin ins Gespräch gehen&lt;/h3&gt;&#10;&lt;p&gt;Es endet wie es beginnt. Bevor ich Probleme mit meiner Software lösen kann, bevor ich überhaupt von den Problemen weiß, ja genau da! Ganz am Anfang, bevor ich überhaupt entschieden habe, welche Software ich einsetze, da stehen: Andere Menschen.&lt;/p&gt;&#10;&lt;p&gt;Leute, die ich fragen kann, um Hilfe bitten kann. Deren Zeit ich in Anspruch nehmen darf für eigene Belange. Die ich zum Beispiel per Messenger aus dem Nichts heraus anschreibe und aus ihrem Fokus reiße.&lt;/p&gt;&#10;&lt;p&gt;Leute, die sich besser auskennen als ich, die einen anderne Blick auf die Dinge haben, oder deren Meinung ich interessant finde.&lt;/p&gt;&#10;&lt;p&gt;Kolleginnen, auch Ehemalige, Bekannte und Freunde, Familie, die ich zufällig oder zielgerichtet auf einen Austausch treffe. Auf einen Kaffee, ein Eis, ein Kaltgetränk, zum Musizieren oder für einen Brettspielnachmittag.&lt;/p&gt;&#10;&lt;p&gt;Leute, die mir trotz der Unterbrechung und doofer Fragen freundlich und geduldig helfen. Die vielleicht kurz mit den Augen rollen, mir die Dinge dann aber doch noch ein weiteres mal erklären. Die meine Monologe, kritische Nachfragen und gelegentliche Gegenrede irgendwie tolerieren.&lt;/p&gt;&#10;&lt;p&gt;Leute, mit denen ich in einen Austausch treten kann, der am Ende hoffentlich beiden Seiten nützt.&lt;/p&gt;&#10;&lt;p&gt;&lt;figure class="media-frame media-frame--left"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/root/Schallbert.avif" alt="Image: A computer-drawn image of Schallbert, pixelized, and in 256 colors."&gt;&lt;/figure&gt;&#10;Bei euch allen möchte ich mich bedanken. Mit Leuten wie euch wird alles viel einfacher. Auch der Betrieb dieses Blogs, wo so viel meiner Zeit hineingeht. Ich kann mit euch Entscheidungen diskutieren, erfahren wie ihr Dinge gemacht habt und warum genau so, die Perspektiven wechseln. Und neue Ideen entwickeln.&lt;/p&gt;&#10;&lt;p&gt;Bitte bleibt mir erhalten.&lt;/p&gt;&#10;&lt;div class="footnotes" role="doc-endnotes"&gt;&#10;&lt;hr&gt;&#10;&lt;ol&gt;&#10;&lt;li id="fn:1"&gt;&#10;&lt;p&gt;Verweis an &lt;a href="https://de.wikipedia.org/wiki/Fefes_Blog" target="_blank" rel="noopener noreferrer" class="external-link"&gt;&amp;ldquo;Fefe&amp;rdquo; Felix von Leitner&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;. Zitat: &amp;ldquo;Annahmen [&amp;hellip;]: Wir werden angegriffen. Wir merken es zeitnah. Aller Erfahrung nach: Nein, tun wir nicht. Typischer Zeitraum vor Entdeckung von blinden Passagieren: Ein halbes bis fünf Jahre.&amp;rdquo; - aus dem Vortrag &lt;a href="https://codeberg.org/tomas-jakobs/fefe-blog-backup/src/commit/5d0e24d085463a5fc3b852edb589347f6d909a85/content/assets/hackback/hackback.htm#L634" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Hackback&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;, Link führt zu &lt;a href="https://codeberg.org/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Codeberg&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>Gitea stürzt ab: Zu viele Anfragen</title><link>https://blog.schallbert.de/gitea-out-of-memory/</link><pubDate>Mon, 30 Jun 2025</pubDate><author>Schallbert</author><guid>https://blog.schallbert.de/gitea-out-of-memory/</guid><description type="html">&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2025-06-30-server-load-thumb.avif"&#10; class="post-cover"&#10; alt="Image: server at max load when gitea is flooded with GET requests"&#10; title="Gitea stürzt ab: Zu viele Anfragen" /&gt;&#10;&lt;p&gt;Hier möchte ich kurz darstellen, wie ein Absturz eines Dienstes meinen Server über Stunden wiederholt lahmgelegt hat. Und dies so gründlich, dass ich nur aus der Konsole des Anbieters überhaupt einen Neustart durchführen konnte. Ich erkläre, wie es dazu kam und wie ich dieses und ähnliche Probleme in Zukunft vermeiden möchte.&lt;/p&gt;&#10;&lt;h2 id="ich-wurde-angegriffen-oder"&gt;Ich wurde angegriffen. Oder?&lt;/h2&gt;&#10;&lt;p&gt;Ich saß gerade an einem Artikel, den ich später posten wollte. Zur Sicherheit erstellte ich wie üblich einen Commit und wollte ihn auf meine &lt;em&gt;Gitea&lt;/em&gt;-Instanz schieben. Doch mein &lt;code&gt;git push&lt;/code&gt; Befehl lief einfach nicht durch.&lt;/p&gt;&#10;&lt;p&gt;Verwundert versuchte ich, meine Webseite aufzurufen. Zurück kam:&lt;/p&gt;&#10;&lt;figure class="media-frame media-frame--center"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2025-06-30-404-message.avif" alt="Image: A browser&amp;#39;s timeout error message `Could not complete your request`"&gt;&lt;/figure&gt;&#10;&lt;p&gt;Merkwürdig. Anschließend wollte ich mich auf meinem Server einloggen, um nach dem Rechten zu sehen: &lt;code&gt;ssh &amp;lt;servername&amp;gt;&lt;/code&gt;. Wieder blieb das Terminal ohne Reaktion. Mist!&lt;/p&gt;&#10;&lt;p&gt;Timeout. Als letzte Rettung meldete ich mich bei meinem Hoster an und schaute auf die Graphen des Servers:&lt;/p&gt;&#10;&lt;figure class="media-frame media-frame--center"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2025-06-30-server-load.avif" alt="Image: 200% CPU load on my server for nearly two hours"&gt;&lt;/figure&gt;&#10;&lt;p&gt;Oh, was ist denn da los? Nun versuche ich über die Weboberfläche, den Server herunterzufahren. Klappt auch nicht. Erst ein harter Neustart ist erfolgreich.&#10;Ich kann mich wieder per SSH einloggen und sehe, dass auch alle &lt;em&gt;Docker&lt;/em&gt;-Container wieder ganz normal hochfahren.&lt;/p&gt;&#10;&lt;h2 id="was-war-passiert"&gt;Was war passiert?&lt;/h2&gt;&#10;&lt;p&gt;Gut, dass ich eine Woche lang alle Logs aufbewahre. So und über die Auslastung der Maschine über Zeit kann ich einigermaßen rekonstruieren, was passiert ist.&lt;/p&gt;&#10;&lt;h3 id="welche-logs-helfen"&gt;Welche Logs helfen?&lt;/h3&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Crash lokalisieren! Auslösende Anwendung finden im &lt;code&gt;kern.log&lt;/code&gt;, Zeitstempel notieren.&lt;/li&gt;&#10;&lt;li&gt;Gibt es systemweite Auswirkungen oder andere Dienste, die beeinträchtigt werden? Im &lt;code&gt;syslog&lt;/code&gt; nachsehen.&lt;/li&gt;&#10;&lt;li&gt;Falls der Verdacht aufkommt, das System sei möglicherweise gehackt worden: &lt;code&gt;auth.log&lt;/code&gt; hat die Details.&lt;/li&gt;&#10;&lt;li&gt;Sollte die betroffene Anwendung im Container laufen, helfen entsprechende Logs dort möglicherweise weiter.&lt;/li&gt;&#10;&lt;li&gt;Logs der Anwendung selbst sichten. Besonders die Zeit kurz vor dem Crash ist interessant.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Und hier nochmal im Detail die Logs, die ich mir für meine Verhalten angesehen habe und wo sie zu finden sind.&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;log name&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;purpose&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;relevant content for this issue&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/var/log/syslog&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;System-wide (bare metal) messages&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;(docker) warning: &amp;ldquo;health check for container &lt;code&gt;&amp;lt;ID&amp;gt;&lt;/code&gt; timeout&amp;rdquo; (containerd) error: &amp;ldquo;ttrpc: received message on inactive stream&amp;rdquo;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/var/log/auth.log&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Contains authentication messages from external hosts, in my case mostly SSH&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;None&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;/var/log/kern.log&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Logs all app, service, daemon and system crashes&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Out of memory: Killed process &lt;code&gt;&amp;lt;ID&amp;gt;&lt;/code&gt; (&lt;code&gt;&amp;lt;serviceName&amp;gt;&lt;/code&gt;)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;[.]/gitea/log/gitea.log&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Protocol for requests, actions on Gitea&amp;rsquo;s web interface, repo changes etc.&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;GET&lt;/code&gt; requests, crash/restart indications&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;docker container logs &lt;code&gt;&amp;lt;containerID&amp;gt;&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Docker&amp;rsquo;s logs for the container in question&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Received signal 15; terminating. (SIGTERM)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="kernlogsyslog"&gt;kern.log/syslog&lt;/h3&gt;&#10;&lt;p&gt;Hier sehe ich neben dem Stack trace, was genau passiert ist. Die am besten verständlichste Meldung ist folgende:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-log" data-lang="log"&gt;Out of memory: Killed process `&amp;lt;ID&amp;gt;` (gitea)&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Gitea ist also der Stecker gezogen worden, weil es praktisch alle Systemressourcen gezogen hatte.&#10;Wenn ich im Log nach oben scrolle, sehe ich ein paar Minuten vorher:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;timestamp&amp;gt; &amp;lt;machineName&amp;gt; dockerd&lt;span style="color:#f92672"&gt;[&lt;/span&gt;716&lt;span style="color:#f92672"&gt;]&lt;/span&gt;: level&lt;span style="color:#f92672"&gt;=&lt;/span&gt;warning msg&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Health check for container &amp;lt;ID&amp;gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;timestamp&amp;gt; &amp;lt;machineName&amp;gt; dockerd&lt;span style="color:#f92672"&gt;[&lt;/span&gt;716&lt;span style="color:#f92672"&gt;]&lt;/span&gt;: level&lt;span style="color:#f92672"&gt;=&lt;/span&gt;error msg&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;stream copy error: reading from a closed fifo&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Bereits hier sehe ich Warnungen, dass der gitea-Container nicht sauber arbeitet. Ein weiterer Vorteil, den das Einbauen von &amp;ldquo;Healthchecks&amp;rdquo; in der &lt;code&gt;docker-compose.yml&lt;/code&gt; Datei hat. Über Zweck und Einbau von Healthchecks in &lt;em&gt;docker&lt;/em&gt; hatte ich aus anderen Gründen bereits &lt;a href="https://blog.schallbert.de/fix-gitea-runner/#healthcheck"&gt;einen Artikel verfasst&lt;/a&gt;.&lt;/p&gt;&#10;&lt;h3 id="gitealog"&gt;gitea.log&lt;/h3&gt;&#10;&lt;p&gt;Folgender Log-Eintrag zeigt wegen eines &lt;a href="https://github.com/go-gitea/gitea/issues/22275" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Bugs in einem Submodul&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; indirekt an, dass &lt;em&gt;Gitea&lt;/em&gt; gerade neu gestartet ist:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cmd/web.go:205:serveInstalled&lt;span style="color:#f92672"&gt;()&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;W&lt;span style="color:#f92672"&gt;]&lt;/span&gt; Table system_setting Column version db default is , struct default is &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Und weiter oben im Log nun:&lt;/p&gt;&#10;&lt;figure class="media-frame media-frame--center"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2025-06-30-attack-log.avif" alt="Image: Gitea log showing numerous GET request entries, many of which for a specific large file (MiB range), following a typical Gitea startup message"&gt;&lt;/figure&gt;&#10;&lt;p&gt;Sehr interessant. Die &lt;code&gt;highlight.css&lt;/code&gt; liegt in meinem öffentlichen Repo. Auf ihrer Grundlage erhält die Seite &lt;a href="https://lectures.schallbert.de/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;lectures.schallbert.de&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; ihr Aussehen. Diese Datei ist ziemlich groß, fast &lt;code&gt;1MiB&lt;/code&gt;. Und sie wird hier gleich zig male geladen, und das praktisch für jeden Commit.&lt;/p&gt;&#10;&lt;p&gt;Nun schaue ich mir weitere Crashes in der Vergangenheit an. Immer sind es bursts von &lt;code&gt;GET&lt;/code&gt;-Befehlen auf große Dateien oder die Anforderung von &lt;code&gt;compares&lt;/code&gt; zwischen zwei Branches des Repository, die einem Aufhängen meines Servers vorausgehen.&lt;/p&gt;&#10;&lt;h2 id="wer-steckt-dahinter"&gt;Wer steckt dahinter?&lt;/h2&gt;&#10;&lt;p&gt;Alle crash-auslösenden Requests kommen aus dem selben IP-Adressraum. Die Abstürze starteten bereits vor ein paar Wochen. Zumeist aber zu Tageszeiten, die ich (und anscheinend auch viele meiner LeserInnen) nicht mitbekamen. Und nach ein paar Minuten war der Server stets wieder im Normalbetrieb.&lt;/p&gt;&#10;&lt;figure class="media-frame media-frame--center"&gt;&#10; &lt;img src="https://blog.schallbert.de/assets/images/posts/2025-06-30-gcp-dos.avif" alt="Image: Whois-request for the IP that had my server crashed, owner: Google LLC (GCP)"&gt;&lt;/figure&gt;&#10;&lt;p&gt;Oha, die Spur führt zu Google&amp;rsquo;s Cloud Platform (GCP).&lt;/p&gt;&#10;&lt;h3 id="aber-ich-hatte-doch-robots-ausgesperrt"&gt;Aber ich hatte doch Robots ausgesperrt?&lt;/h3&gt;&#10;&lt;p&gt;In der Tat hatte ich die &lt;a href="https://blog.schallbert.de/gitea-search-indexation/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Suchmaschinenindexierung für Gitea gestoppt&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;. Merkwürdig. Oder habe ich es hier gar nicht mit einer der Google-spiders oder &amp;ldquo;KI&amp;rdquo;-Scraper, sondern mit einem fiesen Hacker zu tun, der sich bei &amp;ldquo;Google Cloud&amp;rdquo; eine virtuelle Maschine gemietet hat?&lt;/p&gt;&#10;&lt;h3 id="log-recherche-wie-häufig-wird-die-datei-angefragt"&gt;Log-Recherche: Wie häufig wird die Datei angefragt?&lt;/h3&gt;&#10;&lt;p&gt;Ein Spider würde ja höchstens einmal alle paar Wochen alle meine Seiten durchsuchen, richtig? Und sich hoffentlich nicht über meine &lt;code&gt;robots.txt&lt;/code&gt; hinwegsetzen. Erst recht nicht würde ein Crawler mehrfach und in kurzen Abständen denselben Request stellen, oder?&lt;/p&gt;&#10;&lt;p&gt;Zum dies zu prüfen, suche ich in den *Gitea Logs nach Einträgen von GET-Anfragen auf einer der großen und damit ressourcenintensiv zu übertragenen Dateien:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gunzip gitea.log.&amp;lt;date.rotateID&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;grep &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;lt;filename&amp;gt;&amp;#34;&lt;/span&gt; gitea.log.&amp;lt;date.rotateID&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In der Liste sehe ich, dass dieselbe Anfrage auf dieselbe Zieldatei von derselben IP-Adresse mehrfach und binnen Sekunden gestellt wird. Kurz vor dem Crash benötigt mein Server schon fast &lt;code&gt;4sec&lt;/code&gt;, um die Anfrage zu bedienen.&lt;/p&gt;&#10;&lt;p&gt;Auch sehe ich, dass sich die IP-Adresse alle paar Stunden ändert.&lt;/p&gt;&#10;&lt;h2 id="einen-dos-angriff-parieren"&gt;Einen DoS-Angriff parieren&lt;/h2&gt;&#10;&lt;p&gt;Zusammenfassend muss ich zum Schluss kommen, dass ich aus dem Adressraum des GCP per &lt;a href="https://en.wikipedia.org/wiki/Denial-of-service_attack" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Denial-of-service&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; angegriffen werde.&lt;/p&gt;&#10;&lt;p&gt;Um ein bisschen mehr Hintergrundwissen zu sammeln, besuche ich ein paar Websites zum Thema. Dort lerne ich, dass &lt;em&gt;gitea&lt;/em&gt; auf meinem Server unter einer &lt;a href="https://www.geeksforgeeks.org/computer-networks/types-of-dos-attacks/" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Application Layer Attack&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; zusammenbricht. Jetzt da ich weiß, was passiert und wie das Problem heißt, fällt das Finden von Lösungen gleich viel leichter 😅&lt;/p&gt;&#10;&lt;p&gt;Ich will mich natürlich nicht kampflos ergeben, indem ich meine Gitea-Instanz dauerhaft vom Netz nehme. Also, welche Optionen habe ich?&lt;/p&gt;&#10;&lt;h3 id="mehr-ressourcen-bereitstellen"&gt;Mehr Ressourcen bereitstellen&lt;/h3&gt;&#10;&lt;p&gt;Zugegeben, meine Maschine hat nur &lt;code&gt;40GB&lt;/code&gt; Speicher und &lt;code&gt;2GB VRAM&lt;/code&gt; sowie eine mickrige 2-Kern CPU aus 2009. Ich könnte einen leistungsfähigeren Server buchen, um Lastspitzen besser abreiten zu können. Doch dies würde den Angriff nicht verhindern, sondern nur seine Auswirkungen abmildern.&lt;/p&gt;&#10;&lt;h3 id="rate-limiting-direkt-im-webserver"&gt;Rate limiting direkt im Webserver&lt;/h3&gt;&#10;&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Rate_limiting" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Rate limiter&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt; begrenzen die Anzahl Anfragen eines Clients innerhalb eines Zeitfensters. Dadurch werden die Ressourcen des Servers geschont. Dies ist eine &amp;ldquo;weiche&amp;rdquo; Abwehr von Dos-Attacken, denn auslösende IP-Adressen werden mit einer Fehlermeldung kurzzeitig und sanft abgewehrt. Üblicherweise wird &lt;code&gt;HTTP status code 429&lt;/code&gt; &amp;ldquo;Too Many Requests&amp;rdquo; zurückgegeben, wenn der Limiter eingreift.&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;Gitea&lt;/em&gt; verfügt über keinen Rate Limiter. In &lt;a href="https://blog.schallbert.de/projects/move-blog-to-own-server/#web-access"&gt;meinem Setup&lt;/a&gt; läuft &lt;em&gt;Gitea&lt;/em&gt; hinter einem reverse proxy, der von meinem &lt;em&gt;Caddyserver&lt;/em&gt; bereitgestellt wird. Hier also müsste ich ansetzen. Für &lt;em&gt;Caddy&lt;/em&gt; gibt es Rate limiter nur als &lt;a href="https://caddyserver.com/docs/modules/http.handlers.rate_limit" target="_blank" rel="noopener noreferrer" class="external-link"&gt;externe Module&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;, welche manuell in &lt;em&gt;xcaddy&lt;/em&gt; nachinstalliert und eingerichtet werden müssen.&lt;/p&gt;&#10;&lt;h3 id="blocken-mit-ip-table-regeln"&gt;Blocken mit IP-table Regeln&lt;/h3&gt;&#10;&lt;p&gt;Hier könnte man sich erneut &lt;em&gt;fail2ban&lt;/em&gt; hernehmen und mehrfache Anfragen derselben Ressource von einer IP-Adresse schlicht blocken. &lt;em&gt;Gitea&lt;/em&gt; hat in der &lt;a href="https://docs.gitea.com/next/administration/fail2ban-setup" target="_blank" rel="noopener noreferrer" class="external-link"&gt;Dokumentation eine Beschreibung der Einrichtung&lt;span class="external-link-icon" aria-hidden="true"&gt;↗&lt;/span&gt;&lt;/a&gt;. In meinem Falle müsste ich für die Umsetzung dort weitermachen, &lt;a href="https://blog.schallbert.de/server-protection/#was-noch-nicht-funktioniert-gitea--fail2ban"&gt;wo ich bereits einmal aufgegeben hatte&lt;/a&gt; und damit nicht nur SSH, sondern auch normale Seitenaufrufe überwachen.&lt;/p&gt;&#10;&lt;p&gt;Für mich klingt diese Lösung am Sinnvollsten, denn sie trennt klar Funktionen in verschiedene Anwendungen auf. Ich nutze ausschließlich bei mir bereits verfügbare Applikationen: &lt;em&gt;Caddy&lt;/em&gt; würde die Zugriffslogs bereitstellen und &lt;em&gt;fail2ban&lt;/em&gt; müsste sie lesen und Filter in der Konfoguration &lt;code&gt;jail.local&lt;/code&gt; so setzen, dass es sich wie ein Rate Limiter verhält.&lt;/p&gt;&#10;&lt;p&gt;Jetzt schaue ich mal, wie ich &lt;em&gt;Caddy&lt;/em&gt; entsprechend mit &lt;em&gt;fail2ban&lt;/em&gt; verbinden kann. Den weiterführenden Artikel &lt;a href="https://blog.schallbert.de/fail2ban-with-caddy/"&gt;Fail2ban mit Caddy einrichten&lt;/a&gt; verlinke ich direkt mal 🙂&lt;/p&gt;&#10;</description></item></channel></rss>