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 bekämpft werden. IT-Verantwortliche müssen einerseits dafür sorgen ihre Anwendungen aktuell zu halten. Andererseits sollten Softwarehersteller ihren Nutzern automatische Updates anbieten. Doch Vorsicht! Automatische Updatemechanismen werden sowohl durch bösartige Hacker als auch durch uns Penetrationstester besonders genau untersucht. Denn sind sie unzureichend umgesetzt, eröffnen sie eine Vielzahl an potentiellen Angriffspunkten. Deshalb wollen wir in diesem Artikel darauf eingehen, worauf man bei der Implementierung von sicheren, automatischen 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. Unterhalb des Betriebssystems steht die Firmware als Bindeglied zur spezifischen Hardware. Sie kommt bei diversen elektronischen Geräten wie WLAN-Routern, Druckern und Haushaltsgerä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 Webbrowser. Über ihn rufen wir Webanwendungen auf. Hierbei handelt es sich beispielsweise um Content-Management-Systeme (CMS) oder Customer-Relationship-Management-Systeme (CRM). Man spricht bei diesen Webanwendungen 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 Software überhaupt aktualisiert werden muss. Jeder Software-Entwickler kommt früher oder später zu der Einsicht, dass es aufgrund der Komplexität von Software kaum möglich ist fehlerfreie Software zu entwickeln. Manche Fehler beeinträchtigen nur die Funktionalität der Software, andere führen zu schweren Sicherheitslücken. Werden diese Fehler bekannt, muss die Software aktualisiert werden und das Update zum Kunden gebracht werden. Im Fall von Software-as-a-Service-Lösungen (SaaS) muss sich zwar der Endkunde nicht um das Update kümmern, der SaaS-Anbieter ist dann aber in der Pflicht die Webanwendungen auf seinen Servern zu aktualisieren.
Vom 0-Day zum Update
Die obige Grafik zeigt den Weg, den eine Sicherheitslücke von ihrer Entstehung bis zur Behebung nimmt. Zum Zeitpunkt A wird der Fehler im Code der Software eingefügt, was in der Regel unbeabsichtigt stattfindet. Der Fehler wird zum Zeitpunkt B mit der Installation der Software für den Anwender relevant. Zum Zeitpunkt C wird der Fehler zum ersten Mal durch irgendjemanden 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 Öffentlichkeit damit gehen. Sobald der Hersteller von der Sicherheitslücke erfährt, hat er die Möglichkeit mit einem Patch den Fehler zu beheben. Dieser wurde zum Zeitpunkt D entwickelt und zum Zeitpunkt E veröffentlicht. 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 Sicherheitslücke anfällig. Bevor diese veröffentlicht wurde (irgendwann zwischen Zeitpunkt C und E) spricht man von einem 0-Day. Dies ist eine Sicherheitslücke, die nur dem Entdecker oder einem kleinen Personenkreis bekannt ist. Nach Veröffentlichung der Sicherheitslücke gilt sie als allgemein bekannt. Sicherheitsforscher verzeichnen dann vermehrt Angriffe, die versuchen diese Sicherheitslücke bei verwundbaren Systemen auszunutzen.
Prinzipien für sichere Software-Updates
Als Software-Entwickler will man vermeiden Sicherheitslücken überhaupt in seinen Code einzubauen. Sind sie aber entstanden, soll der Zeitraum zwischen Fund und Update möglichst kurz sein.
Sichere Software durch Secure Coding. Hochwertige Trainings für Entwickler.
Um die Zeitspanne von der Veröffentlichung eines Softwareupdates bis zur Anwendung durch alle Benutzer möglichst klein zu halten, haben sich automatische Updates als Best Practice durchgesetzt. Bei der Umsetzung von automatischen 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-Administratoren 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 verbunden sind. Da es aber durchaus Szenarien gibt, in denen der Administrator selbst den Zeitpunkt zum Einspielen eines Updates bestimmen können muss, sollte die Anwendung diese Option anbieten. In diesem Fall wird der Administrator benachrichtigt, worauf er das Update zu einem Zeitpunkt seiner Wahl einspielen kann. Die Standardvariante sollte aber nach dem Security-By-Default-Prinzip das automatische Update für sicherheitskritische Patches sein.
2. Updates über sichere Kanäle
Eine häufig beobachtete Schwachstelle von Softwaredownloads und -updates ist der Download über unverschlü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 heruntergeladen werden, ist es wichtig auf sichere Transportkanäle wie https-Verbindungen zu setzen.
Neben der Integrität der Software ist die Verfügbarkeit der Softwareupdates 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 BitTorrent) zur Verfügung gestellt werden. Ebenso müssen Updates verifiziert werden, sodass sichergestellt 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 kryptographische Verfahren geeignet. Bei besonders kritischer Open Source-Software hat sich zudem der Weg des nachvollziehbaren Build-Prozesses etabliert, um Manipulationen zwischen offenem Quellcode und gepackter Software zu erkennen. Um gezielte Angriffe auf einzelne Benutzer zu unterbinden, existiert außerdem noch die Möglichkeit über ein öffentliches, nur beschreibbares Log die Konsistenz der Updates zwischen allen Benutzern sicherzustellen. Weitergehende Informationen 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-Entwicklungsprozesses. Die aramido GmbH hilft Ihnen Sicherheit nach dem Prinzip von Security-by-Design entlang des gesamten Software-Lebenszykluses umzusetzen. Die Sicherheitsexperten von aramido freuen sich darauf Sie bei Ihrem Softwareentwicklungsprojekt zu beraten.