Chromium Chronicle Nr. 23: Bestätigte Builds in der Chrome-Infrastruktur

Folge 23:von Akash Mukherjee aus Mountain View, Kalifornien (Juli 2021)
Vorherige Folgen

Wenn wir Chrome entwickeln, tragen viele Elemente zur Umgebung bei, die die Ausgabe eines Artefakts beeinflusst. Über das Betriebssystem, die installierten unterstützenden Bibliotheken, Abhängigkeiten von Drittanbietern, installierte Tools und die Laufzeitumgebung selbst. Jedes davon hat verschiedene Sicherheitsstufen.

In der Vergangenheit hat Google die Binärautorisierung verwendet, eine interne Prüfung der Laufzeitdurchsetzung, die Insiderrisiken minimiert, indem sichergestellt wird, dass die bei Google bereitgestellte Produktionssoftware und -konfiguration ordnungsgemäß geprüft wird und eine rückverfolgbare Herkunft aufweist.

Google verringert das Risiko von Software, die wir an Nutzer ausliefern, indem sichergestellt wird, dass keine einzelne Person den Build und die Lieferkette der auf LUCI basierenden Artefakte manipulieren kann, ohne erkannt zu werden.

Seit letztem Jahr erstellt das System für jeden Build ein überprüfbares Build-Manifest. Es enthält ein signiertes JWT, das die in den Build verwendeten Quellen, kryptografische Hashes der erstellten Binärprogramme und Artefakte sowie vollständige Build-Parameter vollständig beschreibt. Mit diesem Build-Manifest können wir ein Artefakt zu den Quellen zurückverfolgen, wodurch der Build-Prozess und seine Ausgaben überprüfbar werden.

Außerdem können wir mithilfe des Manifests prüfen, ob das erstellte Artefakt geändert wurde, da Änderungen die Signatur ungültig machen würden. Insgesamt haben wir so eine Chain of Custody für Artefakte, wenn diese zwischen vertrauenswürdigen Systemen hin- und herfahren.

Die Binärautorisierung ist als zweistufiges System implementiert. Das System generiert eine provenance mit Informationen zur Build-Zeit. Die Richtlinie wird vor dem Signieren oder Installieren von Software erzwungen.

def CreateProvenance(self, build_manifest: Mapping[str, Any]):
  """Builder generates and signs provenance given build manifest. Signed JWT is placed
  alongside built artifact."""

In Chrome wird die Richtlinie vor dem Signieren der erzeugten Softwareartefakte mithilfe der Signaturinfrastruktur von Google erzwungen, um bestimmte Mindestsicherheitsanforderungen des Builds zu erfüllen.

def VerifyProvenance(self, artifact_hash: str, provenance: str):
  """Provenance is verified using a policy engine service before signing an artifact."""

Die Anforderungen lassen sich in etwa vier Bereiche unterteilen:

  • Versionsverwaltung: Schützt die Daten, die in den Build aufgenommen wurden.
  • Build:Schützt den Prozess, der die Quelle in ein Binärprogramm konvertiert.
  • Herkunft:Attestierung, die ein überprüfbares Build-Manifest enthält.
  • Richtlinie:Regeln, die bestimmen, ob ein bestimmtes Artefakt in einem bestimmten Kontext infrage kommt.

Durch die Implementierung einer Prüfung der Richtlinienerzwingung als Teil der CI- und CD-Prozesse für Chrome und die Infrastruktur konnten wir prüfen, ob der Code und die Konfiguration bestimmte Mindeststandards für die Sicherheit erfüllen. Dies ist eine wichtige Steuerung, mit der die Möglichkeit eines potenziell böswilligen Insiders oder eines manipulierten Insiderkontos eingeschränkt wird, um die Software zu verändern, die wir Nutzern zur Verfügung stellen.