Tekniska detaljer om den senaste inaktiveringen av tillÀgg i Firefox

Notera översÀttare: för lÀsarnas bekvÀmlighet ges datum i Moskva-tid

Vi missade nyligen utgÄngen av ett av certifikaten som anvÀnds för att signera tillÀgg. Detta resulterade i att tillÀgg inaktiverades för anvÀndare. Nu nÀr problemet till största delen Àr ÄtgÀrdat vill jag dela med mig av detaljerna om vad som hÀnde och det arbete som gjordes.

Bakgrund: tillÀgg och signaturer

Även om mĂ„nga anvĂ€nder webblĂ€saren direkt, stöder Firefox tillĂ€gg som kallas "tillĂ€gg". Med deras hjĂ€lp lĂ€gger anvĂ€ndarna till olika funktioner i webblĂ€saren. Det finns över 15 tusen tillĂ€gg: frĂ„n annonsblockering ĐŽĐŸ hantera hundratals flikar.

Installerade tillÀgg mÄste ha digital signatur, som skyddar anvÀndare frÄn skadliga tillÀgg och krÀver minimal granskning av tillÀgg av Mozilla-personal. Vi införde detta krav 2015 eftersom vi upplevde allvarliga problem med skadliga tillÀgg.

Hur det fungerar: Varje kopia av Firefox innehÄller ett "rotcertifikat". Nyckeln till denna "rot" lagras i HÄrdvarusÀkerhetsmodul (HSM)utan nÀtverksÄtkomst. Med nÄgra Ärs mellanrum signeras ett nytt "mellancertifikat" med denna nyckel, som anvÀnds vid signering av tillÀgg. NÀr en utvecklare skickar in ett tillÀgg skapar vi ett tillfÀlligt "slutcertifikat" och signerar det med ett mellancertifikat. SjÀlva tillÀgget signeras sedan med slutcertifikatet. Schematiskt det ser ut sÄ hÀr.

Observera att varje certifikat har ett "subjekt" (till vilken certifikatet utfÀrdades) och en "utfÀrdare" (som utfÀrdade certifikatet). I fallet med ett rotcertifikat, "Àmne" = "utfÀrdare", men för andra certifikat Àr utfÀrdaren av certifikatet föremÄlet för det överordnade certifikatet som det signeras av.

En viktig punkt: varje tillÀgg signeras av ett unikt slutcertifikat, men nÀstan alltid Àr dessa slutcertifikat signerade av samma mellancertifikat.

Författarens anmÀrkning: Undantaget Àr mycket gamla tillÀgg. DÄ anvÀndes olika mellancertifikat.

Detta mellancertifikat orsakade problem: varje certifikat Àr giltigt under en viss period. Före eller efter denna period Àr certifikatet ogiltigt och webblÀsaren kommer inte att anvÀnda tillÀgg som signerats av detta certifikat. TyvÀrr gick mellancertifikatet ut den 4 maj klockan 4.

Konsekvenserna visade sig inte omedelbart. Firefox kontrollerar inte signaturerna för installerade tillÀgg konstant, utan ungefÀr en gÄng var 24:e timme, och verifieringstiden Àr individuell för varje anvÀndare. Som ett resultat upplevde vissa mÀnniskor problem direkt, andra mycket senare. Vi blev först medvetna om problemet nÀr certifikatet gick ut och började genast leta efter en lösning.

Minska skador

NÀr vi vÀl insÄg vad som hade hÀnt försökte vi förhindra att situationen blev vÀrre.

För det första slutade de acceptera och signera nya tillÀgg. Det Àr ingen idé att anvÀnda ett utgÄnget certifikat för detta. NÀr jag ser tillbaka skulle jag sÀga att vi kunde ha lÀmnat allt som det var. Vi har nu Äterupptagit att ta emot tillÀgg.

För det andra skickade de omedelbart ut en fix som förhindrade att signaturer kontrollerades dagligen. DÀrmed rÀddade vi de anvÀndare vars webblÀsare Ànnu inte hunnit kontrollera tillÀggen under de senaste XNUMX timmarna. Denna korrigering har nu dragits tillbaka och behövs inte lÀngre.

Parallell drift

I teorin ser lösningen pÄ problemet enkel ut: skapa ett nytt giltigt mellancertifikat och signera om varje tillÀgg. TyvÀrr kommer detta inte att fungera:

  • vi kan inte snabbt signera om 15 tusen tillĂ€gg pĂ„ en gĂ„ng, systemet Ă€r inte designat för en sĂ„dan belastning
  • Efter att vi har signerat tillĂ€ggen mĂ„ste de uppdaterade versionerna levereras till anvĂ€ndarna. De flesta tillĂ€gg installeras frĂ„n Mozilla-servrar, sĂ„ Firefox kommer att hitta uppdateringar inom de nĂ€rmaste XNUMX timmarna, men vissa utvecklare distribuerar signerade tillĂ€gg via tredjepartskanaler, sĂ„ anvĂ€ndare mĂ„ste uppdatera sĂ„dana tillĂ€gg manuellt

IstÀllet försökte vi utveckla en fix som skulle nÄ alla anvÀndare utan att krÀva mycket eller ingen ÄtgÀrd frÄn deras sida.

Ganska snabbt kom vi fram till tvÄ huvudstrategier, som vi anvÀnde parallellt:

  • Uppdatera Firefox för att Ă€ndra certifikatets giltighetstid. Detta kommer att fĂ„ befintliga tillĂ€gg att fungera magiskt igen, men kommer att krĂ€va att en ny version av Firefox slĂ€pps och skickas
  • Skapa ett giltigt certifikat och pĂ„ nĂ„got sĂ€tt övertyga Firefox att acceptera det istĂ€llet för det befintliga som har gĂ„tt ut

Vi bestÀmde oss för att anvÀnda det första alternativet först, vilket sÄg ganska fungerande ut. I slutet av dagen slÀppte de en andra fix (ett nytt certifikat), som vi kommer att prata om senare.

ErsÀtter ett certifikat

Som jag nÀmnde ovan krÀvdes det:

  • skapa ett nytt giltigt certifikat
  • installera det pĂ„ distans i Firefox

För att förstÄ varför detta fungerar, lÄt oss ta en nÀrmare titt pÄ tillÀggsverifieringsprocessen. SjÀlva tillÀgget kommer som en uppsÀttning filer, inklusive en kedja av certifikat som anvÀnds för signering. Som ett resultat kan tillÀgget verifieras om webblÀsaren kÀnner till rotcertifikatet, som Àr inbyggt i Firefox vid byggtiden. Men som vi redan vet har det mellanliggande certifikatet gÄtt ut, sÄ det Àr omöjligt att verifiera tillÀgget.

NĂ€r Firefox försöker verifiera ett tillĂ€gg Ă€r det inte begrĂ€nsat till att anvĂ€nda certifikaten som finns i sjĂ€lva tillĂ€gget. IstĂ€llet försöker webblĂ€saren skapa en giltig certifikatkedja, som börjar med slutcertifikatet och fortsĂ€tter tills det kommer till roten. PĂ„ första nivĂ„n börjar vi med slutbeviset och hittar sedan certifikatet vars Ă€mne Ă€r utfĂ€rdaren av slutcertifikatet (det vill sĂ€ga mellancertifikatet). Vanligtvis levereras detta mellancertifikat med tillĂ€gget, men vilket certifikat som helst frĂ„n webblĂ€sarens lagring kan ocksĂ„ fungera som detta mellancertifikat. Om vi ​​pĂ„ distans kan lĂ€gga till ett nytt giltigt certifikat till certifikatarkivet kommer Firefox att försöka anvĂ€nda det. Situationen före och efter installation av ett nytt certifikat.

Efter installation av det nya certifikatet kommer Firefox att ha tvÄ alternativ nÀr certifikatkedjan valideras: anvÀnd det gamla ogiltiga certifikatet (som inte fungerar) eller det nya giltiga certifikatet (som kommer att fungera). Det Àr viktigt att det nya certifikatet innehÄller samma Àmnesnamn och publika nyckel som det gamla certifikatet, sÄ dess signatur pÄ det slutliga certifikatet kommer att vara giltig. Firefox Àr smart nog att prova bÄda alternativen tills den hittar en som fungerar, sÄ tillÀggen testas igen. Observera att detta Àr samma logik som vi anvÀnder för att validera TLS-certifikat.

Författarens anmÀrkning: LÀsare som Àr bekanta med WebPKI kommer att notera att korscertifikat fungerar pÄ exakt samma sÀtt.

Det fantastiska med den hÀr korrigeringen Àr att den inte krÀver att du signerar om befintliga tillÀgg. SÄ snart webblÀsaren fÄr det nya certifikatet kommer alla tillÀgg att fungera igen. Den ÄterstÄende utmaningen Àr att leverera det nya certifikatet till anvÀndarna (automatiskt och pÄ distans), samt att fÄ Firefox att omkontrollera inaktiverade tillÀgg.

Normandie och forskningssystemet

Ironiskt nog löses detta problem med ett speciellt tillÀgg som kallas "system". För att bedriva forskning utvecklade vi ett system som heter Normandie som levererar forskning till anvÀndarna. Dessa studier utförs automatiskt i webblÀsaren och har förbÀttrad tillgÄng till Firefoxs interna API:er. Forskning kan lÀgga till nya certifikat till certifikatarkivet.

Författarens anmÀrkning: Vi lÀgger inte till ett certifikat med nÄgra speciella privilegier; det Àr signerat av rotcertifikatet, sÄ Firefox litar pÄ det. Vi lÀgger helt enkelt till den i poolen av certifikat som kan anvÀndas av webblÀsaren.

SÄ lösningen Àr att skapa en studie:

  • installera det nya certifikatet vi skapade för anvĂ€ndare
  • tvingar webblĂ€saren att kontrollera inaktiverade tillĂ€gg igen sĂ„ att de fungerar igen

"Men vÀnta", sÀger du, "tillÀgg fungerar inte, hur kan jag starta ett systemtillÀgg?" LÄt oss signera det med ett nytt certifikat!

Att lÀgga ihop allt... varför tar det sÄ lÄng tid?

SÄ, planen: utfÀrda ett nytt certifikat för att ersÀtta det gamla, skapa ett systemtillÀgg och installera det för anvÀndare via Normandie. Problemen började som sagt den 4 maj klockan 4:00 och redan klockan 12:44 samma dag, mindre Àn 9 timmar senare, skickade vi en fix till Normandie. Det tog ytterligare 6-12 timmar för den att nÄ alla anvÀndare. Inte illa alls, men folk pÄ Twitter frÄgar varför vi inte kunde ha agerat snabbare.

För det första tog det tid att utfÀrda ett nytt mellancertifikat. Som jag nÀmnde ovan lagras nyckeln till rotcertifikatet offline i hÄrdvarusÀkerhetsmodulen. Detta Àr bra ur sÀkerhetssynpunkt, eftersom roten anvÀnds mycket sÀllan och bör skyddas pÄ ett tillförlitligt sÀtt, men det Àr lite obekvÀmt nÀr du snabbt behöver signera ett nytt certifikat. En av vÄra ingenjörer fick Äka till HSM:s lager. Sedan gjordes det misslyckade försök att utfÀrda rÀtt certifikat, och varje försök kostade en eller tvÄ timmars testning.

För det andra tog utvecklingen av systemtillÀgget lite tid. Konceptuellt Àr det vÀldigt enkelt, men Àven enkla program krÀver omsorg. Vi ville se till att vi inte gjorde situationen vÀrre. Forskning mÄste testas innan den skickas till anvÀndare. Dessutom mÄste tillÀgget vara signerat, men vÄrt signeringssystem för tillÀgg var inaktiverat, sÄ vi var tvungna att hitta en lösning.

Slutligen, nĂ€r vi hade forskningen klar för inlĂ€mning tog implementeringen tid. WebblĂ€saren söker efter Normandie-uppdateringar var 6:e ​​timme. Alla datorer Ă€r inte alltid pĂ„ och anslutna till Internet, sĂ„ det kommer att ta tid för korrigeringen att spridas till anvĂ€ndarna.

Sista stegen

Forskningen borde lösa problemet för de flesta anvÀndare, men Àr inte tillgÀnglig för alla. Vissa anvÀndare krÀver ett speciellt tillvÀgagÄngssÀtt:

  • anvĂ€ndare som har inaktiverat forskning eller telemetri
  • anvĂ€ndare av Android-versionen (Fennec), dĂ€r forskning inte alls stöds
  • anvĂ€ndare av anpassade versioner av Firefox ESR i företag dĂ€r telemetri inte kan aktiveras
  • anvĂ€ndare som sitter bakom MitM-proxyer, eftersom vĂ„rt tillĂ€ggsinstallationssystem anvĂ€nder nyckelstiftning, vilket inte fungerar med sĂ„dana proxyservrar
  • anvĂ€ndare av Ă€ldre versioner av Firefox som inte stöder forskning

Vi kan inte göra nĂ„got Ă„t ​​den senare kategorin anvĂ€ndare – de bör fortfarande uppdatera till den nya versionen av Firefox, eftersom förĂ„ldrade sĂ„dana har allvarliga opatchade sĂ„rbarheter. Vi vet att vissa mĂ€nniskor stannar pĂ„ Ă€ldre versioner av Firefox eftersom de vill köra gamla tillĂ€gg, men mĂ„nga av de gamla tillĂ€ggen har redan porterats till nyare versioner av webblĂ€saren. För andra anvĂ€ndare har vi utvecklat en patch som kommer att installera ett nytt certifikat. Det slĂ€pptes som en bugfix-utgĂ„va (översĂ€ttarens anmĂ€rkning: Firefox 66.0.5), sĂ„ att folk kommer att fĂ„ det - troligen redan fĂ„tt det - via den vanliga uppdateringskanalen. Om du anvĂ€nder en anpassad version av Firefox ESR, kontakta din underhĂ„llare.

Vi förstÄr att detta inte Àr idealiskt. I vissa fall förlorade anvÀndare tillÀggsdata (till exempel tillÀggsdata BehÄllare med flera konton).

Denna bieffekt gick inte att undvika, men vi tror att vi pÄ kort sikt har valt den bÀsta lösningen för de flesta anvÀndare. PÄ lÄng sikt kommer vi att leta efter andra, mer avancerade arkitektoniska angreppssÀtt.

Lektionerna

Först gjorde vÄrt team ett fantastiskt jobb med att skapa och skicka en fix pÄ mindre Àn 12 timmar efter att problemet upptÀcktes. Som en som deltog i mötena kan jag sÀga att i den hÀr svÄra situationen arbetade mÀnniskor vÀldigt hÄrt och vÀldigt lite tid gick till spillo.

Uppenbarligen borde inget av detta ha hÀnt alls. Det Àr helt klart vÀrt besvÀret att anpassa vÄra processer för att minska sannolikheten för sÄdana incidenter och underlÀtta saneringen.

NÀsta vecka kommer vi att publicera en officiell obduktion och en lista över förÀndringar vi tÀnker göra. För nu delar jag med mig av mina tankar. För det första mÄste det finnas ett bÀttre sÀtt att övervaka statusen för vad som Àr en potentiell tidsinstÀlld bomb. Vi mÄste vara sÀkra pÄ att vi inte hamnar i en situation dÀr en av dem plötsligt fungerar. Vi hÄller fortfarande pÄ att utarbeta detaljerna, men som ett minimum Àr det nödvÀndigt att ta hÀnsyn till alla sÄdana saker.

För det andra behöver vi en mekanism för att snabbt leverera uppdateringar till anvĂ€ndare, Ă€ven nĂ€r – sĂ€rskilt nĂ€r – allt annat misslyckas. Det var bra att vi kunde anvĂ€nda "forsknings"-systemet, men det Ă€r ett imperfekt verktyg och har nĂ„gra oönskade biverkningar. I synnerhet vet vi att mĂ„nga anvĂ€ndare har automatiska uppdateringar aktiverade, men föredrar att inte delta i forskning (jag erkĂ€nner, jag har dem avstĂ€ngda ocksĂ„!). Samtidigt behöver vi ett sĂ€tt att skicka uppdateringar till anvĂ€ndarna, men oavsett den interna tekniska implementeringen ska anvĂ€ndare kunna prenumerera pĂ„ uppdateringar (inklusive snabbkorrigeringar) men vĂ€lja bort allt annat. Dessutom bör uppdateringskanalen vara mer lyhörd Ă€n den Ă€r nu. Även den 6 maj fanns det fortfarande anvĂ€ndare som inte utnyttjade vare sig fixen eller den nya versionen. Det hĂ€r problemet har redan arbetats med, men det som hĂ€nde visade hur viktigt det Ă€r.

Slutligen ska vi titta nÀrmare pÄ tillÀggets sÀkerhetsarkitektur för att se till att det ger rÀtt sÀkerhetsnivÄ med minimal risk för att nÄgot gÄr sönder.

NÀsta vecka ska vi titta pÄ resultatet av en mer grundlig analys av vad som hÀnde, men under tiden svarar jag gÀrna pÄ frÄgor via e-post: [e-postskyddad]

KĂ€lla: linux.org.ru

LĂ€gg en kommentar