Mozilla beschermt Firefox-gebruikers tegen injectieaanvallen op about:-pagina's

Mozilla gaat Firefox-gebruikers beschermen tegen injectieaanvallen op about:-pagina's. Dit doet het team door inline-scrips te verplaatsen naar packaged bestanden. Ook heeft Mozilla de eval()-achtige scripts in de browser herschreven.

De 45 about:-pagina's in Firefox bieden een interface voor de weergave van de interne status van de browser. Een van deze pagina's is bijvoorbeeld about:config. Deze pagina geeft een interface voor een api weer, waarmee Firefox-gebruikers hun browser naar eigen wens kunnen aanpassen. Deze about:-pagina's worden geïmplementeerd met html en JavaScript, en vallen onder hetzelfde beveiligingsprocedé als normale webpagina's. Ze zijn daarmee niet immuun voor injectieaanvallen. Wanneer het kwaadwillenden lukt om code in de about:-pagina's van Firefox te injecteren, kunnen ze aanpassingen maken in de beveiligingsfuncties van de browser zelf.

Om gebruikers te beschermen heeft Mozilla alle inline event-handlers herschreven en heeft het team alle inline JavaScript-code verplaatst naar verpakte bestanden. Hierdoor kan Mozilla een sterkere content security policy toepassen. Hieronder valt bijvoorbeeld een nieuwe functie die door Mozilla 'default-src chrome:' wordt genoemd. Deze functie zorgt ervoor dat geïnjecteerde code niet uitgevoerd kan worden. JavaScript-code kan vanaf nu alleen worden uitgevoerd wanneer deze code vanuit verpakte bestanden wordt geladen door een intern protocol. Het niet langer toestaan van inline code in about:-pagina's biedt volgens Mozilla een goede eerste verdedigingslinie tegen aanvallen met code-injectie.

Mozilla heeft ook eval()-achtige functies in Firefox herschreven om het gebruik van deze JavaScript-functie te beperken. Functies als eval() zijn erg krachtig, maar tegelijkertijd gevaarlijk, meldt Mozilla. Eval staat voor evaluate, en dat is precies wat de eval()-functie doet. Het evalueert een stuk code en voert het uit. Door deze functie kan code die in locaties buiten scripts is opgeslagen, ook worden uitgevoerd, met kwetsbaarheden voor aanvallen met geïnjecteerde code van dien. Mozilla raadt het gebruik van de eval()-functie af ten gunste van veiligere alternatieven. Het team heeft verder voorwaarden in de code toegevoegd die het gebruik van eval()-achtige functies in system-privileged context niet toestaan. Hiermee kan Mozilla het gebruik van eval()-code opsporen.

De about:config-pagina in Firefox

Door Daan van Monsjou

Redacteur

14-10-2019 • 14:53

39 Linkedin

Reacties (39)

39
39
30
4
0
4
Wijzig sortering
about:about voor alle about pagina's. :)
De 45 about:-pagina's in Firefox [...]
Ik zie 39 pagina's en niet de 45 die genoemd worden. :?
Een aantal about: pagina's staan niet in about:about, zoals about:certerror. Dit zijn bijvoorbeeld pagina's waar je weinig aan hebt zonder query string. Zie dit.

[Reactie gewijzigd door jandem op 14 oktober 2019 16:24]

Klopt, sommige worden alleen in bepaalde situaties aangeroepen.
about:blank
about:blocked
about:certerror
about:checkerboard
about:neterror
about:sessionrestore
about:tabcrashed
about:welcomeback
And some are omitted because they require query strings.
Bovenaan de about:about pagina staat dit. Sommige zijn dus weggelaten uit de lijst.
[...]

Ik zie 39 pagina's en niet de 45 die genoemd worden. :?
40 in de laatste nightly.
Eval staat voor evaluate, en dat is precies wat de eval()-functie doet. Het evalueert een stuk code en voert het uit.
Ik dacht meer aan: het evalueert de code niet maar voert hem domweg uit.
Dat is wat het woord evalueert betekent in code-termen.
Is "evalueert (...) en voert het uit" dan niet dubbelop?
Evaluate betekend ook gebruiken als.
PHP Documentatie zegt bijvoorbeeld over eval() : `Evaluate string as PHP code'

Gebruik/beschouw string als code.
Ik ken het van Bash. Erg link commando...
In Perl wordt het nog wel gebruikt om te voorkomen dat code keihard crashed. Met een eval() eromheen kan je code tenminste gewoon doorgaan.

my $onzin = 'kan niet';
eval {
$onzin = 10 / 0;
};

print $onzin . "\n";
In mijn logica breekt het op deling door 0, of wordt die toewijzing zo al afgekeurd en vergeten voor de uitvoering zodat de eerdere string blijft bestaan zonder errors? Wordt wel lastig bugs opsporen zo...

In Bash kan het af en toe handig zijn om een textstring letterlijk als commando uit te voeren maar code en runtime-data op 1 hoop gooien is over het algemeen niet ideaal als je een consistent programma wil maken.

[Reactie gewijzigd door blorf op 14 oktober 2019 17:10]

Hier gaat de eval fout, er is dus niets aan $onzin toegekend, en de oude waarde is dus behouden.

Normaal vang je het (mogelijke) resultaat van de eval {} op. Als daar wat uitkomt is de eval gefaald, en geef je een error terug.

In andere talen heb je daar een mooi try/catch systeem voor :)
Dat weet ik allemaal wel, maar stellen dat eval precies doet wat het zegt suggereert dat er alleen programmeurs op tweakers zitten en dan hoef je dat niet eens uit te leggen.
PHP Documentatie zegt bijvoorbeeld over eval() : `Evaluate string as PHP code'
De clou is datie dan probeert om hetgeen in de string zit uit te voeren.
Dus ook hier staat 'evalueren' gelijk aan uitvoeren.
In zn algemeenheid betekent het 'geef me het antwoord op de expressie die ik je hier geef'.
Die expressie kan een string zijn die code bevat, maar ook een sommetje met variabelen.
Als je die PHP eval() functie dus geen PHP code geeft dan krijg je een error omdat het niet geparseerd kon worden. Hij kan je er dus geen antwoord op geven en eigenlijk heb je dan een syntax error veroorzaakt.
Het begint natuurlijk met de vraag waarom je javascript toe zou staan op het overzicht van je configuratie instellingen? Omdat het een browser betreft hoeft niet alles meteen een webpagina te zijn lijkt mij.
Veel onderdelen van de browser (interface) zelf gebruiken CSS en JavaScript, de about-pagina's zijn daar slechts een klein onderdeel van. Dit betekent dat JavaScript gewoon nodig is voor de werking van de browser. Wat is het alternatief? Al die code herschrijven in C++ of Rust heeft ook zo z'n nadelen.

Het gaat hier alleen om "privileged" JS, dus moet er uitgekeken worden dat code hier geen misbruik van kan maken. Gebruik van eval() e.d. blokkeren helpt daarbij.

[Reactie gewijzigd door jandem op 14 oktober 2019 16:35]

Het alternatief is om opties/voorkeuren/instellingen in een apart menu te tonen, in plaats van in die about: constructie. Het is uiteindelijk gewoon een set van variabelen met hun waardes. Chrome en Firefox zijn geschreven in C++, dus het waarschijnlijk niet heel complex om daar zo'n menu in te bouwen.
Dat bedoelde ik ook met mijn opmerking "Omdat het een browser betreft hoeft niet alles meteen een webpagina te zijn" ;)
Chrome en Firefox zijn geschreven in C++
De userinterface van deze browsers zijn niet geschreven in C++. Deze zijn geschreven in HTML/CSS/JS. Als dat stuk naar C++ getrokken moet worden, betekent dat je in essentie een heel nieuwe rendering engine moet gaan bouwen. Dat zou erg veel dubbel werk betekenen. Zonde van de tijd: er is immers al een fantastische rendering engine, die prima fungeert. Die engine moet om diverse redenen al heel erg veilig zijn (het is namelijk remote-code-execution by design). Een prima kandidaat om de niet-webcontent mee te renderen dus, vooral als er nog aanvullende eisen aan die niet-webcontent gesteld kunnen worden. Dat laatse is waar dit artikel over ging.
Misschien praten we langs elkaar heen, maar ik zie gewoon C++ code voor het/een menu:
https://github.com/chromi...41/ui/views/controls/menu
Dat is de code voor een menu, niet het menu (klik rechts, en daar heb je 'm). In dezelfde map vind je code voor de ingebouwde dropdown box, textbox etc. Die dingen worden gebruik voor de betreffende HTML elementen.

De echte menu's (waar je de instellingen kunt regelen) zijn geïmplementeerd in html5. De gebruikte controls zijn geïmplementeerd in c++, maar dat zijn dezelfde als waar ik nu ook mijn tekst in aan het typen ben.
Is het gek om als developer nog nooit van eval te hebben gehoord? Wanneer zou je eval moeten/kunnen gebruiken? Er staat voor functies buiten de lokale code, maar waar moet ik dan het denken? Het gebruik wordt sowieso afgeraden, misschien Is dat de reden dat ik dit nooit ben tegengekomen.

[Reactie gewijzigd door HollowGamer op 14 oktober 2019 18:13]

Het is handig om code die je krijgt als string (e.g. ingelezen uit een text file) toch uit te kunnen voeren als onderdeel van je programma.
Echter gezien de veiligheidsrisico's is het zeker niet erg dat je dit niet kent. Professioneel zal je het toch nooit mogen gebruiken.

[Reactie gewijzigd door Nivve op 15 oktober 2019 09:56]

Thanks voor je uitleg. :)

Misschien dat dit vroeger* wel handig was, maar nu met import, classes, namespaces, etc. lijkt me dit inderdaad niet echt de bedoeling. Of je gebruikt iets als een API.

Ik begrijp echter niet waarom het er nog niet helemaal is uitgesloopt. Want als ik het goed begrijp kan iedere website dit nog altijd op die manier gebruiken?
Tja, er is altijd wel een specifieke use-case wat een extra functie rechtvaardigd. Zoals het artikel ook zegt, het is een hele krachtige functie, dus het kan ook heel handig zijn. Maar het is een terechte vraag of er uberhaupt (nog) een use-case bestaat waar de eval echt nodig is.
Hoe verhoud dit zich toch eventuele add-ons, plug-ins (adblockers) ?
Add-ons is bij mozilla de verzamelnaam van themes, extensions en plugins.

Extensions hebben geen toegang tot about: pagina's. Themes zijn beperkt tot wat onschadelijke CSS. NPAPI plugins zijn native code, en hebben wel toegang, maar Mozilla maakt het installeren daarvan bewust heel lastig.
Dankjewel!
Sorry voor late reactie,, ik reageer alleen op werk en ik was vrij.
Beetje offtopic maar hoe krijg je die achtergrond zo zwart? Ik heb al naar waardes gezocht met de woorden background en color. o.a. browser.display.background_color naar #000000 en reader.color_scheme naar dark geprobeerd. geen effect.
Hamburgermenu, Customize, Themes, Dark. Je kunt ook dit thema: https://addons.mozilla.or...addon/argon-experimental/ gebruiken, dan opent er ook een donker nieuwe tabpagina. Ik gebruik op Peppermint het Arc dark theme, dan opent about:config ook met een donker thema.
Ja met het standaard dark theme worden ui elementen donker maar niet de achtergrond van de about paginas en het laadscherm van de browser.

Hulde hieronder: "browser.in-content.dark-mode;true" <<- Dit was de sleutel die ik zocht.

[Reactie gewijzigd door Mushroomician op 14 oktober 2019 21:51]

Firefox kijkt naar de OS settings, zet windows/macos op dark/night mode en firefox doet mee en zet ook de about pages op dark.
Ok:
- In Firefox de Dark Theme aanzetten
- In about:config:
  • browser.in-content.dark-mode;true
- Firefox herstarten.
- In Windows Settings -> Personalization -> Colors
  • Choose your default apps mode: Dark.
Offtopic inderdaad, maar 't zou Tweakers niet zijn als we hier niet lekker konden tweaken. Hier volgt hoe je een echte dark Fireofx experience kunt krijgen, zonder daar addons te voor hoeven downloaden of veel perfomance te verliezen.

With Firefox 68 is now possible to just change some settings to natively have a full dark interface.

Keep in mind the about pages are not finished yet, so few bugs still are visible here and there.
1. Enable dark theme:

Click on the burger menu ☰ and then Customize.
On the bottom of the page, click Theme and then select Dark

2. Enable dark interface for about pages:

Type about:config and accept the risk.
Find browser.in-content.dark-mode and set it to true

3. Make websites think your OS is in dark mode
The website will use the CSS they specially made for users that like it (ex: bugzilla.mozilla.org).

Type about:config
Right click somewhere and select New > Integer
Type ui.systemUsesDarkTheme and put the value 1.

4. Restart Firefox

5. Preventing about:blank from flashing white:
It's not a simple setting. You have to edit the Firefox interface CSS. Read how to make it work in Firefox 69.

You have to add something like this to userContent.css:

@-moz-document url-prefix(about:blank) {
html > body:empty {
background-color: #2a2a2e!important;
}
}

Opgehaald van: https://www.reddit.com/r/...ate_firefox_68_stable_no/.

Wat stom btw dat je geen code snippets kunt toevoegen aan comments op Tweakers. Om userContent aan de praat te krijgen in de nieuwere versies van Firefox moet je trouwens het volgende doen:

Set toolkit.legacyUserProfileCustomizations.stylesheets to true in about:config.

Opgehaald van: https://www.reddit.com/r/...ll_have_to_set_a_pref_to/

Een userContent.css-bestand kun je aanmaken in de profielmap:
Ga about:support en open vanuit daar de profielmap. In die map maak je een map aan met de naam 'chrome' en daarin een bestand met de naam 'userContent.css'. Daar zet je de bovenstaande css (uit stap 5) in.
about:mozilla mijn favoriet
Niet bekend met about:robots? }>
Dan krijg je dit: The Beast adopted new raiment and studied the ways of Time and Space and Light and the Flow of energy through the Universe. From its studies, the Beast fashioned new structures from oxidised metal and proclaimed their glories. And the Beast’s followers rejoiced, finding renewed purpose in these teachings.

from The Book of Mozilla, 11:14

[Reactie gewijzigd door desalniettemin op 14 oktober 2019 16:06]

Op dit item kan niet meer gereageerd worden.

Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee