Technische Details des jüngsten Firefox-Erweiterungsabsturzes

Über den Autor. Eric Rescorla - Technischer Direktor der Firefox Group bei Mozilla

Kürzlich ist in Firefox ein Vorfall aufgetreten, als die meisten Add-Ons (Erweiterungen, Add-Ons) nicht mehr funktionierten. Dies ist auf einen Fehler unsererseits zurückzuführen: Wir haben nicht bemerkt, dass eines der Zertifikate, mit denen die Add-Ons signiert werden, abgelaufen ist, was zur Trennung der überwiegenden Mehrheit von ihnen geführt hat. Nachdem wir das Problem behoben und die meisten Add-Ons wiederhergestellt haben, möchte ich ausführlich erläutern, was passiert ist, warum und wie wir es behoben haben.

Als Referenz: Erweiterungen und deren Signatur


Obwohl viele Firefox standardmäßig verwenden, unterstützt der Browser auch einen leistungsstarken Erweiterungsmechanismus. Sie fügen Firefox Funktionen von Drittanbietern hinzu, die die von uns standardmäßig angebotenen Funktionen erweitern. Derzeit gibt es über 15.000 Firefox-Add-Ons: von der Blockierung von Anzeigen bis zur Verwaltung von Hunderten von Registerkarten .

Für Firefox müssen alle installierten Add-Ons digital signiert sein . Diese Anforderung soll Benutzer vor böswilligen Erweiterungen schützen, indem ein Mindeststandard für die Überprüfung durch Mozilla-Mitarbeiter erforderlich ist. Bevor wir diese Anforderung im Jahr 2015 eingeführt haben, hatten wir ernsthafte Probleme mit böswilligen Erweiterungen.

Die Signatur funktioniert über das vorinstallierte "Stammzertifikat" von Firefox. Es wird offline im Hardware Security Module (HSM) gespeichert. Alle paar Jahre wird damit ein neues „Zwischenzertifikat“ signiert, das online gespeichert und beim Signieren verwendet wird. Wenn die Erweiterung zur Signatur eingereicht wird, generieren wir ein neues temporäres „End-Entity-Zertifikat“ und signieren es mit einem Zwischenzertifikat. Das Zielzertifikat wird dann zum Signieren der Erweiterung verwendet. Optisch sieht es so aus:



Bitte beachten Sie, dass jedes Zertifikat einen „Betreff“ (zu dem das Zertifikat gehört) und einen „Herausgeber“ (Unterzeichner) hat. Bei einem Stammzertifikat ist dies ein und dasselbe, bei anderen Zertifikaten ist der Herausgeber der Betreff.

Der wichtige Punkt hierbei ist, dass jedes Add-On mit einem eigenen Zertifikat des endgültigen Objekts signiert ist, aber fast alle Add-Ons dasselbe Zwischenzertifikat haben (mehrere sehr alte Add-Ons wurden von einem anderen Zwischenlink signiert). Hier trat das Problem auf: Jedes Zertifikat hat ein festes Ablaufdatum. Vor oder nach diesem Fenster wird das Zertifikat nicht akzeptiert und die von diesem Zertifikat signierte Erweiterung kann nicht in Firefox hochgeladen werden. Leider ist das von uns verwendete Zwischenzertifikat am 4. Mai nach 1:00 UTC abgelaufen, und jedes von diesem Zertifikat signierte Add-On wurde sofort nicht überprüft und konnte nicht auf Firefox hochgeladen werden.

Obwohl alle Add-Ons gegen ein Uhr morgens abliefen, waren die Konsequenzen nicht sofort zu spüren. Der Grund dafür ist, dass Firefox Add-Ons nicht ständig auf ihre Gültigkeit überprüft. Sie werden ungefähr alle 24 Stunden überprüft, und die Überprüfungszeit ist für jeden Benutzer unterschiedlich. Infolgedessen hatten einige Menschen sofort Probleme, andere viel später. Wir bei Mozilla haben am Freitag, dem 3. Mai, gegen 18:00 Uhr PST von dem Problem erfahren und sofort ein Team zusammengestellt, um die Situation zu korrigieren.

Schadensbegrenzung


Sobald wir verstanden hatten, womit wir konfrontiert waren, unternahmen wir mehrere Schritte, um eine Verschlechterung der Situation zu vermeiden.

Zuerst haben wir die Unterzeichnung neuer Ergänzungen deaktiviert. In diesem Moment war es vernünftig, weil die Unterschrift ein ungültiges Zertifikat enthielt. Rückblickend scheint es möglich zu sein, diese Funktion zu verlassen, aber es stellte sich heraus, dass dies auch im Widerspruch zur Abschwächung der „Hard Date Firmware“ steht, auf die wir weiter unten eingehen werden (obwohl wir sie am Ende nicht verwendet haben). Daher ist es gut, dass wir diese Option beibehalten haben. Die Unterzeichnung neuer Ergänzungen verzögert sich nun.

Zweitens haben wir sofort eine Schnellkorrektur veröffentlicht, die die erneute Überprüfung von Erweiterungssignaturen unterdrückt. Die Idee war, Benutzer zu schützen, die noch nicht erneut getestet wurden. Wir haben dies getan, bevor wir ein anderes Update hatten, und es jetzt entfernt, wenn das Update verfügbar ist.

Parallele Arbeit


Theoretisch sieht die Lösung für dieses Problem einfach aus: Erstellen Sie ein neues, gültiges Zertifikat und stellen Sie jede Ergänzung mit diesem Zertifikat erneut aus. Leider haben wir schnell festgestellt, dass dies aus mehreren Gründen nicht funktionieren würde:

  1. Es gibt viele Erweiterungen (über 15.000), und der Service ist nicht für die Massensignatur optimiert. Das erneute Signieren jedes Add-Ons dauert also länger als gewünscht.
  2. Nachdem die Add-Ons signiert wurden, müssen Benutzer ein neues Add-On erhalten. Einige werden auf Mozilla-Servern gehostet, und Firefox aktualisiert sie innerhalb von 24 Stunden. Benutzer müssen jedoch alle Add-Ons, die aus anderen Quellen installiert wurden, manuell aktualisieren, was sehr unpraktisch ist.

Stattdessen haben wir uns darauf konzentriert, einen Fix zu entwickeln, der die Situation ohne oder mit nur geringem manuellen Eingriff der Benutzer behebt.

Nachdem wir eine Reihe von Ansätzen in Betracht gezogen hatten, einigten wir uns schnell auf zwei Hauptstrategien, die wir parallel verfolgten:

  1. Firefox-Patch zum Ändern des Datums zur Überprüfung des Zertifikats. In diesem Fall funktionieren vorhandene Add-Ons wieder auf magische Weise, es ist jedoch die Lieferung eines neuen Firefox-Builds erforderlich.
  2. Generieren Sie ein neues gültiges Zertifikat und überzeugen Sie Firefox irgendwie, es anstelle des vorhandenen abgelaufenen zu akzeptieren.

Wir waren uns nicht sicher, was genau funktionieren würde, und beschlossen, die Arbeiten parallel durchzuführen und die erste zu implementieren, die wie eine funktionierende Lösung aussehen würde. Am Ende des Tages haben wir die Bereitstellung des zweiten Fixes abgeschlossen - eines neuen Zertifikats, das ich genauer beschreiben werde.

Ersatzzertifikat


Wie oben erwähnt, mussten zwei Hauptschritte befolgt werden:

  1. Erstellen Sie ein neues gültiges Zertifikat.
  2. Installieren Sie es remote in Firefox.

Um zu verstehen, warum dies funktioniert, müssen Sie etwas mehr darüber wissen, wie Firefox nach Add-Ons sucht. Das Add-On selbst wird in Form eines Dateipakets geliefert, das die zum Signieren verwendete Zertifikatkette enthält. Infolgedessen wird das Addon unabhängig überprüft, ob das Stammzertifikat bekannt ist, das während der Erstellung in Firefox konfiguriert wird. Wie gesagt, das Zwischenzertifikat war jedoch defekt, sodass das Add-On nicht wirklich überprüfbar war.

Es stellt sich jedoch heraus, dass Firefox beim Versuch, die Erweiterung zu überprüfen, nicht nur Zertifikate in der Erweiterung selbst verwendet. Stattdessen wird versucht, eine gültige Zertifikatkette zu erstellen, beginnend mit dem Endpunktzertifikat und fortlaufend zum Stammverzeichnis. Der Algorithmus ist komplex, aber auf hoher Ebene beginnen Sie mit einem Zertifikat des endgültigen Objekts und finden dann ein Zertifikat, dessen Betreff dem Herausgeber des Zertifikats des endgültigen Objekts entspricht (d. H. Ein Zwischenzertifikat). Im einfachen Fall ist dies nur ein Zwischenlink, der mit dem Add-In geliefert wird. Es kann sich jedoch um jedes Zertifikat handeln, das dem Browser bekannt ist. Wenn wir aus der Ferne ein neues, gültiges Zertifikat hinzufügen können, wird Firefox auch versuchen, eine solche Kette aufzubauen. Die folgende Abbildung zeigt die Situation vor und nach der Installation eines neuen Zertifikats.



Nach der Installation eines neuen Zertifikats hat Firefox zwei Möglichkeiten, die Zertifikatkette zu überprüfen: Verwenden Sie ein altes ungültiges Zertifikat (das nicht funktioniert) oder ein neues gültiges Zertifikat (das funktioniert). Ein wichtiges Merkmal hierbei ist, dass das neue Zertifikat denselben Betreffnamen und öffentlichen Schlüssel wie das alte Zertifikat hat, sodass seine Signatur auf dem Zertifikat des endgültigen Objekts gültig ist. Glücklicherweise ist Firefox klug genug, beide Methoden auszuprobieren, bis eine funktionierende gefunden wird, sodass die Erweiterung wieder gültig wird. Bitte beachten Sie, dass dies dieselbe Logik ist, die wir zum Überprüfen von TLS-Zertifikaten verwenden. Dies ist also ein relativ gut verstandener Code, den wir verwenden konnten (Leser, die mit WebPKI vertraut sind, werden verstehen, dass die Kreuzzertifizierung auf diese Weise funktioniert).

Das Tolle an diesem Fix ist, dass keine Änderungen an vorhandenen Erweiterungen erforderlich sind. Wenn wir das neue Zertifikat in Firefox installieren, bestehen auch Erweiterungen mit alten Zertifikaten den Test. Der Trick beim Bereitstellen eines neuen Zertifikats in Firefox besteht darin, es automatisch und remote auszuführen und Firefox dann zu veranlassen, alle möglicherweise deaktivierten Erweiterungen zu überprüfen.

Normandie und Forschungssystem


Ironischerweise war die Lösung des Problems eine spezielle Art von Erweiterung, die als System Add-On (SAO) bezeichnet wird. Für Studien des Publikums (Studien) haben wir zuvor ein System namens Normandie entwickelt, das Firefox-Benutzern SAO liefern kann. Diese SAOs werden automatisch im Browser des Benutzers ausgeführt. Obwohl sie häufig zum Experimentieren verwendet werden, haben sie auch umfassenden Zugriff auf die internen APIs in Firefox. In diesem Fall ist es wichtig, dass sie der Zertifikatsdatenbank, mit der Firefox Erweiterungen überprüft, neue Zertifikate hinzufügen können (technischer Hinweis: Wir fügen das Zertifikat nicht mit besonderen Berechtigungen hinzu, sondern erhalten seine Berechtigungen durch Signieren mit dem Stammzertifikat. Wir fügen es einfach hinzu zum Zertifikatpool, den Firefox verwenden kann, sodass wir in Firefox kein neues privilegiertes Zertifikat hinzufügen).

Die Lösung hier besteht also darin, eine SAO zu erstellen, die zwei Dinge tut:

  1. Installiert das neue Zertifikat, das wir erstellt haben.
  2. Bewirkt, dass der Browser jedes Add-On erneut überprüft, um diejenigen zu aktivieren, die die Verbindung getrennt haben.

Aber warte, sagst du? Add-Ons funktionieren nicht. Wie kann SAO funktionieren? Nun, wir werden es mit einem neuen Zertifikat unterschreiben!

Alles zusammenfügen ... und warum so lange?


Jetzt haben wir also einen Plan: ein neues Zertifikat ausstellen, um das alte zu ersetzen, ein System-Add-On erstellen, um es in Firefox zu installieren, und es in der Normandie bereitstellen. Wir begannen am Freitag, dem 3. Mai, gegen 18:00 Uhr PST mit der Arbeit und schickten den Patch gegen 2:44 Uhr morgens in die Normandie, d. H. Weniger als 9 Stunden. Dann dauerte es weitere 6-12 Stunden, bis die meisten Benutzer ihn erhielten. Dies ist eigentlich ein sehr guter Anfang, aber ich habe auf Twitter eine Reihe von Fragen gesehen, warum wir es nicht schneller machen könnten. Es gibt eine Reihe von zeitaufwändigen Schritten.

Erstens hat es einige Zeit gedauert, ein neues Zwischenzertifikat auszustellen. Wie oben erwähnt, befindet sich das Stammzertifikat im Hardware-Sicherheitsmodul, das offline gespeichert wird. Dies ist eine gute Sicherheitspraxis, da Sie das Stammzertifikat sehr selten verwenden und es daher sicher aufbewahren möchten. Dies ist jedoch offensichtlich etwas unpraktisch, wenn Sie im Notfall ein neues Zertifikat ausstellen müssen. In jedem Fall musste einer unserer Ingenieure an einen sicheren Ort gehen, an dem HSM gelagert wird. Dann gab es mehrere Fehlstarts, bei denen wir nicht das richtige Zertifikat ausstellen konnten und jeder Versuch ein oder zwei Stunden Test wert war, bevor wir genau wussten, was zu tun ist.

Zweitens dauert die Systementwicklung einige Zeit. Konzeptionell ist alles sehr einfach, aber selbst einfache Programme erfordern einige Vorsicht, und wir wollten wirklich sicherstellen, dass wir die Situation nicht verschlechtern. Und bevor SAO gesendet wurde, musste es getestet werden, und dies braucht Zeit, insbesondere angesichts der Tatsache, dass es unterschrieben werden muss. Da das Signatursystem jedoch deaktiviert war, mussten wir nach Problemumgehungen suchen.

Sobald die SAO versandbereit war, dauerte der Einsatz eine Weile. Firefox-Clients suchen alle 6 Stunden nach Updates für die Normandie, und natürlich sind viele Clients offline, sodass die Verteilung des Updates an alle Firefox-Benutzer nicht sofort erfolgte. Im Moment haben die meisten jedoch ein Update und / oder eine neue Version erhalten, die wir später veröffentlicht haben.

Letzte Schritte


Obwohl das über das Studies-System bereitgestellte System-Addon die Situation für die meisten Benutzer korrigieren sollte, erreichte es nicht alle. Insbesondere erfordern verschiedene Benutzertypen einen unterschiedlichen Ansatz:

  • Benutzer, die Telemetrie oder Forschung deaktiviert haben.
  • Benutzer von Firefox für Android (Fennec), wo wir keine Forschung haben.
  • Benutzer nachfolgender Builds von Firefox ESR, die keine Telemetrieberichte abonnieren.
  • Benutzer, die hinter HTTPS MiTM-Proxys stehen, weil unsere Add-On-Installationssysteme Schlüssel für diese Verbindungen erzwingen, was mit dem Proxy in Konflikt steht.
  • Benutzer sehr alter Firefox-Builds, die das Studies-System nicht erreichen kann.

Mit der letzten Gruppe können wir nichts anfangen. Sie müssen auf die neue Version von Firefox aktualisieren, da ältere Versionen normalerweise schwerwiegende, nicht gepatchte Sicherheitslücken aufweisen. Wir wissen, dass einige Leute auf älteren Versionen von Firefox geblieben sind, weil sie Erweiterungen im alten Stil ausführen wollten, aber viele von ihnen arbeiten jetzt mit neueren Versionen von Firefox. Für andere Gruppen haben wir einen Patch für Firefox entwickelt, der nach dem Upgrade ein neues Zertifikat installiert. Es wird auch als neue Version von Firefox "gepunktet" veröffentlicht, daher sollten die Leute es über den regulären Update-Kanal erhalten - und wahrscheinlich bereits erhalten haben. Wenn Sie einen Downstream-Build haben, müssen Sie auf das Update vom Betreuer warten.

Wir erkennen an, dass nichts davon perfekt ist. In einigen Fällen verlieren Benutzer insbesondere Daten, die mit Add-Ons verknüpft sind (z. B. eine Erweiterung wie „Container mit mehreren Konten“ ).

Wir konnten keinen Patch entwickeln, der diese Nebenwirkung vermeidet, aber wir glauben, dass dies kurzfristig der beste Ansatz für die meisten Benutzer ist. Langfristig werden wir nach den besten architektonischen Ansätzen suchen, um solche Probleme zu lösen.

Der Unterricht


Zunächst möchte ich sagen, dass das Team hier hervorragende Arbeit geleistet hat: Sie haben das Update in weniger als 12 Stunden ab dem Zeitpunkt des ersten Berichts entwickelt und gesendet. Als die Person, die an dem Treffen teilgenommen hat, bei dem dies geschah, kann ich sagen, dass die Menschen in einer schwierigen Situation unglaublich hart gearbeitet haben und dass sehr wenig Zeit verschwendet wurde.

Angesichts dessen ist es offensichtlich, dass dies keine ideale Situation ist, und dies hätte überhaupt nicht passieren dürfen. Wir müssen unsere Prozesse eindeutig anpassen, um die Wahrscheinlichkeit dieses und ähnlicher Vorfälle zu verringern und ihre Korrektur zu erleichtern.

Nächste Woche werden wir eine formelle Nachbesprechung durchführen und eine Liste der Änderungen veröffentlichen, die wir vornehmen wollen, aber im Moment sind hier meine ersten Gedanken zu diesem Thema. Vor allem sollten wir eine viel bessere Möglichkeit haben, den Status aller Systeme in Firefox zu überwachen, die eine potenzielle Zeitbombe darstellen. Sie müssen sicherstellen, dass keiner von ihnen plötzlich aufhört zu arbeiten. Wir arbeiten hier noch an den Details, aber zumindest müssen wir eine Bestandsaufnahme solcher Systeme durchführen.

Zweitens brauchen wir einen Mechanismus, um Benutzer schnell zu aktualisieren, selbst wenn - besonders wenn - alles andere nicht funktioniert. Es ist großartig, dass wir das Studiensystem verwenden konnten, aber es war auch nicht das perfekteste Werkzeug, das wir in Betrieb genommen haben und das einige unerwünschte Nebenwirkungen hatte. Insbesondere wissen wir, dass bei vielen Benutzern automatische Updates aktiviert sind, sie jedoch lieber nicht an der Recherche teilnehmen möchten. Dies ist eine vernünftige Präferenz (ganz zu schweigen davon, dass ich den Browser auf diese Weise eingerichtet habe!). Gleichzeitig sollten wir jedoch in der Lage sein, Druck auszuüben Updates. Unabhängig von den internen technischen Mechanismen sollten Benutzer in der Lage sein, Updates (einschließlich Fixes) auszuwählen, aber alles andere aufzugeben. Außerdem sollte der Update-Kanal schneller sein. Selbst am Montag hatten wir noch Benutzer, die das Update oder die neue Version nicht aufgegriffen haben, was eindeutig nicht perfekt ist. Wir haben bereits an diesem Problem gearbeitet, aber dieser Vorfall zeigt, wie wichtig es ist.

Abschließend werden wir einen allgemeineren Blick auf unsere Erweiterungssicherheitsarchitektur werfen, um sicherzustellen, dass sie die Sicherheit korrekt und mit minimalem Ausfallrisiko bietet.

Nächste Woche werden wir die Ergebnisse einer gründlicheren Analyse dieser Situation veröffentlichen.

Source: https://habr.com/ru/post/de451220/


All Articles