icon_firefox[CVE-2017-7770] Addressbar spoofing with JavaScript events and fullscreen mode on Firefox for Android


https://www.mozilla.org/en-US/security/advisories/mfsa2017-15/#CVE-2017-7770

Addressbar spoofing with JavaScript events and fullscreen mode


Announced: June 13, 2017
Reporter: Jordi Chancel
Impact: Moderate
Products: Firefox
Fixed in: Firefox 54


  • Description :

Security researcher Jordi Chancel reported a mechanism where when a new tab is loaded through JavaScript events, if fullscreen mode is then entered, the addressbar will not be rendered.
This would allow a malicious site to displayed a spoofed addressbar, showing the location of an arbitrary website instead of the one loaded.

Note: this issue only affects Firefox for Android. Desktop Firefox is unaffected.


Vulnerability demonstration (video):


(Les détails de cette vulnérabilité concernant son exploitation et sa correction seront bientôt disponibles. Veuillez revenir d’ici quelques jours.)


icon_firefox[CVE-2017-5451] Addressbar spoofing with onblur event


Addressbar spoofing with onblur event

https://www.mozilla.org/en-US/security/advisories/mfsa2017-10/#CVE-2017-5451


Announced: April 19, 2017
Reporter: Jordi Chancel
Impact: Moderate
Products: Firefox
Fixed in: Firefox 53


  • Description :

Security researcher Jordi Chancel reported a mechanism to spoof the addressbar through the user interaction on the addressbar and the onblur event. The event could be used by script to affect text display to make the loaded site appear to be different from the one actually loaded within the addressbar.


  • Explication :

1. Le fait de cliquer sur la barre d’adresse de Mozilla Firefox permet la sélection instantanée de l’adresse URL contenue dans celle-ci.

2. Lors d’un test utilisant cette interaction utilisateur, il apparait que si le clique dans la barre d’adresse est effectué en coordination avec l’événement onblur dont celui-ci détermine qu’en cas de clique extérieur a la page Web celui-ci augmentera la taille de l’adresse URL, cette action va alors permettre la disparition de la visibilité du nom de domaine correspondant à la page web qui devrait normalement toujours se trouver visible au début de la barre d’adresse et va au contraire être placer de telle façon à ce que la fin de l’adresse URL va se trouver visible et prendre la place de la réelle adresse URL de la page Web contenant la Preuve de Concept (menant ainsi au Spoofing d’adresse URL et d’indicateur SSL désiré).

  • Exemple :
1. https://yyy.com/poc.html (Type d’adresse URL avant le clique dans la Barre d’Adresse de Firefox)

2. Clique de l’utilisateur dans la Barre d’Adresse de Firefox

3. https://yyy.com/poc.html######https://www.google.com (Nouveau Schéma de l’adresse URL après le clique dans la Barre d’Adresse de Firefox)

4. https://www.google.com (Adresse URL falsifiée désormais visible dans la Barre d’Adresse de Firefox)

  • Concept en Image :





Démonstration vidéo de la vulnérabilité:


icon_firefox[CVE-2017-5452] Addressbar spoofing during scrolling with editable content on Firefox for Android


Addressbar spoofing during scrolling with editable content on Firefox for Android

https://www.mozilla.org/en-US/security/advisories/mfsa2017-10/#CVE-2017-5452


Announced: April 19, 2017
Reporter: Jordi Chancel
Impact: Low
Products: Firefox
Fixed in: Firefox 53


  • Description :

Malicious sites can display a spoofed addressbar on a page when the existing location bar on the new page is scrolled out of view if an HTML editable page element is user selected.


Note: This attack only affects Firefox for Android. Other operating systems are not affected.


Vulnerability demonstration (video):


[CVE-2017-5041] Google Chrome Location Bar URL & SSL Spoofing in Omnibox


Address spoofing in Omnibox (URL & SSL Spoofing)


Announced: March 9, 2017
Reporter: Jordi Chancel
Impact: Moderate
Products: Google Chrome
Fixed in: Google Chrome 57.0.2987.98


  • Description :

Google Chrome before 57.0.2987.98 does not properly handle ********, which allows remote attackers to spoof the Location Bar (URL and SSL indicator) via unspecified vectors.


Note: This issue also affects Google Chrome for iOS.


Vulnerability demonstration (video):


icon_firefox[CVE-2017-5394] Android location bar spoofing using fullscreen and JavaScript events


Android location bar spoofing using fullscreen and JavaScript events


Announced: January 24, 2017
Reporter: Jordi Chancel
Impact: Moderate
Products: Firefox
Fixed in: Firefox 51


  • Description :

A location bar spoofing attack where the location bar of loaded page will be shown over the content of another tab due to a series of JavaScript events combined with fullscreen mode.


Note: This issue only affects Firefox for Android. Other operating systems are not affected.


Vulnerability demonstration (video):


icon_firefox[CVE-2017-5395] Android location bar spoofing during scrolling


Android location bar spoofing during scrolling


Announced: January 24, 2017
Reporter: Jordi Chancel
Impact: Low
Products: Firefox
Fixed in: Firefox 51


  • Description :

Malicious sites can display a spoofed location bar on a subsequently loaded page when the existing location bar on the new page is scrolled out of view if navigations between pages can be timed correctly.


Note: This issue only affects Firefox for Android. Other operating systems are not affected.


Vulnerability demonstration (video):


icon_firefox[CVE-2016-5298] SSL indicator can mislead the user about the real URL visited


SSL indicator can mislead the user about the real URL visited


Announced: November 15, 2016
Reporter: Jordi Chancel
Impact: Moderate
Products: Firefox
Fixed in: Firefox 50


  • Description :

Security researcher Jordi Chancel reported a mechanism where disruption of the loading of a new web page can cause the previous page’s favicon and SSL indicator to not be reset when the new page is loaded.


Note: this issue only affects Firefox for Android. Desktop Firefox is unaffected.


Vulnerability demonstration (video):


icon_firefox[CVE-2016-2822] Addressbar spoofing though the SELECT element


Addressbar spoofing though the SELECT element


Announced: June 7, 2016
Reporter: Jordi Chancel
Impact: Moderate
Products: Firefox, Firefox ESR
Fixed in: Firefox 47, Firefox ESR 45.2

  • Description :

Security researcher Jordi Chancel reported a method to spoof the contents of the addressbar. This uses a persistent menu within a <select> element, which acts as a container for HTML content and can be placed in an arbitrary location.
When placed over the addressbar, this can mask the true site URL, allowing for spoofing by a malicious site.


  • Introduction :

Voici encore une vulnérabilité mélangeant ClickJacking et Location Bar Spoofing.
Dans mes recherches visant a vérifier la correction exhaustive d’une plus ancienne vulnérabilité que j’avais reportée sur le navigateur Web Mozilla Firefox (MFSA-2013-94), j’ai premièrement vérifié si cette vulnérabilité n’avait pas été malencontreusement réactivée, j’ai alors donc déterminé que le code source de la précédente preuve de concept ne permettait plus l’exploitation désiré qui avait donnée lieu cette précédente vulnérabilité, cependant la modification de l’élément <select> de l’encienne preuve de concept permettait une vulnérabilité tout à fait similaire.
Les modifications nécessaires à la mise en œuvre d’une nouvelle preuve de concept étaient d’utiliser plusieurs éléments <option> et d’y insérer l’image d’un indicateur de connexion sécurisé et l’URL d’un site ciblé permettant ainsi le Spoofing d’URL et d’indicateur SSL.

Cette nouvelle vulnérabilité tout comme la précédente sitée ci-dessus permet également de mener a bien des attaques de type ClickJacking sur l’affichage de multiple boites de dialogue, exemple: GeoLocation ; WebRTC (…) , permettant ainsi le vole de donnée concernant la géolocalisation de la personne piégée , prendre le contrôle de la webcam et du microphone de la personne piégée (et bien d’autres actions malveillantes) en incitant l’utilisateur a éffectuer un double-clique sur un bouton factice placé dans l’un des éléments <option> situé dans la même zone que le bouton de validation de la boite de dialogue q’un pirate informatique souhaiterait que l’utilisateur préalablement piégé par l’attaque d’usurpation d’URL et d’indicateur de certificat sécurisé presse sans s’en rendre compte (via le double-clique devant être effectué).

  • Explication :

1. Dans Mozilla Firefox, l’élément <select> peut contenir du code HTML et par conséquent contenir une image. il suffit donc de mettre en place l’image d’une fausse barre de location dans cet élément et définir que l’affichage de celui-ci se placera au dessus de la barre de location réelle.

concept en image :

 

2. Maintenant, voici quelques brèves explications supplémentaires portant sur la possibilité d’effectuer des attaques de type ClickJacking.
Comme démontré ci-dessus, l’élément <select> surplombe la réelle barre de location, il est donc aussi possible de couvrir l’affichage d’une demande d’activation de la webcam et du microphone ou encore la demande de géolocalisation et donc faire en sorte que celles-ci s’affiche de manière totalement invisible. Il ne reste plus qu’a inciter l’utilisateur a double cliquer sur l’élément <select> a l’emplacement ou se trouve le bouton de confirmation de la boite de dialogue caché. Pour être unpeu plus précis, le premier clique aura pour effet d’enlever l’affichage de l’élément <select> et par la suite cliquer sur le bouton de confirmation via le 2ème clique.

Concept en image :


Vulnerability demonstration (video):


icon_firefox[CVE-2016-1967] Same-origin policy violation using perfomance.getEntries and history navigation with session restore


Same-origin policy violation using perfomance.getEntries and history navigation with session restore


Announced: March 8, 2016
Reporter: Jordi Chancel
Impact: High
Products: Firefox
Fixed in: Firefox 45


Description

Security researcher Jordi Chancel discovered a variant of Mozilla Foundation Security Advisory 2015-136 which was fixed in Firefox 43. In the original bug, it was possible to read cross-origin URLs following a redirect if perfomance.getEntries() was used along with an iframe to host a page. Navigating back in history through script, content was pulled from the browser cache for the redirected location instead of going to the original location.

In the newly reported variant issue, it was found that if a browser session was restored, history navigation would still allow for the same attack as content was restored from the browser cache. This is a same-origin policy violation and could allow for data theft.


Le Patch utilisé pour la précédente vulnérabilité MFSA 2015-136 (découverte par le chercheur en sécurité informatique portant le pseudonyme cgvwzq) avait ajouté des vérifications de sécurité permettant de neutraliser la violation des restrictions Same-Origin Policy par une analyse de sécurité ayant pour objectif la vérification de l’origine exacte de l’URL contenu dans la balise <iframe> qui utilise une redirection ciblant un nom de domaine différent que celle de l’adresse URL utilisée dans l’attribut « src= » contenu dans la balise <iframe> permettant cette redirection et de celle de la page Web contenant la Preuve de Concept.

  • Exemple concernant les différentes adresses URL utilisées :

1. Nom de Domaine contenant la page Web de la Preuve de Concept :
http://www.Malicious-Website.com/

2. Adresse URL ciblé par la redirection utilisant un Nom de Domaine différent :
http://www.cible.com/token.php

3. Adresse URL de redirection utilisée dans l’attribut « src= » de la balise <iframe> :
http://www.Malicious-Website.com/redir.php?url=http://www.cible.com/token.php

4. Adresse URL ciblé par la redirection générant un token de manière automatique :
http://www.cible.com/token.php?secret=90c16200e6c708c415f450c12a2995ae

Codes Modifiés Pour la correction de la vulnérabilité MFSA 2015-136:

« /docshell/base/nsDocShell.cpp »
« /docshell/base/nsDocShell.h »
« /docshell/base/nsDocShellLoadInfo.cpp »
« /docshell/base/nsDocShellLoadInfo.h »
« /docshell/base/nsIDocShell.idl »
« /docshell/base/nsIDocShellLoadInfo.idl »
« /docshell/shistory/nsISHEntry.idl »
« /docshell/shistory/nsSHEntry.cpp »
« /docshell/shistory/nsSHEntry.h »
« /docshell/shistory/nsSHistory.cpp »

Cependant en cas de fermeture de la page contenant la preuve de concept et de réouverture de celle-ci via le Menu Historique et l’option de réouverture d’onglets précédemment fermés ou via le redémarrage de Firefox en cas de crash et la réouverture de la précédente session permettant aussi la réouverture de l’onglet contenant la preuve de concept, les codes suivants utilisés par l’action de restauration de session et d’onglets précédemment fermés:

« /browser/components/sessionstore/SessionHistory.jsm »
« /mobile/android/components/SessionStore.js »

ne permettaient pas les vérifications de sécurité nécessaires pour neutraliser la violation des restrictions Same-Origin Policy mises en place dans le Patch de la vulnérabilité MFSA-2015-136. Ainsi dans le Patch corrigeant la vulnérabilité Mozilla Foundation Security Advisory 2016-29 découverte lors de mes recherches en vulnérabilité sur Mozilla Firefox (code du Patch visible ci-dessous), d’autre contrôles de sécurité ont été ajoutés dans le but de vérifier de l’origine exacte de l’URL contenu dans la balise <iframe> en cas de restauration d’une précédente session et de restauration d’onglets précédemment fermés.
(les codes de sécurité ajoutés permettant de neutraliser la violation des restrictions Same-Origin Policy en cas de restauration de session et d’onglets précédemment fermés sont surlignés en vert)


--- a/browser/components/sessionstore/SessionHistory.jsm
+++ b/browser/components/sessionstore/SessionHistory.jsm
@@ -137,16 +137,20 @@ var SessionHistoryInternal = {

// We will include the property only if it's truthy to save a couple of
// bytes when the resulting object is stringified and saved to disk.
if (shEntry.referrerURI) {
entry.referrer = shEntry.referrerURI.spec;
entry.referrerPolicy = shEntry.referrerPolicy;
}


+ if (shEntry.originalURI) {
+ entry.originalURI = shEntry.originalURI.spec;
+ }
+

if (shEntry.srcdocData)
entry.srcdocData = shEntry.srcdocData;

if (shEntry.isSrcdocEntry)
entry.isSrcdocEntry = shEntry.isSrcdocEntry;

if (shEntry.baseURI)
entry.baseURI = shEntry.baseURI.spec;
@@ -297,16 +301,19 @@ var SessionHistoryInternal = {
shEntry.setIsSubFrame(entry.subframe || false);
shEntry.loadType = Ci.nsIDocShellLoadInfo.loadHistory;
if (entry.contentType)
shEntry.contentType = entry.contentType;
if (entry.referrer) {
shEntry.referrerURI = Utils.makeURI(entry.referrer);
shEntry.referrerPolicy = entry.referrerPolicy;
}

+ if (entry.originalURI) {
+ shEntry.originalURI = Utils.makeURI(entry.originalURI);
+ }

if (entry.isSrcdocEntry)
shEntry.srcdocData = entry.srcdocData;
if (entry.baseURI)
shEntry.baseURI = Utils.makeURI(entry.baseURI);

if (entry.cacheKey) {
var cacheKey = Cc["@mozilla.org/supports-PRUint32;1"].
createInstance(Ci.nsISupportsPRUint32);


--- a/mobile/android/components/SessionStore.js
+++ b/mobile/android/components/SessionStore.js
@@ -747,16 +747,20 @@ SessionStore.prototype = {

entry.ID = aEntry.ID;
entry.docshellID = aEntry.docshellID;

if (aEntry.referrerURI) {
entry.referrer = aEntry.referrerURI.spec;
}

+ if (aEntry.originalURI) {
+ entry.originalURI = aEntry.originalURI.spec;
+ }
+

if (aEntry.contentType) {
entry.contentType = aEntry.contentType;
}

let x = {}, y = {};
aEntry.getScrollPosition(x, y);
if (x.value != 0 || y.value != 0) {
entry.scroll = x.value + "," + y.value;
@@ -827,16 +831,20 @@ SessionStore.prototype = {
shEntry.loadType = Ci.nsIDocShellLoadInfo.loadHistory;
if (aEntry.contentType) {
shEntry.contentType = aEntry.contentType;
}
if (aEntry.referrer) {
shEntry.referrerURI = Services.io.newURI(aEntry.referrer, null, null);
}

+ if (aEntry.originalURI) {
+ shEntry.originalURI = Services.io.newURI(aEntry.originalURI, null, null);
+ }
+

if (aEntry.cacheKey) {
let cacheKey = Cc["@mozilla.org/supports-PRUint32;1"].createInstance(Ci.nsISupportsPRUint32);
cacheKey.data = aEntry.cacheKey;
shEntry.cacheKey = cacheKey;
}

if (aEntry.ID) {
// get a new unique ID for this frame (since the one from the last


Vulnerability demonstration (video):


icon_firefox[CVE-2016-1941] Delay following click events in file download dialog too short on OS X


Delay following click events in file download dialog too short on OS X


Announced: January 26, 2016
Reporter: Jordi Chancel
Impact: Moderate
Products: Firefox
Fixed in: Firefox 44


Description

Security researcher Jordi Chancel reported an issue on OS X where the delay between the download dialog getting focus and the button getting enabled was too short. If an attacker is able to induce the user to double-click in a specific location, they can then pass the second click through to the dialog below, leading to unintentional actions such as the running of downloaded software.


  • Introduction :

Cette nouvelle vulnérabilité de type ClickJacking est une variante d’une vulnérabilité préalablement reportée par moi-même et ayant été corrigée par la version 27 de Firefox qui avait été mise en avant dans leur avis de sécurité MFSA-2014-03 et dans le CVE-2014-1480.
Cette précédente vulnérabilité permettait également d’effectuer des attaques de type ClickJacking sur la boite de dialogue de téléchargement autorisant l’exécution d’un fichier directement après que celui-ci soit téléchargé.

L’impact et l’interaction utilisateur finale de cette 2ème vulnérabilité MFSA-2016-08 (corrigée dans la version 44 de Firefox) permettant l’exécution du fichier malveillant sont exactement similaires à la précédente vulnérabilité MFSA-2014-03 (corrigée dans la version 27 de Firefox).

  • Concept en image :

1.
Images démontrant la superposition entre le bouton « DoubleClickMe » contenu dans la fenêtre cachant la boite de téléchargement et le bouton utilisé par la boite de téléchargement permettant l’exécution du fichier malveillant



  • Exploitation et correction de MFSA-2014-03

1. Exploitation

L’exploitation de la vulnérabilité MFSA-2014-03 utilisait un défaut de sécurité autorisant un clique direct sur le bouton de la boite de téléchargement activant l’exécution automatique du fichier malveillant après que celui-ci soit téléchargé.
L’exploitation de MFSA-2016-08 utilise une faille de sécurité que le Patch de MFSA-2014-03 n’avait pas corrigé.

2. Correction

Le Patch correctif de la vulnérabilité MFSA-2014-03 ajoutait un temps de sécurité qui ne permettait plus à l’utilisateur de cliquer directement sur le bouton activant le téléchargement et l’exécution du fichier téléchargé avant que ce laps de temps puisse autoriser l’utilisateur à effectuer cette interaction.
(ce qui par conséquent corrigeait la 1ère vulnérabilité MFSA-2014-03 du fait que le clique sur le bouton désiré ne soit plus directement possible sans attendre que le laps de temps de sécurité débloque l’utilisation de ce bouton, de sorte que l’utilisateur décide lui-même ou non de cliquer sur le bouton de téléchargement et lui permette également de se rendre compte de l’ouverture de la boite de téléchargement sans que celui-ci puisse activer le téléchargement d’une façon non désirée).

  • Exploitation et correction de MFSA-2016-08

1. Exploitation (Ceci est une ébauche et sera révisée rapidement pour une meilleur compréhension et explication de l’exploitation concernée dans cette partie de l’article)

L’exploitation de MFSA-2016-08 utilise une défaut de sécurité qui n’avait pas été prévu dans l’activation du délais de sécurité mise en place dans le Patch de MFSA-2014-03. En effet, le Patch de la vulnérabilité MFSA-2014-03 définissait aussi que ce délais de sécurité soit mise en attente dans le cas ou la Boîte de Dialogue de Téléchargement (menant à l’exécution du fichier téléchargé) ne soit plus sélectionné au premier plan et que ce délais de sécurité ne puisse être réactivé uniquement dans le cas où la Boîte de Dialogue permettant l’exécution du fichier téléchargé ne soit à nouveau sélectionné au premier plan.
Cependant, dans un cas bien précis, la réactivation de ce délais de sécurité n’est pas effectué lorsque la Boîte de Dialogue de téléchargement est à nouveau remise au premier plan.
En effet ce délais de sécurité ne pouvait pas être réactivé dans le cas ou un élément (fenêtre de Firefox ou autre) surplombait la Boîte de Dialogue de téléchargement et que cette élément utilisait la fonction JavaScript « window.close(); » déclenchant ainsi l’événement « onUnload(); », ce qui avait comme conséquence de Bypasser le délais de sécurité précédemment mise en place dans le Patch de MFSA-2014-03 et donc de permettre à l’utilisateur d’activer de façon non désirée le téléchargement et l’exécution du fichier téléchargé après que le deuxième clique du « Double-Clique » nécessaire à l’exploitation de cette vulnérabilité puisse autoriser un clique sur le bouton de téléchargement
(qui était normalement soumis au délais de sécurité mais dont la mise en route ne pouvait s’effectuer du fait que l’événement JavaScript « onUnload(); » passait outre la sécurité mise en place dans le Patch de la vulnérabilité MFSA-2014-03).




2. Correction

(Le reste de l’article est en cours d’écriture et sera très bientôt disponible dans sa totalité. Veuillez revenir d’ici peu.)

Dans le Patch correctif de la vulnérabilité MFSA-2016-08 plusieurs codes ont été supprimés et d’autres ont été remplacés dans les librairies liés à la boite de dialogue de téléchargent et à l’activation/mise en attente/réactivation du délais de sécurité du bouton permettant le téléchargement et l’exécution du fichier malveillant de cette boite de dialogue

(a) Librairies de Firefox sur lesquelles des suppression de code on été appliqués sur le Patch correctif de la vulnérabilité MFSA-2016-08

Codes Supprimés, Ajoutés et Modifiés dans les librairies corrigeant la vulnérabilité MFSA-2016-08:


Lines 14-30 +++b/toolkit/mozapps/downloads/content/unknownContentType.xul
14 %uctDTD;
15 <!ENTITY % scDTD SYSTEM "chrome://mozapps/locale/downloads/settingsChange.dtd" >
16 %scDTD;
17 ]>
18
19 <dialog id="unknownContentType"
20 xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
21 onload="dialog.initDialog();" onunload="if (dialog) dialog.onCancel();"
22 onblur="if (dialog) dialog.onBlur(event);" onfocus="dialog.onFocus(event);"
23 #ifdef XP_WIN
24 style="width: 36em;"
25 #else
26 style="width: 34em;"
27 #endif
28 screenX="" screenY=""
29 persist="screenX screenY"
30 aria-describedby="intro location whichIs type from source unknownPrompt"

Lines 3-18 +++b/toolkit/mozapps/downloads/nsHelperAppDlg.js
3 /*
4 # This Source Code Form is subject to the terms of the Mozilla Public
5 # License, v. 2.0. If a copy of the MPL was not distributed with this
6 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
7 */
8
9 const {utils: Cu, interfaces: Ci, classes: Cc, results: Cr} = Components;
10 Cu.import("resource://gre/modules/Services.jsm");
11 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
12 XPCOMUtils.defineLazyModuleGetter(this, "EnableDelayHelper",
13 "resource://gre/modules/SharedPromptUtils.jsm");
14
15 ///////////////////////////////////////////////////////////////////////////////
16 //// Helper Functions
17
18 /**
19 * Determines if a given directory is able to be used to download to.
20 *
21 * @param aDirectory

Lines 534-568 nsUnknownContentTypeDialog.prototype = {
537 var openHandler = this.dialogElement("openHandler");
538 openHandler.parentNode.removeChild(openHandler);
539 var openHandlerBox = this.dialogElement("openHandlerBox");
540 openHandlerBox.appendChild(openHandler);
541 }
542
543 this.mDialog.setTimeout("dialog.postShowCallback()", 0);
544
545 this.delayHelper = new EnableDelayHelper({
546 disableDialog: () => {
547 this.mDialog.document.documentElement.getButton("accept").disabled = true;
548 },
549 enableDialog: () => {
550 this.mDialog.document.documentElement.getButton("accept").disabled = false;
551 },
552 focusTarget: this.mDialog
553 });
554 },
555
556 notify: function (aTimer) {
557 if (aTimer == this._showTimer) {
558 if (!this.mDialog) {
559 this.reallyShow();
* } else {
* // The user may have already canceled the dialog.
* try {
* if (!this._blurred) {
* this.mDialog.document.documentElement.getButton("accept").disabled = false;
* }
* } catch (ex) {}
* this._delayExpired = true;
560 }
561 // The timer won't release us, so we have to release it.
562 this._showTimer = null;
563 }
564 else if (aTimer == this._saveToDiskTimer) {
565 // Since saveToDisk may open a file picker and therefore block this routine,
566 // we should only call it once the dialog is closed.
567 this.mLauncher.saveToDisk(null, false);


Lines 636-666 nsUnknownContentTypeDialog.prototype = {
635 .getFormattedString("orderedFileSizeWithType",
636 [typeString, size, unit]);
637 }
638 else {
639 type.value = typeString;
640 }
641 },
642
* _blurred: false,
* _delayExpired: false,
* onBlur: function(aEvent) {
* this._blurred = true;
* this.mDialog.document.documentElement.getButton("accept").disabled = true;
* },
* onFocus: function(aEvent) {
* this._blurred = false;
* if (this._delayExpired) {
* var script = "document.documentElement.getButton('accept').disabled = false";
* this.mDialog.setTimeout(script, 250);
* }
* },
*
643 // Returns true if opening the default application makes sense.
644 openWithDefaultOK: function() {
645 // The checking is different on Windows...
646 #ifdef XP_WIN
647 // Windows presents some special cases.
648 // We need to prevent use of "system default" when the file is
649 // executable (so the user doesn't launch nasty programs downloaded
650 // from the web), and, enable use of "system default" if it isn't

+++b/toolkit/components/prompts/src/CommonDialog.jsm (-45 / +8 lines)
5 this.EXPORTED_SYMBOLS = ["CommonDialog"];
6
7 const Ci = Components.interfaces;
8 const Cr = Components.results;
9 const Cc = Components.classes;
10 const Cu = Components.utils;
11
12 Cu.import("resource://gre/modules/Services.jsm");
13 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
14 XPCOMUtils.defineLazyModuleGetter(this, "EnableDelayHelper",
15 "resource://gre/modules/SharedPromptUtils.jsm");
16
17
18 this.CommonDialog = function CommonDialog(args, ui) {
19 this.args = args;
20 this.ui = ui;
21 }
22
23 CommonDialog.prototype = {

CommonDialog.prototype = {
159 xulDialog.defaultButton = ['accept', 'cancel', 'extra1', 'extra2'][b];
160 else
161 button.setAttribute("default", "true");
162
163 // Set default focus / selection.
164 this.setDefaultFocus(true);
165
166 if (this.args.enableDelay) {
167 this.delayHelper = new EnableDelayHelper({
168 disableDialog: () => this.setButtonsEnabledState(false),
169 enableDialog: () => this.setButtonsEnabledState(true),
170 focusTarget: this.ui.focusTarget
171 });
172 }
173
174 // Play a sound (unless we're tab-modal -- don't want those to feel like OS prompts).
175 try {
176 if (xulDialog && this.soundID) {
177 Cc["@mozilla.org/sound;1"].
178 createInstance(Ci.nsISound).
179 playEventSound(this.soundID);

CommonDialog.prototype = {
225
226 setButtonsEnabledState : function(enabled) {
227 this.ui.button0.disabled = !enabled;
228 // button1 (cancel) remains enabled.
229 this.ui.button2.disabled = !enabled;
230 this.ui.button3.disabled = !enabled;
231 },
232
* onBlur : function (aEvent) {
* if (aEvent.target != this.ui.focusTarget)
* return;
* this.setButtonsEnabledState(false);
*
* // If we blur while waiting to enable the buttons, just cancel the
* // timer to ensure the delay doesn't fire while not focused.
* if (this.focusTimer) {
* this.focusTimer.cancel();
* this.focusTimer = null;
* }
* },
*
* onFocus : function (aEvent) {
* if (aEvent.target != this.ui.focusTarget)
* return;
* this.startOnFocusDelay();
* },
*
* startOnFocusDelay : function(delayTime) {
* // Shouldn't already have a timer, but just in case...
* if (this.focusTimer)
* return;
* // If no delay specified, use 250ms. (This is the normal case for when
* // after the dialog has been opened and focus shifts.)
* if (!delayTime)
* delayTime = 250;
* let self = this;
* this.focusTimer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
* this.focusTimer.initWithCallback(function() { self.onFocusTimeout(); },
* delayTime, Ci.nsITimer.TYPE_ONE_SHOT);
* },
*
* onFocusTimeout : function() {
* this.focusTimer = null;
* this.setButtonsEnabledState(true);
* },
*
271 setDefaultFocus : function(isInitialLoad) {
272 let b = (this.args.defaultButtonNum || 0);
273 let button = this.ui["button" + b];
274
275 if (!this.hasInputField) {
276 let isOSX = ("nsILocalFileMac" in Components.interfaces);
277 if (isOSX)
278 this.ui.infoBody.focus();

+++b/toolkit/components/prompts/src/SharedPromptUtils.jsm
1 this.EXPORTED_SYMBOLS = [ "PromptUtils", "EnableDelayHelper" ];
2
3 const Cc = Components.classes;
4 const Ci = Components.interfaces;
5 const Cr = Components.results;
6 const Cu = Components.utils;
7
8 Cu.import("resource://gre/modules/Services.jsm");
9
10 this.PromptUtils = {
11 // Fire a dialog open/close event. Used by tabbrowser to focus the
12 // tab which is triggering a prompt.
13 // For remote dialogs, we pass in a different DOM window and a separate
14 // target. If the caller doesn't pass in the target, then we'll simply use
15 // the passed-in DOM window.
16 fireDialogEvent : function (domWin, eventName, maybeTarget) {
17 let target = maybeTarget || domWin;

this.PromptUtils = {
37 // Here we iterate over the object's original properties, not the bag
38 // (ie, the prompt can't return more/different properties than were
39 // passed in). This just helps ensure that the caller provides default
40 // values, lest the prompt forget to set them.
41 for (let propName in obj)
42 obj[propName] = propBag.getProperty(propName);
43 },
44 };
45
46 /**
47 * This helper handles the enabling/disabling of dialogs that might
48 * be subject to fast-clicking attacks. It handles the initial delayed
49 * enabling of the dialog, as well as disabling it on blur and reapplying
50 * the delay when the dialog regains focus.
51 *
52 * @param enableDialog A custom function to be called when the dialog
53 * is to be enabled.
54 * @param diableDialog A custom function to be called when the dialog
55 * is to be disabled.
56 * @param focusTarget The element used to watch focus/blur events.
57 */
58 this.EnableDelayHelper = function({enableDialog, disableDialog, focusTarget}) {
59 this.enableDialog = makeSafe(enableDialog);
60 this.disableDialog = makeSafe(disableDialog);
61 this.focusTarget = focusTarget;
62
63 this.disableDialog();;
64
65 this.focusTarget.addEventListener("blur", this, false);
66 this.focusTarget.addEventListener("focus", this, false);
67 this.focusTarget.ownerDocument.addEventListener("unload", this, false);
68
69 this.startOnFocusDelay();
70 };
71
72 this.EnableDelayHelper.prototype = {
73 get delayTime() {
74 return Services.prefs.getIntPref("security.dialog_enable_delay");
75 },
76
77 handleEvent : function(event) {
78 if (event.target != this.focusTarget &&
79 event.target != this.focusTarget.ownerDocument)
80 return;
81
82 switch (event.type) {
83 case "blur":
84 this.onBlur();
85 break;
86
87 case "focus":
88 this.onFocus();
89 break;
90
91 case "unload":
92 this.onUnload();
93 break;
94 }
95 },
96
97 onBlur : function () {
98 this.disableDialog();
99 // If we blur while waiting to enable the buttons, just cancel the
100 // timer to ensure the delay doesn't fire while not focused.
101 if (this._focusTimer) {
102 this._focusTimer.cancel();
103 this._focusTimer = null;
104 }
105 },
106
107 onFocus : function () {
108 this.startOnFocusDelay();
109 },
110
111 onUnload: function() {
112 this.focusTarget.removeEventListener("blur", this, false);
113 this.focusTarget.removeEventListener("focus", this, false);
114 this.focusTarget.ownerDocument.removeEventListener("unload", this, false);
115
116 if (this._focusTimer) {
117 this._focusTimer.cancel();
118 this._focusTimer = null;
119 }
120
121 this.focusTarget = this.enableDialog = this.disableDialog = null;
122 },
123
124 startOnFocusDelay : function() {
125 if (this._focusTimer)
126 return;
127
128 this._focusTimer = Cc["@mozilla.org/timer;1"]
129 .createInstance(Ci.nsITimer);
130 this._focusTimer.initWithCallback(
131 () => { this.onFocusTimeout(); },
132 this.delayTime,
133 Ci.nsITimer.TYPE_ONE_SHOT
134 );
135 },
136
137 onFocusTimeout : function() {
138 this._focusTimer = null;
139 this.enableDialog();
140 },
141 };
142
143 function makeSafe(fn) {
144 return function () {
145 // The dialog could be gone by now (if the user closed it),
146 // which makes it likely that the given fn might throw.
147 try {
148 fn();
149 } catch (e) { }
150 };
151 }




Vulnerability demonstration (video):


icon_firefox[CVE-2016-1943] Location Bar Spoofing Risk – scrollto leads to that the location bar is hidden


Location Bar Spoofing Risk – scrollto leads to that the location bar is hidden


Announced: January 26, 2016
Reporter: Jordi Chancel
Impact: High
Products: Firefox
Fixed in: Firefox 44


Description

Security researcher Jordi Chancel reported two issues involving addressbar spoofing.

The first of these is a « high » rated security issue on on Firefox for Android involving the scrollTo() method to scroll a page. In this attack, scrollTo() is used to scroll the addressbar out of view while replacing it with a fake addressbar created by the attacker when a new tab is opened.


  • Exploitation de la vulnérabilité :
1. Cette vulnérabilité permettant le Spoofing d’Adresse URL et d’indicateur SSL sur Firefox pour Android (avec la mise en place d’une fausse Barre de d’Adresse), utilise dans un premier temps la visite d’une page web contenant un lien hypertexte menant à une 2ème page web contrôlée par l’attaquant exploitant le Spoofing.

2. L’ouverture de la 2ème page web exploitant la vulnérabilité menant au Spoofing via le lien hypertexte doit être effectuée dans un nouvel onglet.

3. L’utilisateur doit alors choisir l’option permettant de basculer vers le nouvel onglet contenant la 2ème page web contrôlée par l’attaquant exploitant la vulnérabilité.

4. Une fois que l’utilisateur se trouve dans ce nouvel onglet, une Barre d’Adresse falsifiée est alors visible (prenant la place de la réelle Barre d’Adresse utilisée sur Firefox pour Android) rendant possible l’exploitation du Spoofing d’URL et d’indicateur SSL.


  • Explication et Schéma de Démonstration :
L’exploitation de ce Spoofing est rendu possible via un faille de sécurité utilisant la fonction JavaScript ScrollTo(**,**); qui permettait la disparition de la réelle Barre d’Adresse utilisée sur Firefox pour Android en cas d’exécution de cette fonction JavaScript pendant l’ouverture de la 2ème page web dans le nouvel onglet avant la visite de l’utilisateur sur celui-ci. (de manière similaire à celle de « l’événement utilisateur Scroll » faisant disparaitre la Barre d’adresse de Firefox pour Android quand l’utilisateur utilise cet évènement dans l’objectif d’aller vers le bas de la page web)


Vulnerability demonstration (video):


icon_firefox[CVE-2016-1942] Location bar continues displaying wyciwyg URI and resource URI if user tries to navigate to it manually


Location bar continues displaying wyciwyg URI and resource URI if user tries to navigate to it manually


Announced: January 26, 2016
Reporter: Jordi Chancel
Impact: Low
Products: Firefox
Fixed in: Firefox 44


Description

Security researcher Jordi Chancel reported two issues involving addressbar spoofing.
The second flaw is a « low » rated security issue affecting Desktop Firefox. In this attack, when a URL which is invalid for an internal protocol is pasted into the addressbar, the addressbar contents may be manipulated to show the location of an arbitrary website instead of the one currently loaded. This issue is mitigated by the protocol being prepended to the displayed URL, making the address less likely to be confused with the appended URL.


Vulnerability demonstration (video):


icon_firefox[CVE 2015-7186] Reading sensitive profile files through local HTML file on Android


Reading sensitive profile files through local HTML file on Android


Announced: November 3, 2015
Reporter: Jordi Chancel
Impact: Moderate
Products: Firefox
Fixed in: Firefox 42


Description

Security researcher Jordi Chancel reported an issue in Firefox for Android where
a locally saved HTML file could use file: URIs to trigger the download of
additional files or opening of cached profile data without user awareness.


This issue only affects Firefox for Android. Firefox on other operating systems is not affected.


Vulnerability demonstration (video):

icon_firefox[CVE 2015-7185] Firefox for Android addressbar can be removed after fullscreen mode


Firefox for Android addressbar can be removed after fullscreen mode


Announced: November 3, 2015
Reporter: Jordi Chancel
Impact: Moderate
Products: Firefox
Fixed in: Firefox 42


Description

Security researcher Jordi Chancel reported when Firefox
for Android exits fullscreen mode, it can be induce through script to not restore the
addressbar when the window is redrawn in normal mode. This could allow an attacker to
spoof the addressbar with their own content.


This issue only affects Firefox for Android. Firefox on other operating systems is not affected.


Vulnerability demonstration (video):

icon_firefox[CVE 2015-4476] Site attribute spoofing on Android by pasting URL with unknown scheme


Site attribute spoofing on Android by pasting URL with unknown scheme


Announced: September 22, 2015
Reporter: Jordi Chancel
Impact: Moderate
Products: Firefox
Fixed in: Firefox 41


Description

Security researcher Jordi Chancel reported that on Firefox for
Android, when a URL is pasted with an unknown protocol, such assecure: orhttpz:,
the pasted URL is shown in the addressbar but no navigation occurs.
Other addressbar attributes present before this pasted URL is entered will continue to be
rendered. This could lead to potential spoofing by a malicious site.


This issue only affects Firefox for Android and does not affect Firefox on OS X, Linux, or Windows operating systems.


Vulnerability demonstration (video):

icon_firefox[CVE 2015-0810] Cursor clickjacking with flash and images


  • Introduction :

Voici encore une vulnérabilité de CursorJacking sur le navigateur web Mozilla Firefox exploitable sur Mac OS X. Comme la vulnérabilité CVE-2014-1539 Mozilla Foundation Security Advisory 2014-50 Clickjacking through cursor invisibility after Flash interaction , cette vulnérabilité permet elle aussi d’exécuter des malwares par le biais de l’exécution silencieuse d’un Addon XPI ou encore de prendre le contrôle de la webcam et du microphone.

  • Découverte de la vulnérabilité :

la découverte de cette vulnérabilité a été basé sur une approche et une programmation similaire à la vulnérabilité reporté par moi-même et corrigé en juin 2014 sur la version 30 de Mozilla Firefox (MFSA 2014-50 / CVE-2014-1539) mais avec tout de même une base dexploitation différente.

1. La première possibilité découverte consistait a rendre le curseur invisible et créer un décalage entre le réel curseur et sa copie (cependant le rendu invisible du curseur par un attribut CSS ne constitue pas une vulnérabilité, elle n’est utilisée que pour mettre en place la première partie de l’attaque), une fois cela mis en œuvre, l’utilisation d’un objet flash définissant le curseur comme invisible est donc nécessaire pour mener à bien l’exploitation désiré. L’objet flash devait être placé au même endroit où trouve le bouton d’activation de la webcam et du microphone dans la boite de dialogue WebRTC et ainsi inciter l’utilisateur a déplacer son curseur sur une zone apparemment éloigné de l’objet flash bien que le réel curseur soit donc en réalité sur cette objet, c’est une fois que cette boite de dialogue apparait que l’exploitation de cette vulnérabilité est mise en place, car en effet le curseur reste invisible bien qu’il se trouve sur le bouton d’activation de la webcam (qui ne fait donc pas partie de la page web).

2. La seconde exploitation possible découverte est quasi similaire a MFSA 2014-50  , l’exploitation en question ne diffère qu’en un seul point qui est lié a la sortie de l’objet flash par le curseur, permettant donc de rendre l’invisibilité de celui-ci persistante (À noter que les éléments utilisés entre MFSA 2014-50 et MFSA 2015-35 sont exactement identiques).

3. La troisième exploitation utilise une méthode d’ouverture d’onglet contenant l’objet flash adéquate (rendant le curseur invisible quand le curseur se trouve sur cet objet) et permet de rendre l’invisibilité du curseur persistante via l’utilisation de la fonction Alert() sur la page d’origine ayant ouvert l’onglet contenant l’objet flash.

 

  • Description :

Security researcher Jordi Chancel reported a mechanism that made cursor invisible through flash content and then replaced it through the layering of HTML content. This flaw can be in used in combination with an image of the cursor manipulated through JavaScript, leading to clickjacking during subsequent interactions with HTML content.

This flaw only affects OS X systems. Windows and Linux installations are unaffected.

Vulnerability demonstration (video):

Security Researcher Jordi Chancel

icon_firefox[CVE 2014-1539] Clickjacking through cursor invisibility after Flash interaction


  • Introduction :

Dans la mise à jour de Mozilla Firefox 30 ma vulnérabilité de CursorJacking/ClickJacking à été corrigé avec un impact défini comme Haut (sec-high).

D’après les démonstrations que j’ai développées, cette vulnérabilité permet dans un premier temps de rendre le curseur invisible et de duper l’utilisateur via la mise en place d’un faux curseur se déplacent parallèlement au curseur réel avec un décalage entre eux ce qui permet donc a un attaquant de mener des attaques de Clickjacking en trompant l’utilisateur quand à l’endroit ou il clique en réalité.

  • Conclusion :

Avec cette vulnérabilité, plusieurs possibilités d’attaques sont envisageable comme le fait de mener une attaque de clickjacking sur l’Addon Prompt,permettant ainsi d’exécuter des programmes malveillants ,ou encore de prendre de contrôle de la webcam et du microphone via le WebRTC dialog, et encore beaucoup d’autres attaques.

  • Description

Security researcher Jordi Chancel reported a mechanism where the cursor can be rendered invisible after it has been used on an embedded flash object when used outside of the object. This flaw can be in used in combination with an image of the cursor manipulated through JavaScript, leading to clickjacking during interactions with HTML content subsequently. This issue only affects OS X and is not present on Windows or Linux systems.

Vulnerability demonstration (video):

 -Security Researcher Jordi Chancel

[Opera Security Advisory DNA-19280] Address bar spoofing with Data URIs


Advisory: Address bar spoofing with Data URIs


UPDATE Link: http://www.opera.com/blogs/security/2014/05/security-changes-opera-21/


Announced: May 6, 2014
Reporter: Security researcher Jordi Chancel
Impact: Low
Products: Opera
Fixed in: Opera 21


Description

When a user chooses to open a link in a new tab, this should still display the address as normal. However, with Data URIs, Opera would accidentally right-align the address field, showing the wrong end of the address. Again, this could allow a specially crafted URL to show what appeared to be a domain name, but which was actually path data. As with the previous bug, it would be missing the domain highlight, but may be enough to fool some users.

Opera’s Response

Opera Software has released Opera 21, where this issue has been fixed.


Credits

Reported by Jordi Chancel.


  • Vidéo de démonstration :


-Security Researcher Jordi Chancel