3 Prinzipien für sichere, automatische Software-Updates

Mitglieder 11.01.2017 aramido GmbH

Als IT-Forensiker werden wir gerufen, wenn bereits in IT-Systeme eingebrochen wurde. Die Angreifer folgen dabei meistens dem gleichen Schema: Sie nutzen bekannte Schwachstellen in nicht aktualisierten Anwendungen aus. Dieses Problem kann von zwei Seiten aus be­kämpft werden. IT-Verantwortliche müssen einerseits dafür sorgen ihre Anwendungen aktuell zu halten. Andererseits sollten Softwarehersteller ihren Nutzern auto­matische Up­dates anbieten. Doch Vorsicht! Auto­matische Update­mechanis­men werden sowohl durch bös­artige Hacker als auch durch uns Penetrations­tester besonders genau untersucht. Denn sind sie unzu­reichend umge­setzt, eröffnen sie eine Vielzahl an potentiellen Angriffs­punkten. Deshalb wollen wir in diesem Artikel darauf eingehen, worauf man bei der Implemen­tierung von sicheren, auto­matischen Software-Update-Mechanismen achten muss

Wer ist betroffen?

Software wird heutzutage vielfältig eingesetzt. Zum einen sprechen wir von klassischer Desktop-Software, die zum Beispiel als exe-Datei auf einem Windows-PC installiert wird. Der PC selbst wird vom Betriebssystem gesteuert. Unter­halb des Betriebs­systems steht die Firmware als Binde­glied zur spezifischen Hard­ware. Sie kommt bei diversen elektro­nischen Geräten wie WLAN-Routern, Druckern und Haushalts­geräten zum Einsatz. Bei mobilen Geräten wie Tablets und Smartphones kommt die Anwendungssoftware in Form von Apps daher. Diese werden in der Regel über App-Stores unterschiedlicher Anbieter installiert. Eine besonders wichtige und kritische Software ist der Web­browser. Über ihn rufen wir Web­anwen­dungen auf. Hierbei handelt es sich beispiels­weise um Content-Management-Systeme (CMS) oder Customer-Relationship-Management-Systeme (CRM). Man spricht bei diesen Web­an­wendungen auch häufig von Software-as-a-Service-Angeboten. Sie laufen zusammen mit anderen Diensten wie E-Mail-Diensten auf Servern.

Es gibt keine fehlerfreie Software

Nachdem wir gezeigt haben, wie vielfältig der Einsatz von Software ist, stellt sich als nächstes die Frage, warum Soft­ware überhaupt aktualisiert werden muss. Jeder Software-Entwickler kommt früher oder später zu der Einsicht, dass es aufgrund der Kom­plexität von Soft­ware kaum möglich ist fehler­freie Soft­ware zu entwickeln. Manche Fehler be­ein­trächtigen nur die Funktio­nalität der Soft­ware, andere führen zu schweren Sicherheits­lücken. Werden diese Fehler bekannt, muss die Soft­ware aktu­alisiert werden und das Up­date zum Kunden gebracht werden. Im Fall von Software-as-a-Service-Lösungen (SaaS) muss sich zwar der End­kunde nicht um das Update kümmern, der SaaS-Anbieter ist dann aber in der Pflicht die Web­anwen­dungen auf seinen Servern zu aktuali­sieren.

Vom 0-Day zum Update

Die Grafik zeigt den Weg, den eine Sicherheits­lücke von ihrer Entstehung bis zur Behe­bung nimmt. Zum Zeitpunkt A wird der Fehler im Code der Soft­ware eingefügt, was in der Regel unbe­absich­tigt statt­findet. Der Fehler wird zum Zeit­punkt B mit der Installation der Soft­ware für den Anwen­der relevant. Zum Zeitpunkt C wird der Fehler zum ersten Mal durch irgend­jemanden entdeckt. Dies kann der Hersteller selbst oder ein externer Dritter sein. Der Externe kann die Sicherheitslücke für sich behalten, sie dem Unternehmen melden, gewinnbringend auf dem Schwarzmarkt verkaufen oder direkt an die Öffentlich­keit damit gehen. Sobald der Hersteller von der Sicherheits­lücke erfährt, hat er die Möglich­keit mit einem Patch den Fehler zu beheben. Dieser wurde zum Zeitpunkt D entwickelt und zum Zeitpunkt E veröffent­licht. Zum Zeitpunkt F wurde das Softwareupdate mit dem Bugfix schließlich vom Betreiber der Software eingespielt. Sein System ist jetzt nicht mehr für die Sicher­heitslücke anfällig. Bevor diese veröffent­licht wurde (irgendwann zwischen Zeitpunkt C und E) spricht man von einem 0-Day. Dies ist eine Sicherheits­lücke, die nur dem Entdecker oder einem kleinen Personen­kreis bekannt ist. Nach Veröffent­lichung der Sicherheits­lücke gilt sie als allgemein bekannt. Sicherheits­forscher verzeichnen dann vermehrt Angriffe, die versuchen diese Sicherheits­lücke bei verwund­baren Systemen auszunutzen.

Prinzipien für sichere Software-Updates

Als Software-Entwickler will man vermeiden Sicherheits­lücken überhaupt in seinen Code einzubauen. Sind sie aber entstanden, soll der Zeit­raum zwischen Fund und Update möglichst kurz sein.

Um die Zeitspanne von der Veröffentlichung eines Software­updates bis zur Anwendung durch alle Benutzer möglichst klein zu halten, haben sich auto­matische Updates als Best Practice durchgesetzt. Bei der Umsetzung von auto­matischen Updates sollten allerdings die folgenden Punkte beachtet werden.

1. Automatische Updates per Default

Die Installation von Updates birgt stets das Risiko, dass Systeme gestört werden. Nicht umsonst galt unter System-Adminis­tratoren lange Zeit die Maxime „Never change a running system“. Dies zum Vorwand zu nehmen gar keine Sicherheitsupdates einzuspielen ist sehr gefährlich – besonders dann, wenn die Systeme mit dem Internet verbun­den sind. Da es aber durchaus Szenarien gibt, in denen der Adminis­trator selbst den Zeitpunkt zum Ein­spielen eines Updates bestimmen können muss, sollte die Anwendung diese Option anbieten. In diesem Fall wird der Adminis­trator benachrichtigt, worauf er das Update zu einem Zeitpunkt seiner Wahl einspielen kann. Die Standard­variante sollte aber nach dem Security-By-Default-Prinzip das automatische Update für sicherheits­kritische Patches sein.

2. Updates über sichere Kanäle

Eine häufig beobachtete Schwachstelle von Software­downloads und -updates ist der Down­load über unver­schlüsselte Verbindungen wie über http. Hier kann durch einen Man-in-the-Middle-Angriff das Update durch eine Malware ausgetauscht werden. Gerade bei automatischen Updates, die möglicherweise über ein unsicheres Netzwerk herunter­geladen werden, ist es wichtig auf sichere Transport­kanäle wie https-Verbindungen zu setzen.

Neben der Integrität der Software ist die Verfüg­barkeit der Software­updates eine weitere Dimension von Software-Sicherheit. Damit Angreifer nicht per DDoS den Zugriff auf Updates unterbinden können, sollten die Updates über ein breites Netzwerk (zum Beispiel über Mirror-Server oder Bit­Torrent) zur Verfügung gestellt werden. Ebenso müssen Updates verifiziert werden, sodass sicher­gestellt werden kann, dass diese auch tatsächlich vom Hersteller stammen.

3. Verifizierte Updates

Updates werden von den Nutzern nicht immer von der Original-Quelle heruntergeladen und selbst diese könnte kompromittiert werden. Daher sollten Updates immer durch eine digitale Signatur verifiziert werden, die vor der Installation anhand des mit der Software ausgelieferten öffentlichen Schlüssels überprüft wird. Zur Signierung von Software sind GnuPG oder andere moderne, auf elliptischen Kurven basierte krypto­graphische Verfahren geeignet. Bei besonders kritischer Open Source-Software hat sich zudem der Weg des nachvollziehbaren Build-Prozesses etabliert, um Mani­pulationen zwischen offenem Quellcode und gepackter Software zu erkennen. Um gezielte Angriffe auf einzelne Benutzer zu unterbinden, existiert außerdem noch die Möglich­keit über ein öffentliches, nur beschreib­bares Log die Konsistenz der Updates zwischen allen Benutzern sicher­zu­stellen. Weiter­gehende Infor­mationen zur Umsetzung beschreibt das Dreieck der sicheren Code-Auslieferung.

Fazit: Sichere Software-Updates als Teil des Secure Development Lifecycles

Das Ausspielen von sicheren, automatischen Software-Updates ist kein triviales Problem. Es ist Teil eines sicheren Software-Entwicklungs­prozesses. Die aramido GmbH hilft Ihnen Sicherheit nach dem Prinzip von Security-by-Design entlang des gesamten Software-Lebenszykluses umzusetzen. Die Sicherheits­experten von aramido freuen sich darauf Sie bei Ihrem Software­entwicklungs­projekt zu beraten.

Dieser Artikel wurde zuerst im aramido-Blog veröffentlicht.