This article is in French since it's about a (broken) Firefox extension of a French bank, namely the Credit 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 à la place, codée par Euro information, 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, et déchiffrée avec le script suivant:
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, ou ici en clair. Voici le script pour la déchiffrer:
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
- Le blog dédié à la sécurité d'SFR
- Un sous-domaine de Paypal
- Le domaine pop3 du service email de Microsoft
- Un article du Monde
- Le Zimbra de Free
- Des url invalides vers le site d'EDF
- Un sous-domaine de Skype
- Un sous-domaine de xiti
- TinyURL
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.
Vulnérabilités
Bypass et faux-positifs
Parce que parser des url à la main ne semble pas être une chouette idée, c'est précisément ce que fait l'extension : ce qui permet de lui faire croire que cette url est le site officiel du Crédit Mutuel, tandis que celle-ci serait un site de phishing.
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:
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) pour que le site ne soit pas détecté comme malveillant. On doit aussi pouvoir jouer un peu à grand coup de CSP.
Il est également possible de changer l'adresse de destination du bouton Sortir d'ici avec une seule ligne de 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ù)
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.
Notes diverses
Framekiller
Le site principal utilise une espèce de
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 à 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.
[edit] Un lecteur a ouvert un bug chez Mozilla pour faire blacklister l'extension.