Laufzeitgarantie über Versionen hinweg
Protobuf-Sprachbindungen haben zwei Komponenten. Der generierte Code (Gencode) und die Laufzeitbibliotheken, die die gemeinsame Funktionalität für diesen generierten Code implementieren. Wenn diese aus verschiedenen Veröffentlichungen von Protobuf stammen, befinden wir uns in einer „Cross-Version-Runtime“-Situation.
Wir beabsichtigen, die folgenden Garantien für die meisten Sprachen anzubieten. Dies sind die Standardgarantien; jedoch können die Besitzer von Protobuf-Codegeneratoren und -Laufzeitumgebungen diese explizit mit spezifischeren Garantien für diese Sprache überschreiben. C++ und Rust haben strengere Garantien als üblich, und Python hat lockerere.
Protobuf-Verwendungen über Versionen hinweg außerhalb der Garantien sind fehleranfällig und nicht unterstützt. Versionsunterschiede können zu unzuverlässigen und undefinierten Verhaltensweisen führen, die schwer zu diagnostizieren sind, auch wenn es oft scheint zu funktionieren, solange sich nichts in einer nicht quellenkompatiblen Weise geändert hat. Für Protobuf verhindert die Verbreitung von Tools und Diensten, die auf die Verwendung nicht unterstützter Protobuf-Sprachbindungen angewiesen sind, dass das Protobuf-Team die Protobuf-Implementierung als Reaktion auf Fehlerberichte oder Sicherheitslücken aktualisiert.
Neuer Gencode + alte Laufzeit = Niemals erlaubt
Wir können in jeder Art von Release (Haupt-, Neben- oder Patch-) neue Laufzeit-APIs hinzufügen. Der Gencode in diesem Release darf diese neuen APIs verwenden. Die Konsequenz ist, dass der Gencode niemals mit einer Laufzeitumgebung gepaart werden sollte, die älter ist als die protoc- und Plugin-Version, die zum Generieren dieser Bindungen verwendet wurde.
Wir werden nach Möglichkeit „Poison Pills“ hinzufügen, um Versuche zu verhindern, neueren Gencode mit einer älteren Laufzeitumgebung zu koppeln.
Hauptversionen
Protobuf implementiert ein gleitendes Fenster für die Kompatibilität von Hauptversionen. Code, der für die Hauptversion V generiert wurde (vollständige Version: V.x.y), wird von Protobuf-Laufzeitumgebungen der Hauptversionen V und V+1 unterstützt.
Protobuf wird die Verwendung von Gencode der Version V mit Laufzeitumgebungen >= V+2 nicht unterstützen und wird einen „Poison Pill“-Mechanismus verwenden, um mit einer klaren Fehlermeldung zu fehlschlagen, wenn eine Software-Assembly versucht, eine solche Konfiguration zu verwenden.
Zum Beispiel
- Von der Protobuf-Version 3.0.0 generierter Java-Code funktioniert mit Laufzeitumgebungen von 3.0.0 bis 4.x.y, aber nicht mit Laufzeitumgebungen von 2.0.0 bis 2.x.y oder Laufzeitumgebungen >= 5.0.0.
- Von der Protobuf-Version 4.27.2 generierter Java-Code funktioniert mit Laufzeitumgebungen von 4.27.2 bis 5.x.y, aber nicht mit Laufzeitumgebungen von 2.0.0 bis 4.27.1 oder Laufzeitumgebungen >= 6.0.0.
Ausnahmen können gemacht werden, wenn die Kompatibilität mit älterem Gencode nicht aufrechterhalten werden kann, z. B. bei Sicherheitsupdates, die aktualisierten Gencode erfordern.
Hinweis: Poison Pills wurden in der Protobuf-Version 26.0 eingeführt. Java-Gencode älter als 4.26.0 funktioniert möglicherweise scheinbar mit Laufzeitumgebungen, die älter sind als der Gencode. Die Kombination aus neuerem Gencode und älterer Laufzeitumgebung kann jedoch schwerwiegende Fehler aufweisen, die erst zur Laufzeit auftreten.
Hinweis: C++ und Rust unterstützen keine Kompatibilitätsfenster, und Python unterstützt deutlich längere.
Nebenversionen
Innerhalb einer einzigen Hauptlaufzeitversion läuft der generierte Code einer älteren Version von protoc auf einer neueren Laufzeitumgebung.
Hinweis: C++ und Rust unterstützen keine Kompatibilität über Nebenversionen hinweg.
Sicherheitsausnahme
Wir behalten uns das Recht vor, die oben genannten Zusagen aus Sicherheitsgründen zu verletzen. Wir gehen davon aus, dass diese Ausnahmen selten sein werden, werden aber Sicherheit immer über diese Garantien stellen. Beispielsweise erforderte die Footmitten CVE gepaarte Updates sowohl für die Laufzeitumgebung als auch für den generierten Code für Java. Infolgedessen konnte Code, der von 3.20.3 generiert wurde (der den Footmitten-Fix enthielt), nicht mit der Laufzeitbibliothek 3.21.6 (die dem Footmitten-Fix vorausging) geladen werden, was die folgende Kompatibilitätsmatrix erstellt.
| Generierte Code-Version | |||||
| 3.20.2 | 3.20.3 | 3.21.6 | 3.21.7 | ||
| Laufzeit Version | 3.20.2 | Vuln | !Kaputt! | !Vuln! | !Kaputt! |
| 3.20.3 | Vuln | Funktioniert | !Vuln! | !Funktioniert?! | |
| 3.21.6 | Vuln | Kaputt | Vuln | !Kaputt! | |
| 3.21.7 | Vuln | Funktioniert | Vuln | Funktioniert | |
- „Vuln“ bedeutet, dass die Kombination erfolgreich gestartet wird, aber die Sicherheitslücke weiterhin besteht.
- „Works“ bedeutet, dass die Kombination erfolgreich gestartet wird und die Schwachstelle nicht aufweist.
- „Broken“ bedeutet, dass die Kombination nicht erfolgreich gestartet wird.
- !Fett! kennzeichnet Konfigurationen, die neueren Gencode mit älterer Laufzeitumgebung mischen und die niemals dafür gedacht waren, zusammenzuarbeiten.
Keine Koexistenz mehrerer Hauptlaufzeitversionen
Die Koexistenz mehrerer Hauptversionen im selben Prozess wird nicht unterstützt.
C++ und Rust-spezifische Garantien
Protobuf C++ und Rust lehnen jegliche Laufzeitkompatibilität ab und erfordern jederzeit eine exakte Übereinstimmung zwischen der generierten Codeversion und der Laufzeitversion.
Zusätzlich macht Protobuf C++ keine Garantien für ABI-Stabilität über beliebige Versionen hinweg (Haupt-, Neben- oder Mikroversionen).
Python-spezifische Garantien
Seit der Veröffentlichung 3.20.0 ist der generierte Protobuf Python-Code eine dünne Hülle um ein eingebettetes FileDescriptorProto. Da diese Protos extrem lange Zeiträume unterstützt werden, sind unsere üblichen Kompatibilitätsfenster für Hauptversionen in der Regel nicht erforderlich.
Python kann die Kompatibilität des generierten Codes in zukünftigen Hauptversionen unterbrechen, aber dies wird im Voraus mit Warnungen und Fehlermeldungen (Poison Pill) angekündigt. Ab Version 6.32.0 wird der gesamte generierte Code seit 3.20.0 bis mindestens 8.x.y unterstützt.