{"id":218,"date":"2007-08-11T21:01:29","date_gmt":"2007-08-11T19:01:29","guid":{"rendered":"http:\/\/www.mitternachtshacking.de\/blog\/218-ccc-camp-twisting-timing-in-your-favour"},"modified":"2018-05-31T17:49:02","modified_gmt":"2018-05-31T16:49:02","slug":"ccc-camp-twisting-timing-in-your-favour","status":"publish","type":"post","link":"https:\/\/www.mitternachtshacking.de\/blog\/218-ccc-camp-twisting-timing-in-your-favour","title":{"rendered":"CCC Camp: Twisting timing in your favour"},"content":{"rendered":"<p>Lisa Thalheim hat im <a href=\"http:\/\/events.ccc.de\/camp\/2007\/Fahrplan\/events\/1996.en.html\">Vortrag Twisting Time<\/a> ein paar Probleme konkurrierender Programme vorgestellt. Dabei ging es um typische Programmierfehler, die zu Concurrency Bugs f\u00fchren. Ursache sind entweder Programme oder Threads von Programmen, die parallel (simultaneously) ablaufen k\u00f6nnen und entweder gemeinsam auf eine Ressource zugreifen oder miteinander kommunizieren m\u00fcssen. Hier treten leicht schwer zu findende und unregelm\u00e4\u00dfig auftretende Fehler auf.<\/p>\n<p>Der Vortrag selbst war eigentlich ein reiner Grundlagenvortrag, von meiner Einsch\u00e4tzung her das Niveau eines Proseminars an der Uni. F\u00fcr Leute, die damit noch nie zu tun hatten sicher interessant, da alle Grundlagen erkl\u00e4rt wurden, f\u00fcr Programmierer die sich damit schon besch\u00e4ftigt hatten eher langweilig, da au\u00dfer ein paar anschaulichen Source Code Abschnitten nichts wirklich neues vorgestellt wurde. Im Zusammenhang mit dem Stichwort &#8222;Twisting Time&#8220; h\u00e4tte ich mir vielleicht auch noch einen Hinweis auf zeitkritische Sidechannel-Angriffe vorstellen k\u00f6nnen.<\/p>\n<p>Typische Fehler sind:<\/p>\n<ul>\n<li>Deadlocks (das Programm h\u00e4ngt komplett)<\/li>\n<li>Livelocks (das Programm h\u00e4ngt in einer Endlosschleife)<\/li>\n<li>Fehlerhafte Kommunikation<\/li>\n<li>Fehler in der gemeinsamen Datennutzung<\/li>\n<li>Race Conditions<\/li>\n<\/ul>\n<p>Race Conditions sind f\u00fcr den Angreifer in der Regel am interessantesten.<\/p>\n<p>Die Ursachen f\u00fcr Race Conditions sind praktisch immer drei Hauptursachen:<\/p>\n<ul>\n<li>Vergessene Locks in konkurrierenden Zugriffen<\/li>\n<li>File System Races (TOCTOU-Fehler)<\/li>\n<li>Signal Races<\/li>\n<\/ul>\n<p><strong>Race Condition am Beispiel eines Ringpuffers<\/strong><\/p>\n<p><code><br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0#define CELLS 32<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0int rbf[CELLS];<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0int rbf_idx = 0;<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0uint32_t num_elems;<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0void rbf_store( int data ) {<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0if (rbf_idx == CELLS)<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0rbf_idx = 0;<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0rbf[rbf_idx] = data;<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0rbf_idx++;<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0num_elems++;<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0}<br \/>\n<\/code><\/p>\n<p>Wenn dieser Code konkurrierend abl\u00e4uft, kann es passieren, dass die if-Abfrage des ersten Threads einen rbf_idx-Wert kleiner CELLS ergibt, danach wird dieser Thread angehalten, ein zweiter Thread f\u00fcr die if-Abfrage durch, ebenfalls mit einem Wert in rbf_idx kleiner CELLS, der erste Thread schreibt folglich in den Puffer und erh\u00f6ht den Index, anschlie\u00dfend schreibt der zweite Thread in den Buffer (wobei damit der reservierte Speicherbereich bereits \u00fcberschritten wird) und erh\u00f6ht den Index. Da rbf_idx jetzt bereits gr\u00f6\u00dfer ist als CELLS, wird in Zukunft immer \u00fcber den eigentlich reservierten Speicher des Buffers hinaus geschrieben. Ursache f\u00fcr diesen Fehler ist ein vergessener Lock, der den Bereich rbf_store sichert, da dieser Bereich nur einmal konkurrierend betreten werden darf.<\/p>\n<p>Locking Fehler liegen entweder an komplett fehlenden Locks bzw. fehlender Synchronisation, da sich der Entwickler der Konkurrenz nicht bewusst war oder inkonsequentem Einsatz, bei dem einzelne Funktionen nicht richtig gesichert werden.<\/p>\n<p><strong>File System Race Condition<\/strong><\/p>\n<p><code><br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0$TempDir = $Config{'tmpdir'} . \"logwatch.\" . $$ . \"\/\";<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0if ( -d $TempDir ) { rmdir ($TempDir); }<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0if ( -e $TempDir ) { unlink ($TempDir); }<br \/>\n\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0\u00c2\u00a0mkdir ($TempDir,0700);<br \/>\n<\/code><\/p>\n<p>Bei File System Race Conditions handelt es sich praktisch immer um TOCTOU-Fehler (Time Of Check vs. Time Of Use). Ein Zustand wird zu einem Zeitpunkt A gepr\u00fcft und das Wissen \u00fcber diesen Zustand zu einem Zeitpunkt B verwendet, ohne zu beachten, dass sich dieser Zustand auf einem Multithreaded-System in der Zwischenzeit ge\u00e4ndert haben kann. TOCTOU-Fehler treten besonders gerne bei tempor\u00e4ren Dateien auf und sind sehr schwer zu vermeiden, da es in Unix keine atomare (d.h. nicht unterbrechbare Aktion) zum Pr\u00fcfen und Anlegen einer Datei gibt. Exploits sind oft \u00fcber Symlinks m\u00f6glich, die Pr\u00e4sentation gibt hier ein cleveres Beispiel einer tempor\u00e4ren Syslog-Datei verlinkt auf \/root\/.bash.<\/p>\n<p><strong>Signal Races<\/strong><\/p>\n<p>Signal Races sind die dritte Klasse h\u00e4ufiger Race Conditions und am schwierigsten zu verstehen. Dabei werden Signal-Handler konkurrierend eingesetzt, beispielsweise beim Beenden von Programmen oder Schreiben von Logfiles. Der klassische Fehler ist der Aufruf einer non_reentrant Funktion (d.h. einer Funktion die z.B. aufgrund interner Variablen nicht konkurrierend mehrfach aufgerufen werden darf) oder die Verwendung von non_reentrant Signal Handlers.<\/p>\n<p>Signal Races findet man beispielsweise im Zusammenhang mit sigaction() und nicht offensichtlich erkennbar mehrfach genutzten Ressourcen (z.B. libc-Funktionen mit internen statischen Variablen die bei konkurrierenden Aufrufen \u00fcberschrieben werden). In C++ kann man nach Singletons wie instanceOf suchen.<\/p>\n<p>Die <a href=\"http:\/\/events.ccc.de\/camp\/2007\/Fahrplan\/attachments\/1328-TwistingTiming.pdf\">sehenswerte Pr\u00e4sentation<\/a> (PDF, 1.0 MB) enth\u00e4lt die kompletten Source Code Beispiele.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Lisa Thalheim hat im Vortrag Twisting Time ein paar Probleme konkurrierender Programme vorgestellt. Dabei ging es um typische Programmierfehler, die zu Concurrency Bugs f\u00fchren. Ursache sind entweder Programme oder Threads von Programmen, die parallel (simultaneously) ablaufen k\u00f6nnen und entweder gemeinsam auf eine Ressource zugreifen oder miteinander kommunizieren m\u00fcssen. Hier treten leicht schwer zu findende und [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[13,8],"tags":[],"_links":{"self":[{"href":"https:\/\/www.mitternachtshacking.de\/blog\/wp-json\/wp\/v2\/posts\/218"}],"collection":[{"href":"https:\/\/www.mitternachtshacking.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mitternachtshacking.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mitternachtshacking.de\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mitternachtshacking.de\/blog\/wp-json\/wp\/v2\/comments?post=218"}],"version-history":[{"count":0,"href":"https:\/\/www.mitternachtshacking.de\/blog\/wp-json\/wp\/v2\/posts\/218\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.mitternachtshacking.de\/blog\/wp-json\/wp\/v2\/media?parent=218"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mitternachtshacking.de\/blog\/wp-json\/wp\/v2\/categories?post=218"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mitternachtshacking.de\/blog\/wp-json\/wp\/v2\/tags?post=218"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}