Firefox was medio januari enkele uren beperkt te gebruiken. Naar nu is gebleken was een Google-dienst onaangekondigd overgestapt op HTTP/3. Dit activeerde een bug in de browser die hoofdletters in een header verving door kleine letters. De HTTP/3-code kan die niet lezen.
Een deel van de Firefox-gebruikers kon op 13 januari ruim vier uur lang geen websites bezoeken, al bleek toen al dat het uitschakelen van HTTP/3 hielp. Firefox Tech Lead en Senior Staff Security Engineer Christian Holler legt op een Mozilla-blog uit waardoor dit kwam. Het probleem ontstond toen Google Cloud Platform de standaard HTTP overzette naar HTTP/3. Google had dit niet vooraf aangekondigd en de Firefox-browser nam deze wijziging standaard over. Firefox gebruikt clouddiensten als GCP voor updates, telemetrie, het beheren van certificaten, crashreports en andere functies.
Mozilla kwam er al snel achter dat het omschakelen naar HTTP/3 tot de storing leidde. Toen dit werd uitgeschakeld en de browsers weer HTTP/2 gingen gebruiken, was het probleem voorbij. Hiermee was echter nog niet duidelijk waarom HTTP/3 problemen opleverde.
Dit bleek te liggen aan onderdelen van de Firefox-browser die op basis van Rust gemaakt zijn, specifiek de Telemetry-header. Alle HTTP/3-verbindingen gaan via Necko, de netwerkstack van Firefox. Rust-componenten gaan echter niet direct via Necko, maar lopen eerst via de intermediate library viaduct. Bij deze intermediate library ging het fout.
De lower-level-HTTP/3-code vereist namelijk de Content-Length
-header, die Necko automatisch aanmaakt als code deze header nog niet heeft. Bij het controleren of code die header heeft, kijkt Necko echter niet naar het onderscheid tussen kleine letters en hoofdletters. Dit bleek een probleem te zijn, doordat viaduct van alle hoofdletters in headers kleine letters maakt. Daardoor ontstaat de content-length
-header, dus zonder hoofdletters.
Bij Rust-code waar de header nog niet was toegevoegd, ging niets fout. Viaduct maakt zelf namelijk geen headers aan, maar verandert alleen de hoofdletters in kleine letters. De code ging dus zonder header naar Necko, dat de juiste Content-Length
-header aanmaakte.
Telemetry was tijdens de storing het enige Firefox-onderdeel dat is gemaakt in Rust en dat de juiste Content-Length
-header had. Viaduct maakte hier content-length
van, wat niet door Necko werd aangepast. Doordat de lower-level-HTTP/3-code de Content-Length
-header met hoofdletters vereist, kon de HTTP/3-code de header niet vinden, terwijl die er volgens Necko wel was. Daardoor onstond een oneindige loop en kwam er ook geen errormelding. Die loop had op zijn beurt tot gevolg dat andere netwerkcommunicatie werd geblokkeerd en de browser onbruikbaar werd. Rust-onderdelen zonder de header werkten wel, omdat de header dan pas bij Necko werd toegevoegd. Daardoor konden gebruikers die Telemetry uitschakelden, wel de browser gebruiken.
Mozilla zegt nu in contact te zijn met Google om dergelijke onverwachte veranderingen te voorkomen. Het bedrijf erkent dat een aankondiging het risico op een dergelijk incident niet helemaal wegneemt, maar dat daardoor wel meer tests mogelijk zijn. Daarnaast gaat Mozilla alle service configurations nalopen om te kijken of andere diensten ook zomaar de standaardinstellingen van een andere dienst overnemen, zoals bij de overschakeling naar HTTP/3 gebeurde. Tot slot wil Mozilla meer tests uitvoeren met verschillende HTTP-versies en wil de organisatie zijn incident response versnellen.