Title: Analyse rapide de l'extension anti-phishing pour Firefox du Credit-Mutuel
Date: 2015-09-05 12:00

This article is in French since it's about a (broken) Firefox extension of
a French bank, namely the [Credit Mutuel]( https://en.wikipedia.org/wiki/Cr%C3%A9dit_Mutuel ).

Il y a peu, je voulais regarder l'application Android de ma banque,
mais j'ai fini (un peu par flemme) par regarder le code de
[leur extension Firefox]( https://addons.mozilla.org/fr/firefox/addon/barre-de-confiance-cm-cic/ )
à la place, codée par [Euro information]( https://www.e-i.com/fr/index.html ),
la *Filiale informatique du groupe Crédit Mutuel/CIC*.

Voici un bref résumé de l'opération.

# Liste des url

La liste des url sur liste blanche peut être obtenue
[ici]( https://addons.mozilla.org/fr/firefox/files/browse/210610/file/chrome/barreconf/content/domfic.dat#top ),
et déchiffrée avec le script suivant:

```python
import sys
import itertools

KEY = 'kUs@yR'.upper()

with open(sys.argv[1], 'r') as f:
    for i in f.readlines()[1:]:
        ret = ''
        for c,k in itertools.izip(i[:-2], itertools.cycle(KEY)):
            ret += chr(ord(c) - (ord(k) - 65))
        print(ret.lower())
```

Détail amusant:

```
$ python decrypt.py ./chrome/barreconf/content/domfic.dat | xargs dig | grep NXDOMAIN 
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 55482
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 31574
```

Qui sera le premier à les acheter pour être whitelisté et avoir une jolie barre verte
pour faire du phishing ?

La liste (encodée) des url blacklistées peut être obtenue [ici]( https://barre-de-confiance.cm-cic.com/fr/blacklist.html ),
ou [ici]({static}/files/blacklist_creditmutuel.txt) en clair. Voici le script pour la déchiffrer:

```python
import sys

LN_CHAINE_CLAIRE   = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789/&?.-~=_";
LN_CHAINE_MELANGEE = "f~7m60Fp.Kv&yr?_bsS9Ye82BuoNxqW/E=GkItinLMaOzRdjTUgJAlZ1PH4Qc5Vh3CX-wD";

with open(sys.argv[1], 'r') as f:
    for line in f.read().split('\r\n'):
        for url in line.split('|'):
            if url.startswith('!'):
                ret = 'http://'
            elif url.startswith('*'):
                ret = 'https://'
            for c in url[1:]:
				if c not in LN_CHAINE_MELANGEE:
                    ret += c
                else:
                    ret += LN_CHAINE_CLAIRE[LN_CHAINE_MELANGEE.index(c)]
            print(ret)
```

Elle contient (perdues entre les url malveillantes) quelques perles, comme:

- Une [vente de phares d'Opel Vectra C sur eBay]( http://www.ebay.de/itm/Opel-Vectra-C-Signum-KLARGLAS-SCHEINWERFER-SCHWARZ-/360860429569 )
- Le [blog dédié à la sécurité d'SFR]( http://blog-securite.sfr.fr/alertes_scurit/ )
- Un [sous-domaine de Paypal]( https://t.paypal.com )
- Le domaine [pop3]( http://pop3.live.com ) du service email de Microsoft
- Un [article du Monde]( http://www.lemonde.fr/jeux/jeu/2015/03/23/gagnez-hamlet-macbeth-et-richard-iii-dans-une-luxueuse-collection-editee-par-le-monde_4599175_1601271.html )
- Le [Zimbra de Free]( https://zimbra.free.fr/service/home/7E/?auth=co&ampid=27720&amppart=2 )
- Des [url invalides vers le site d'EDF]( https://monagencepart.edf.fr443/ASPFront )
- Un [sous-domaine de Skype]( https://pipe.skype.com/Client/2.0 )
- Un [sous-domaine de xiti]( https://logs6.xiti.com/hit.xiti )
- [TinyURL]( http://tinyurl.com )

Quand l'utilisateur navigue sur une page blacklistée, le popup apparait,
mais également si un formulaire avec une méthode `POST` *et* son action vers
une de ces addresses sont présents sur la page.

Les urls sont matchées avec leur protocole, ce qui fait qu'il est possible de
contourner complètement la vérification sur les formulaires en utilisant des
[PRURL]( https://en.wikipedia.org/wiki/Uniform_resource_locator#Protocol-relative_URLs ).

# Vulnérabilités

## Bypass et faux-positifs

Parce que parser des [url]( https://tools.ietf.org/html/rfc3986 ) à la main ne semble pas être une *chouette idée*,
c'est précisément [ce que fait]( https://addons.mozilla.org/fr/firefox/files/browse/210610/file/chrome/barreconf/content/barreconf.js#L376 ) l'extension : ce qui permet de lui faire croire que [cette url]( https://dustri.org/?@www.creditmutuel.fr/ ) est
le site officiel du Crédit Mutuel, tandis que [celle-ci]( https://www.creditmutuel.fr/groupe/fr/index.html?@http://e-cmne.com )
serait un site de phishing.

[![Credit mutuel faux négatif]({static}/images/credit_mutuel_legit.png)]( https://dustri.org/?@www.creditmutuel.fr/ )

[![Credit mutuel faux positif]({static}/images/credit_mutuel_legit2.png)]( https://www.creditmutuel.fr/groupe/fr/index.html?@http://e-cmne.com )

## Manipulation du DOM

La popup de phishing est affichée en manipulant le DOM de la page courante;
ce qui veut dire qu'il est possible de la détecter, modifier, masquer, … avec un peu de javascript:

```javascript
if (document.getElementById('bc_attention') != null) {
	alert('Safebar detected!');
}

document.getElementById('bc_attention').style.display = 'none';
document.getElementById('bc_blocage').style.display = 'none';
```

Comme l'annotation dans la barre de phishing a lieu après le chargement de la page,
il suffit de charger une ressource indéfiniment (à la [deelay.me]( http://www.deelay.me/ ))
pour que le site ne soit pas détecté comme malveillant. On doit aussi
pouvoir jouer un peu à grand coup de
[CSP](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP).

Il est également possible de changer l'adresse de destination du bouton *Sortir d'ici*
avec une seule ligne de javascript:

```javascript
window.home = function(){window.location='https://dustri.org';};
```

## Tracking 
L'extension se permet d'injecter un morceau de javascript traqueur depuis `http://www.google-analytics.com`
(oui, en **http**, au cas [où]( http://ht.musalbas.com/rcs-dev%5cshare/HOME/Naga/httpX/Presentation.pptx ))
sur les pages whitelistées **et** blacklistées,
ainsi qu'un cookie contenant la version de la toolbar et le numéro de version de Firefox.

Ce comportement n'est mentionné nulle part dans le [CLUF]( https://addons.mozilla.org/fr/firefox/addon/barre-de-confiance-cm-cic/eula/ ).

# Notes diverses

## Framekiller

Le [site principal]( https://credit-mutuel.fr ) utilise une espèce de
[framekiller]( https://en.wikipedia.org/wiki/Framekiller )
(mais uniquement sur la page principale), au lieu de `X-Frame-Options: DENY`
qui marcherait à tous les coups.

## Commentaires des utilisateurs

Visiblement, je ne suis [pas le seul]( https://addons.mozilla.org/fr/firefox/addon/barre-de-confiance-cm-cic/reviews/ )
à trouver que l'extension est *légèrement suboptimale*.

## Problèmes de performance

Vérifier de manière synchrone que l'url actuelle (ou celle des `actions` des formulaires) ne fait
pas partie d'une liste de près de 4000 items, déchiffrée à chaque vérification a un impact important sur la navigation
en terme de performances.

# Conclusion

L'extension procure un faux sentiment de sécurité, n'est plus maintenue, ralentit la navigation, traque
ses utilisateurs sans les en avertir, …
Bref, [à éviter](https://addons.mozilla.org/fr/firefox/addon/barre-de-confiance-cm-cic/reviews/527910/ ).

[edit] Un lecteur a [ouvert un bug]( https://bugzilla.mozilla.org/show_bug.cgi?id=1203163 ) chez Mozilla 
pour faire *blacklister* l'extension.
