Anmelden

Schlüsseltechnologie· Staffel 1· Folge 78

STP078: Common Weakness Enumeration (Teil 1)

Donnerstag, 11. September 2025 · 1 h 05

MP3

Shownotes

<p>Nachdem wir kurz über Alex' Feedback gesprochen haben, soll es heute mal wieder um Sicherheit gehen; diesmal speziell darum, was Personen die Software schreiben beachten sollten, um die bekantesten Fallstricke sicher zu umgehen.</p><h2>Shownotes</h2><ul>
<li>
<p>Rückbezug STP049: <a href="de.wikipedia.org/w/index.php?title=Common_Vuln…; für bekannte Sicherheitslücken in bestimmten Programmen (z.B. <a href="de.wikipedia.org/w/index.php?title=Heartbleed&…; ist CVE-2014-0160)</p>
<ul>
<li>betrieben von dem privaten Forschungsinstitut <a href="de.wikipedia.org/w/index.php?title=Mitre_Corpo… Corporation</a> auf Basis von Fördermitteln der US-Regierung</li>
<li>April 2025: kurzzeitige Verwirrung nach Aussetzen des Fördervertrages, dann einen Tag später Kommando zurück (<a href="c3d2.de/news/pentaradio24-20250422.html"&… berichtete</a>)</li>
<li>neben CVE pflegt Mitre Corp. eine weniger bekannte Datenbank: <a href="en.wikipedia.org/w/index.php?title=Common_Weak… (Common Weakness Enumeration)</a>, ein Klassifizierungssystem für Arten von Sicherheitslücken</li>
<li>wir besprechen die jährliche Rangliste der <a href="cwe.mitre.org/top25/archive/2024/2024_cwe_top2… Top 25</a> mit Stand von 2024</li>
<li>wertvoll, weil man so als interessierter Laie oder Programmierer-Generalist ein Gefühl für wichtige Angriffsvektoren bekommt</li>
</ul>
</li>
<li>
<p>Platz 1: <a href="cwe.mitre.org/data/definitions/79.html"&g…;; fehlerhafte Neutralisierung von Eingaben während der Erzeugung von Webseiten ("Cross-Site Scripting", XSS)</p>
<ul>
<li>siehe Beispielbild im Link</li>
<li>Webseiten können JavaScript-Code enthalten, der auf dem Browser des Endanwenders ausgeführt wird</li>
<li>wenn Webseiten aus Eingaben anderer Benutzer zusammengebaut werden, können diese Code einschleusen</li>
<li>Lösung: Escaping (Entfernen oder Ersetzen von Zeichen mit syntaktischer Bedeutung), kann durch Template Engines teilweise automatisiert werden</li>
<li>passend dazu Platz 7: <a href="cwe.mitre.org/data/definitions/78.html"&g…;; fehlerhafte Neutralisierung von Eingaben während der Erzeugung von Befehlszeilen</li>
<li>außerdem Platz 13: <a href="cwe.mitre.org/data/definitions/77.html"&g…;; dasselbe für alle anderen Befehlssprachen, die nicht JavaScript oder die System-Shell sind</li>
<li>allgemeiner als Platz 12: <a href="cwe.mitre.org/data/definitions/20.html"&g…;; unzureichende Überprüfung von Eingaben</li>
<li>Lösung: "assume all input is malicious"; nur Eingaben akzeptieren, die strikten Formatvorgaben folgen (z.B. unter Einsatz von regulären Ausdrücken, siehe STP021)</li>
</ul>
</li>
<li>
<p>Platz 2, 6 und 20: <a href="cwe.mitre.org/data/definitions/787.html"&…; und <a href="cwe.mitre.org/data/definitions/125.html"&…;; Schreiben bzw. Lesen außerhalb des allokierten Speicherbereichs ("Out-of-Bounds Write/Read") sowie als übergeordnete Kategorie <a href="cwe.mitre.org/data/definitions/119.html"&…;; allgemeiner Pufferüberlauf ("Buffer Overflow")</p>
<ul>
<li>und passend dazu Platz 8: <a href="cwe.mitre.org/data/definitions/416.html"&…;; Benutzung nach dem Freigeben ("Use after Free")</li>
<li>alle bereits besprochen in STP047</li>
<li>Lösung: speichersichere Programmiersprachen, Speicherprofiling-Tools wie Valgrind (siehe STP076)</li>
</ul>
</li>
<li>
<p>Platz 3: <a href="cwe.mitre.org/data/definitions/89.html"&g…;; SQL-Injektion</p>
<ul>
<li>SQL siehe STP012: Abfragesprache für relationale Datenbanksysteme</li>
<li>Beispiel siehe <a href="xkcd.com/327/">XKCD 327</a></li>
<li>Lösung: Datenwerte von der Abfrage trennen (z.B. <code>SELECT * FROM users WHERE name = 'Alice'</code> -> <code>SELECT * FROM users WHERE name = $1</code> mit Datensatz <code>["Alice"]</code>)</li>
<li>passend dazu Platz 11: <a href="cwe.mitre.org/data/definitions/94.html"&g…;; Code-Injektion (dasselbe für Programmcode); Überlapp zu CWE-77</li>
</ul>
</li>
<li>
<p>Platz 4: <a href="cwe.mitre.org/data/definitions/352.html"&…;; Cross-Site Request Forgery (CSRF)</p>
<ul>
<li>Angreifer möchte im Namen des Opfers eine Aktion ausführen (z.B. auf Rechnung des Opfers in einem Webshop bestellen)</li>
<li>Angreifer schiebt dem Opfer ein manipuliertes HTML-Formular unter, dass beim Abschicken die gewünschte Aktion auslöst, aber mit den Cookies (und damit der Identität des Opfers)</li>
<li>Lösung: CSRF-Tokens (echte HTML-Formulare erhalten ein einmalig nutzbares Token, dass nicht vom Angreifer gefälscht werden kann)</li>
<li>passend dazu Platz 19: <a href="cwe.mitre.org/data/definitions/918.html"&…;; Server-Site Request Forgery (SSRF)</li>
<li>dabei manipuliert der Angreifer nicht ein menschliches Opfer oder einen Webclient, sondern einen Webserver, mit seinem privilegierten Zugriff andere Webserver abzufragen</li>
</ul>
</li>
<li>
<p>Platz 5: <a href="cwe.mitre.org/data/definitions/22.html"&g…;; Pfaddurchquerung ("Path Traversal")</p>
<ul>
<li>z.B. bei Webservern mit statischen Inhalten: entsprechende Dateien liegen im Dateisystem in einem bestimmten Ordner</li>
<li>Dateien außerhalb dieses Ordners sollen eigentlich nicht zugreifbar sein, aber manchmal geht <a href="example.com/../../../etc/passwd">http:…; oder dergleichen</li>
<li>Lösung: magische Pfadelemente wie <code>..</code> (bei Pfaden) oder <code>/</code> (bei Dateinamen) ablehnen</li>
</ul>
</li>
</ul>
<h4>Feedback zu STP063</h4>
<p>Alex schreibt:</p>
<blockquote>
<p>danke für den Podcast. Ich bin wie immer weit im Rückstand mit Hören, habe zu Folge 63 aber mal die Turing-Maschine für die Subtraktion neu gebastelt. [...] Den Input muss man mit folgender 0 eingeben, also 1110110 z.B.
Gebaut habe ich das auf <a href="turingmachinesimulator.com/">https://t…;
</blockquote>
<pre><code>//----------------------------------------------------------------------
//Syntax:

//-------CONFIGURATION
name: sub
init: q0
accept: qe

//-------DELTA FUNCTION:
//[current_state],[read_symbol]
//[new_state],[write_symbol],[>|<|-]

// < = left
// > = right
// - = hold
// use underscore for blank cells

q0,1 // 1en 1.Op überspringen
q0,1,>

q0,0
q1,0,>

q1,0 // 0en überspringen
q1,0,>

q1,1
q2,1,>

q2,0 // mehr als eine 1 im 2. Op? Ja->q5, nein->q3
q3,0,<

q2,1
q5,1,>

q5,1 // 1en 2.Op überspringen, dann auf letzte 1 des 2.Op
q5,1,>

q5,0
q6,0,<

q6,1 // letzte 1 des 2. Op durch 0 ersetzen
q7,0,<

q7,1 // zurück, 1en 2. Op überspringen
q7,1,<

q7,0
q8,0,<

q8,0 // zurück, 0en überspringen
q8,0,<

q8,1 // letzte 1 des 1. Op auf 0 setzen, zurück zu q1
q1,0,>

q3,1 // letzte 1 des 2. Op auf 0 setzen
q4,0,<

q4,0 // zurück, 0en überspringen
q4,0,<

q4,1 // letzte 1 des 1.Op auf Null setzen, zum Ende
qe,0,>
</code></pre>

Anmelden oder registrieren

Jetzt

0:00 / 0:00