photo of devloop

devloop :: blog

sécurité informatique, programmation, Linux et plus encore

Subscribe to RSS feed

Posts tagged with "p2p"

BittOratio : Boostez vos statistiques BitTorrent

, , , ...

Dans la même optique que pour le code statsliar qui permet de booster les statistiques d'un site en envoyant des requêtes multiples à travers des proxys, je me suis mis à écrire un programme capable de booster ses statistiques d'upload sur les communautés BitTorrent qui s'appuient sur le principe du ratio. Le principe de ces sites est simple : on peut continuer à télécharger tant que l'on veut du moment que l'on partage dans une certaine proportion. Le ration est une variable dont la régle est "quantité de données downloadées" divisée par "quantité de données uploadées". Le ration exigé est lié au réglement du site, son minimum autorisé est généralement de 0.5. C'est plus l'envie que le besoin qui m'a amené à développer cet outil. C'était l'occasion de reprendre les spécifications BitTorrent étudiées pour mon article Utilisations alternatives du protocole BitTorrent et de voir ce qu'il était possible de faire. La première partie du document est la suite de la traduction de la spécification. La seconde partie explique le fonctionnement de l'outil. Je vous invite à vous pencher d'abord sur l'article cité précédemment et à consulter la partie concernant les requêtes envoyées par le client sur le tracker sans quoi la compréhension peut s'avérer difficile. Première partie : Réponse émises par le tracker Le tracker répond avec un document "text/plain" correspondant à un dictionnaire bencodé contenant les clés suivantes :
  • failure reason : Si présent, alors il est possible qu'aucune autre clé ne soit présente. Sa valeur est un message d'erreur expliquant pourquoi la requête a échouée (chaîne).
  • warning message : (nouveau, optionnel) Similaire à failure reason, mais la réponse est toujours traitée normalement. L'avertissement est affiché au même titre qu'une erreur.
  • interval : Intervalle en secondes que le client devrait attendre entre l'envoi de requêtes régulières au tracker.
  • min interval : (optionnel) Intervalle minimum d'annonce. Si présent, les clients ne doivent pas annoncer plus fréquemment qu'à cet intervalle.
  • tracker id : Une chaîne que le client devrait renvoyer sur chaque prochaine annonce. S'il est absent et si une précédente annonce a envoyé un tracker id, ne pas rejeter cette ancienne valeur mais la conserver.
  • complete : nombre de peers qui disposent du fichier entier, c'est à dire les "seeders" (entier).
  • incomplete : nombre de peers qui ne seedent pas, c'est à dire les "leechers" (entier).
  • peers : (modèle dictionnaire) La valeur correspondante est une liste de dictionnaires, chacun avec les clés suivantes :
    • peer id : Un identifiant que le peer a choisi lui-même, comme décrit plus tôt pour la requête au tracker (chaîne).
    • ip : l'adresse ip du peer, soit en Ipv6 (forme hexadécimale), soit en ipv4 (séparation par des points) ou un nom DNS (chaîne).
    • port : le numéro de port du peer( entier).
  • peers : (modèle binaire) Au lieu d'utiliser le modèle de dictionnaire décrit précédemment, la valeur peut être une chaîne constituée de multiples de 6 octets. Les 4 premiers octets correspondent à l'adresse IP et les deux suivants au numéro de port. Le tout en notation réseau (big endian)
Comme mentionné plus tôt, la liste des peers est de 50 peers par défaut. S'il y a moins de peers sur le torrent, alors la liste sera plus petite. Dans le cas contraire, le tracker renvoit une liste de peers choisis aléatoirement. Le tracker a le droit d'implémenter un méchanisme plus intelligent de sélection des peers à retourner comme réponse. Il pourrait par exemple éviter de retourner la liste des seerders à un seeder. Les clients peuvent envoyer une requête plus tôt qu'au boût de l'intervalle spécifié si un événement se produit (par exemple stopped ou completed) ou si le client a besoin de découvrir plus de peers. Toutefois il est mal vu de "marteler" un tracker pour obtenir d'avantage de peers. Si un client souhaite une plus large liste de peers dans la réponse, alors il devrait spécifier le paramêtre numwant. Note pour l'implémentation : Même 30 peers est suffisant, la version 3 du client officiel n'établit en réalité de nouvelles connexions que s'il y a moins de 30 peers et va refuser les connexions s'il y en a 55. Ces valeurs sont importantes pour des raisons de performance. Quand un morceau (piece) a terminé de télécharger, des messages HAVE (obtenu) devront être envoyés aux peers les plus actifs. La conséquence est que l'utilisation de la bande passante augmente proportionnellement au nombre de peers. Au delà de 25, les nouveaux peers n'auront que très peu d'influence sur l'augmentation de la vitesse de téléchargement. Les créateurs d'interfaces graphiques sont fortement conseillés de dissimuler cela et d'empêcher de telles configurations qui de toute façon se montrerait très rarement utiles. Convention "scrape" des trackers Par convention la plupart des trackers supportent un autre type de requête, permettant de connaître l'état d'un torrent donné(ou de tous les torrents) que le tracker gère. On y fait référence en tant que "page de scrape" car elle automatise le traitement laborieux d'extraction des statistiques du tracker. L'URL de scrape se base aussi sur la méthode GET, similaire à ce qui a déjà été décris. Cependant l'URL de base est différente. La génération de cette URL de scrape se fait selon les étapes suivantes : Commencer avec l'url d'annonce. Trouver le dernier '/' dans cette chaîne. Si le texte suivant immédiatement ce '/' n'est pas 'announce' alors on considère que le tracker ne supporte pas la convention de scrape. Si c'est le cas, on substitue 'scrape' par 'announce' pour obtenir l'URL de scrape. Exemples : (URL d'annonce → URL de scrape)
  ~http://example.com/announce          → ~http://example.com/scrape
  ~http://example.com/x/announce        → ~http://example.com/x/scrape
  ~http://example.com/announce.php      → ~http://example.com/scrape.php
  ~http://example.com/a                 → (scrape non supporté)
  ~http://example.com/announce?x2%0644 → ~http://example.com/scrape?x2%0644
  ~http://example.com/announce?x=2/4    → (scrape non supporté)
  ~http://example.com/x%064announce     → (scrape non supporté)
L'URL peut être complétée par le paramètre optionnel info_hash, une variable de 20 octets décris plus tôt. Cela restreint le rapport du tracker à un torrent particulier. Dans le cas contraire les statistiques de tous les torrents gérés par le tracker sont retournés. Les développeurs de logiciels sont fortement encouragés à utiliser le paramètre info_hash dès que c'est possible, afin de réduire la charge et bande passante du tracker. Vous avez aussi la possibilité de spécifier plusieurs paramètres info_hash aux trackers qui les supportent. Bien que cela ne soit pas indiqué dans les spécifications officielles, c'est devenu un standard dans la pratique – par exemple : http://example.com/scrape.php?info_hash=aaaaaaaaaaaaaaaaaaaa&info_hash=bbbbbbbbbbbbbbbbbbbb&info_hash=cccccccccccccccccccc La réponse de cette requête HTTP GET est un document "text/plain" ou encore une version compressée par gzip qui correspond à un dictionnaire bencodé contenant les clés suivantes :
  • files : un dictionnaire comportant des paires clés / valeurs pour chaque torrent pour lequel il existe des statistiques. Si info_hash est spécifié est est valide, le dictionnaire contiendra une seule paire clé / valeur. Chaque clé correspond au info_hash, une suite de 20 octets. La valeur de chaque entrée du dictionnaire est composé des éléments suivants :
    • complete : nombre de peers qui disposent du fichier entier, c'est à dire les seeders (entier)
    • downloaded : nombre total de fois où le tracker a enregistré une terminaison (complétion) ("event=complete", c'est à dire quand un client termine de télécharger un torrent)
    • incomplete : nombre de peers non-seeders, c'est à dire les "leechers" (entier)
    • name : (optionnel) le nom interne du torrent, tel que défini dans la section d'info du fichier torrent (name)
Notez que cette réponse a 3 niveaux de profondeur de dictionnaire (sur le même principe que les poupées russes). Voici un exemple :
d5:filesd20:....................d8:completei5e10:downloadedi50e10:incompletei10eeee
"...................." est le info_hash de 20 octets avec 5 seeders, 10 leechers, et 50 téléchargements complets. Extensions non-officielles au scrape Ci-dessous sont les clés de réponse qui sont utilisés non-officiellement. Comme elles sont non-officielles, elle sont aussi optionnelles.
  • Failure reason : Un message d'erreur expliquant pourquoi la requête a échouée (chaîne). Clients connus pour utiliser cette clé : Azureus.
  • Flags : un dictionnaire constitué de drapeaux divers. La valeur des clés de drapeau est un autre dictionnaire à niveaux, pouvant contenir l'information suivante :
    • min_request_interval : La valeur de cette clé est un entier correspondant au nombre de secondes que le client doit attendre avant de scraper à nouveau le tracker. Trackers connus pour utiliser cette clé : BNBT. Clients utilisant cette clé : Azureus.
BittOratio : Comment tricher sur ses statistiques d'upload A bien regarder la façon dont sont formé les requêtes et réponses du tracker on remarque que tricher est simple : il suffit d'exagérer la valeur passée au paramêtre uploaded sur les requêtes announce. Pour le tracker il est beaucoup plus compliqué de savoir si le client triche ou non. Toutefois certaines vérifications peuvent être faites :
  • Vérifier que le client a envoyé une requête annonce de démarrage du torrent ("event=started") avant de prétendre avoir partagé des données.
  • Surveiller s'il n'y a pas des incohérences (quantité d'upload qui diminue au lieu d'augmenter). Mais c'est incohérences peuvent être non-intentionnelles (utiliseur qui efface par mégarde un fichier que le client torrent va retélécharger etc).
  • Vérifier que le client n'est pas seul sur le torrent : pour uploader il lui faut forcément un autre client.
  • Vérifier que le client a bien ses ports de partage ouvert. Il ne peut pas partager s'il refuse toute connexion. Mais cette vérification serait difficile à mettre en place pour le tracker).
  • Calculer la vitesse d'émission du client en se basant sur la quantité d'upload qu'il prétend envoyer entre deux moments successifs et vérifier si cette vitesse est informatiquement réaliste.
Des outils existent déjà pour simuler l'upload de données : RatioMaster et RatioMaster-NG. Le second se veut être une correction du premier. Ils ne téléchargent pas réellement les fichiers mais envoient des suites de requêtes au tracker pour faire croire qu'ils participent aux transferts. Je n'ai pas cherché à étudier leur fonctionnement précis mais certains trackers tentent de détecter ce type de fraude par les vérifications citées plus haut. Mon logiciel BittOratio fonctionne autrement. C'est un proxy HTTP qui modifie au vol les requêtes d'annonce à destination du tracker, multipliant la quantité de données envoyée par un facteur (nombre entier) modifiable dans le code source. Pour qu'il fonctionne il faut donc que les fichiers soient réellement téléchargés et mis à disposition mais vous n'aurez pas à uploader autant que vous ne téléchargez pour obtenir un bon ratio. L'avantage de cet outil est que ce système de triche est indécelable smile Il suffit de lancer le proxy qui écoute sur le port tcp 8080 et de configurer votre client BitTorrent pour passer par le proxy. Par exemple avec Transmission sous Linux, il faut modifier le fichier .config/transmission/settings.json pour placer les réglages suivants :
"proxy": "localhost",
"proxy-auth-enabled": false,
"proxy-auth-password": "",
"proxy-auth-username": "",
"proxy-enabled": true,
"proxy-port": 8080,
"proxy-type": 0,
Les requêtes interceptées sont affichées de façon succinte à l'écran (identité du tracker, hash du torrent, quantité d'upload). La difficulté principale lors de l'écriture du programme a été de gérer les erreurs de connexion. Comme la bande-passante est bouffée par le client BitTorrent, le proxy rencontre pas mal d'erreurs de timeout (connexion au tracker indispo ou résolution dns qui prend trop de temps). On pourrait penser que les requêtes du tracker importe peu mais elles ont un effet important sur le client BitTorrent. La première technique que j'ai employé pour gérer ces erreurs était de renvoyer au client un message HTTP 504 (Gateway Timeout) correspondant parfaitement aux problèmes de ce type mais le client avait une mauvaise tendance à abandonner au boût d'un moment. Finalement j'ai mis en place un système de cache qui renvoit au client le résultat de la requête précédente (pour le même info_hash) et qui améliore largement la stabilité de l'ensemble. Quand on stoppe le proxy (Ctrl+C), celui-ci "flushe" le cache et envoit les annonces d'upload qui n'auraient pas été envoyées sur le tracker faute de capacité réseau. Parmi les modifications apportées durant l'écriture du code, j'ai du abandonner urllib2 (vraiment à la masse en terme de performances) au profit de httplib. Pour terminer (et puisque certains se posent la question) il semble d'après mes observations qu'il est préférable de stopper (mettre en pause) les torrents avant de fermer complètement le client BitTorrent au lieu de le fermer directement : en effet le client n'envoit pas forcément les requêtes d'annonce à la fermeture pour synchroniser ses statistiques avec le tracker alors que la mise en pause envoit ces informations avec l'event "stopped". Le code se trouve ici : bittoratio.py J'avais d'abord cherché une analogie à Bit Torrent pour le nom du programme, je suis arrivé à "Dick Rivers"... je me suis abstenu bigsmile Je reprendrais peut-être un jour la suite de la traduction de la spécification.

J'ai testé Opera Unite

, , ,

Comme je suis de près les différentes build de la version d'Opera 10 à venir, je ne pouvais pas échapper au buzz concernant Opera Unite.

J'ai donc mis en service ma page depuis quelques temps déjà et ait eu l'occasion de tester les différents services proposés en standard.

J'ai d'abord rencontré des problèmes pour que la page soit accessible. Bien que l'utilisation de UPnP soit activée dans Opera et sur le routeur, ce dernier ne semblait pas recevoir la moindre demande de port. J'ai donc du NATer moi même le port 8840 pour recevoir les connexions. Il est possible que cela soit corrigé depuis, je n'ai pas réessayé la configuration depuis la première build.

Le Fridge qui permet de laisser des mémos affichés sous la forme de post-it et le Lounge qui est un salon de discussion très sommaire sont plus des gadgets à mes yeux et je les ais désactivé assez tôt. A noter que pour le Loundge je n'ai pas retrouvé dans les dossiers de cache Opera les conversations ce qui est un bon point question vie privée ("privacy"). Bien sûr les données sont transférées en clair sur le réseau et non protégées par SSl/TLS.

Le système de galerie photo et le service faisant office de serveur web sont plutôt sympathiques et permettent à des personnes souhaitant créer un site Internet de le faire facilement et de disposer d'un nom de domaine pour pas un rond smile
Evidemment on se limite à des pages statiques, il n'est pas question de faire exécuter du PHP ou CGI.

Pour le peu que j'ai regardé niveau sécurité, je n'ai rien remarqué de mauvais. Les cookies ne sont pas définis sur un sous-domaine global mais bien le domaine exact pour la "domiciliation" de l'utilisateur (home, work etc) et l'administration se fait par le protocole spécial unite:// (donc pas d'attaques du type CSRF)

J'ai eu plus de difficultés à faire fonctionner le Media Player mais le problème venait en fait de FlashBlock pour Opera qui cassait l'affichage des pages sad
Une fois corrigé, les flux passent bien et on ne sent pas les connexions passer depuis la navigateur (évidemment c'est selon le nombre de personnes connectées).

Quand au système File Sharing, il permet à chacun de mettre très simplement à disposition des fichiers. On regrette bien sûr de ne pas pouvoir spécifier plusieurs dossiers de partage.
Les transferts semblent se faire sans problème. Lors d'un test on a même pû transférer un fichier d'environ 700Mo... en revanche ce transfert utilisait la totalité de la bande passsante en upload sad Opera semble avoir rectifié le coup avec la dernière build en date.

Pour ce qui est des autorisations d'accès, c'est pour le moins simple : ressources publiques, protégées par un mot de passe ou privées (seul vous y accèder).
Un système permettant d'uploader des fichiers vers son ordinateur pourrait aussi être sympathique (transfert de fichier dans les deux sens)

En revanche le système dans sa totalité n'est par parfait et il arrive que l'on doive relancer Opera pour refaire fonctionner les services qui ne répondent plus.
J'aime vraiment la possibilité que le service offre à chacun (même des "non-initiés") de pouvoir mettre en place et gérer soit même un petit espace sur Internet smile

Prospection ou flicage ?

, , , ...

Il y a moins d'une heure, j'ai recu un appel de prospection téléphonique de mon FAI (pour ne pas le nommer je ferai référence à lui par le numéro "9" bigsmile ) qui m'a un peu surpris... plutôt par sa tournure que par sa finalité (quoique on sait jamais...)

En gros je recois l'appel d'une personne (probablement payée peau de zob mais c'est une autre histoire) qui m'informe que depuis quelques temps ma bande passante semble bien encombrée et qu'il s'inquiète pour mon (ou mes) système(s) informatique et que j'aurais pû être la victime d'attaques malicieuses (voire, qui sait, maquiavéliques p ).
Pour bonne preuve de sa cyber-empathie, il s'enquiert de ma santé informatique en me demandant sous quels systèmes mes ordinateurs fonctionnent. En toute franchise je lui répond que je suis sous Linux. "Tous ?" réplique-t-il. Effectivement tous mes systèmes sont sous Linux. Il n'y a aucun irréductible depuis la mort très récente d'Alice, ma première UC, dont la carte mère a rendue l'âme sans même prévenir cry
Sur ce il a rétorqué qu'effectivement j'étais en "pleine sécurité" penguin et a fait ses salutations.

Chose amusante, la communication téléphonique était pour le moins hachée car j'étais (et suis toujours à l'heure de ces lignes) en train de bourriner sous BitTorrent pour télécharger le DVD de la dernière version d'openSUSE lol

Quoiqu'il en soit, je trouve choquant le fait de contacter systèmatiquement les clients dont l'utilisation des "tuyaux du net" a pû augmenter et d'aller leur poser des questions louches (lobbyistes ?) pour essayer de déterminer le pourquoi du changement.
Que ce soit une démarche commerciale pour vendre des packs de sécurité compatibles crosoft bug ou une démarche gouvernementale pour mettre l'Internet en boîte, dans tous les cas ça me semble être une atteinte à la vie privée.
Qu'ils spamment équitablement leurs clients, sans distinction de taille de tuyau ou de couleur et de longueur de cable réseau (pas de discrimination), ça ne me dérange pas. Mais qu'ils se basent sur des données personnelles (même si ce n'est que pour en déterminer un volume), je trouve ça indécent.
Non mais, qu'ils s'occupent de leur fesses !! furious

Sur ce, j'ai un système à mettre à jour wink

Utilisations alternatives du protocole BitTorrent

, , , ...

Le protocole BitTorrent est un protocole de transfert de données Poste à poste (P2P) qui est devenu très populaire. Il supporte le multisourcing et permet de télécharger parallèlement plusieurs blocks d'un même fichier. Il est centralisé autour d'un "tracker" qui correspond à un annuaire de personnes qui partagent un fichier à un moment donné. Quand un client récupère cet annuaire il peut se connecter à chaque client pour négocier le téléchargement d'un ou plusieurs morceaux de fichiers. La recherche de fichier est elle complétement décentralisée, on ne demande pas au tracker s'il possède le fichier que l'on recherche. Il faut pour télécharger une ressource, disposer d'un fichier métainfo .torrent qui décrit les fichiers et le tracker. Le protocole BitTorrent est aussi connu pour sa facultée à charger la bande passante des peers bigsmile . Le protocole est fait de telle façon que le tracker n'a que peu d'informations à échanger avec les clients. Dans cet article je vous présenterais une partie du protocole BitTorrent qui correspond à la traduction du début de la spécification puis je parlerais des utilisations alternatives qui peuvent être faites de ce système p Spécifications du Protocole Bittorrent v1.0 Présentation BitTorrent est un protocole d'échange de fichier peer-to-peer conçu par Bram Cohen. Visitez son site à http://www.bittorrent.com. BitTorrent est conçu pour faciliter les transferts de fichiers entre plusieurs peers sur des réseaux non fiables. Objectif L'objectif de cette spécification est de documenter la version 1.0 du protocole BitTorrent dans les détails. La page de spécification du protocole faite par Bram expose les grandes lignes du protocole dans des termes simples, et manque de détails sur certains points. Notre souhait est que ce document devienne la spécification officielle, écrite à l'aide de termes clair et sans ubiquité, qui peut aussi bien être utilisée comme base pour des discussions que pour des implémentations futures. Ce document se veut être tenu à jour et utilisé par le communauté de développement BitTorrent. Tout le monde est invité à contribuer à ce document, en gardant à l'esprit que son contenu doit représenter le protocole actuel, déjà déployé dans un bon nombre d'implémentations clientes. Conventions Dans ce document, différentes conventions sont utilisées afin de présenter les informations de façon concise et sans équivoque.
  • peer contre client : Dans ce document, un peer est n'importe quel client BitTorrent participant au téléchargement. Le client est aussi un peer, cependant il s'agit du client BitTorrent fonctionnant localement sur la machine.
  • piece contre block : Dans ce document, un "piece" (morceau) correspond à une portion des données téléchargées, décrite dans le fichier métainfo, qui peut-être validé par un hash SHA1. Un block est une portion de données qu'un client peut demander à un peer. Un "piece" est constitué de deux blocks ou plus, qui peuvent ensuite être validés.
bencodage Le bencodage est une méthode permettant de spécifier et d'organiser les informations dans un format court. Cette méthode supporte les types suivants : chaine de caractères, entiers, listes et dictionnaires. Chaines de caractères Les chaines de caractère sont codées de la façon : <longueur de la chaine en base 10 ASCII>:<chaine de caractères> Notez qu'il n'y a aucun délimiteur de début et de fin. Exemple: 4:spam représente la chaine "spam" Entiers Les entiers sont encodés de a façon suivante : i<entier en base 10 ASCII>e Le i initial et le e de fin sont les délimiteurs. Il est possible d'avoir des entiers négatifs comme i-3e. Il est interdit de préfixer le nombre avec un zéro comme dans i04e. Cependant i0e est valide. Exemple : i3e représente l'entier 3 Note : le nombre maximum de bits pour cet entier n'est pas spécifié mais il s'agit généralement d'un entier signé de 64 bits qui permet de manipuler des "gros fichiers" (dépassant les 4Go) Listes Les listes sont encodées selon le format : l<valeurs bencodées>e Le l et le e sont les délimiteurs de début et de fin. Une liste peut contenir n'importe qi'elle type bencodé, y compris d'autres listes... Exemple : l4:spam4:eggse représente une liste composée de deux chaines : ["spam", "eggs"] Dictionnaires Les dictionnaires sont encodés selon le modèle suivant : d<chaine bencodée><élément bencodé>e Le d et le e servent de délimiteurs. Notez que les clés doivent être des chaines bencodées. Les valeurs peuvent être de n'importe quel type bencodé, aussi bien les entiers, les chaines, les listes ou d'autres dictionnaires. Les clés doivent être des chaines et apparaître dans l'ordre alphabétiques. Les chaines doivent pouvoir être comparées par une comparaison binaire, en opposition à une comparaison spécifique à une culture. Exemple : d3:cow3:moo4:spam4eggse représente le dictionnaire {"cow"=>"moo","spam"=>"eggs"} Exemple : d4:spaml1:a1:bee représente le fictionnaire {"spam"=>["a","b"]} Exemple : d9:publisher3:bob18:publisher.location4:home17:publisher-webpage15:www.exemple.come Structure de fichier métainfo Toutes les données dans le fichier métainfo sont bencodées. La spécification pour le bencodage est définie ci-dessus. Le contenu d'un fichier métainfo (un fichier avec une extension ".torrent") est un dictionnaire bencodé, contenant les clés listés ci-dessous. Toutes les chaines de caractères sont encodées en UTF-8.
  • info : un dictionnaire qui décris les fichiers du torrent. Il y a deux formes possibles : une dans le cas où le torrent correspond à un seul fichier sans structure de répertoire, et le cas où l'on a affaire à un torrent "multi-fichier" (voir détails plus loin)
  • announce : l'url d'annonce du tracker (chaine de caractères)
  • allounce-list : (optionnel) c'est une extension de la spécification officielle, qui est aussi à compatibilité ascendante. Cette clé est utilisée pour implémenter une liste de trackers de secours. La spécification complète peut être lue ici
  • creation date : (optionnel) la date de création du torrent, dans le format de date standard UNIX (nombre de secondes dpuis le 1/1/1970 à 00:00:00 UTC)
  • comment : (optionnel) commentaires de l'auteur (chaine de caractères)
  • created by : (optionnel) nom et version du programme utilisé pour créer le .torrent (chaine de caractères)
Dictionnaire info Cette section contient les champs qui sont communs aux deux modes, "fichier seul" et "fichier multiple".
  • piece-length : nombre d'octets dans chaque piece (entier)
  • pieces : chaine qui consiste en la concaténation de tous les hashs SHA1 de 20 octets, un par piece (chaine d'octets)
  • private : (optionnel) ce champ est un entier. S'il est à "1", le client DOIT publier sa présence pour obtenir d'autres peers SEULEMENT via les trackers déclarés explicitement dans le fichier métainfo. Si ce champ est à "0" ou s'il n'est pas présent, le client peut obtenir des peer par d'autres moyens, par exemple l'échange de peer PEX, DHT. Ici "privé" doit être compris comme pas de peers d'origine extérieure.
info dans le mode "fichier seul" Dans le cas du mode "fichier seul", le dictionnaire info contient la structure suivante : name : le nom du fichier. A titre purement consultatif. (chaine) length : longeur du fichier en octets (entier) md5sum : (optionnel) une chaine de 32 caractères hexadécimaux correspondant à la somme MD5 du fichier. Elle n'est pas du tout utilisée par BitTorrent, mais certains programmes l'utilisent pour une meilleure compatibilité. info dans le mode "fichier multiple" Dans le cas du mode "fichier multiple", le dictionnaire info contient la structure suivante :
  • name : le nom du répertoire dans lequel stocker tous les fichiers. A titre purement consultatif. (chaine)
  • files : une liste de fictionnaires, un pour chaque fichier. Chaque dictionnaire contient les clés suivantes :
    • length : longueur du fichier en octets (entier)
    • md5sum : (optionnel) une chaine de 32 caractères hexadécimaux correspondant à la somme MD5 du fichier. Elle n'est pas du tout utilisée par BitTorrent, mais certains programmes l'utilisent pour une meilleure compatibilité.
    • path : une liste contenant une ou plusieurs chaines qui regroupées représentent le chemin (path) et le nom du fichier. Chaque élément de cette liste correspond au nom d'un répertoire ou (dans le cas du dernier élément) au nom du fichier. Par exemple, un fichier "dir1/dir2/file.ext" consistera de trois chaines : "dir1", "dir2", et "file.ext". Le tout est encodé comme une liste bencodée de chaines tel que l4:dir14:dir28:file.exte
Tracker HTTP/HTTPS Protocol Le tracker est un service HTTP/HTTPS qui répond à des requêtes HTTP GET. Les requêtes incluent les paramêtres des clients qui permettent au tracker de générer des statistiques générales. La réponse inclue une liste de peer qui aide le client à la diffusion du torrent. La base de l'url se compose d'une url d'annonce telle que définit dans le fichier métadonnée (.torrent). Les paramêtres sont alors ajoutés à l'url, en utilisant la méthode CGI standard (c'est à dire avec un '?' après l'url d'annonce, suivie par des séquences 'param=valeur' séparées par '&'). Notez que toutes les données binaires dans l'url (particulièrement info_hash et peer_id) doit être proprement échappées. Cela signifie que toutes les valeurs ne se trouvant pas dans l'ensemble 0-9,a-z,A-Z,'.','-','_' et '˜', doivent être encodées sous le format "%nn" où nn est la valeur hexadécimale de l'octet. Pour le hash de 20 octets suivant : \x12\x34\x56\x78\x9a\xbc\xde\xf1\x23\x45\x67\x89\xab\xcd\xef\x12\x34\x56\x78\x9a la forme encodée correcte sera %124Vx%9A%BC%DE%F1%23-g%89%AB%CD%EF%12%34Vx%9A. Paramêtres de Requête Tracker Les paramêtres utilisées dans les requêtes client->tracker sont les suivants :
  • info_hash : hash SHA1 de 20 octets urlencodé de la valeur de la clé info du fichier métainfo. Notez que cete valeur sera un dictionnaire bencodé, comme dis dans la définition de la clé info ci-dessus.
  • peer_id : chaine de 20 octets urlencodée et utilisée comme ID unique du client, générée par le client à son lancement. N'importe qu'elle valeur est acceptée et peut être des données binaires.
  • port : le numéro de port sur lequel le client écoute. Les ports réservés pour BitTorrent sont typiquement 6881-6889. Les clients peuvent choisir d'abandonner s'ils ne parviennent pas à écouter sur un port dans cette plage.
  • uploaded : la somme totale uploadée (depuis que le client à envoyé l'évennement 'started' au tracker) en base 10 ASCII. Bien que cela ne soit pas explicitement déclaré dans la spécification officielle, il s'agit du nombre total d'octets téléchargé.
  • left : La somme des octets que le client doit encore télécharger, encodé en base 10 ASCII.
  • compact: Indique que le client accepte une réponse compacte. La liste de peer est remplacée par une chaine de peers avec 6 octets par peers. Les 4 premiers octets représentent l'hôte (avec les octets dans l'ordre réseau), les deux derniers sont le port (là encore dans l'ordre réseau). Notez que certains trackers ne supportent que les réponses compactes (pour économiser de la bande passante) et refusent les requêtes normales.
  • no_peer_id : Indique que le tracker peut ommettre le champ peer id dans le dictionnaire de peers. Cette option est ignorée si compact est activé.
  • event : si spécifié, il doit être l'un des états started, completed ou stopped (ou vide qui revient à non spécifié). Si non spécifié, alors cette requête est faite à intervalles réguliers.
    • started : la première requête au tracker doit inclure la clé event avec cette valeur.
    • stopped : Doit être envoyé au tracker si le client s'arrête proprement.
    • completed : Doit être envoyé au tracker quand le téléchargement est complet. Cepandant, ne dois pas être envoyé si le téléchargement était déjà à 100% au lancement du client. Vraisemblablement, cela permet au tracker de garder des statistiques des téléchargements complets.
  • ip : Optionnel. La véritable adresse IP du client, dans le format standard (4 nombres décimaux de 0 à 255 séparés par des points). Ce paramêtre est utile seulement si l'adresse IP qui envoit les requêtes n'est pas la même que celle du client.
  • numwant : Optionnel. Nombre de peers que le client veut bien recevoir du tracker. Cette valaur peut être à zéro. Si omise, elle veut généralement 50 peers.
  • key: Optionnel. Une identification addtionnelle qui n'est partagée avec aucun utilsateur. Cela permet à un client de s'identifier même si son adresse IP change.
  • trackerid : Optionnel. Si l'annonce précédente contenait un tracker id, il doit être placé ici.
Utilisations alternatives Découvertes des ports NATés Une application qui a besoin de communiquer avec des machines sur Internet est souvent bloquée par un routeur/firewall. Il faut alors que l'utilisateur de la machine configure lui même son équipement afin de NATer certains ports pour que l'application soit joinable. Mais ces applications préfèrent parfois trouver une "porte" elles même pour simplifier la vie de l'utilisateur ou parce qu'elles ne veulent rester "discrètes". Pour les ports UDP, il existe le protocole STUN qui permet à une application, en effectuant une suite de communications pré-établies, de déterminer derrière quel type d'équipement elle se trouve. La première utilisation alternative de BitTorrent à laquelle j'ai pensée, c'est la détection de ports TCP NATés. Le principe est très simple : à partir d'un fichier torrent valide et partagé par un grand nombre de peer, on calcule les paramêtres nécessaires pour envoyer une requête au tracker et pour chaque port que l'on veut tester on envoie cette requête, avec comme seule modification le paramêtre port. Pour décoder les fichiers torrent, j'ai utilisé une implémentation Python qui était citée dans la spécification. L'utilisation du langage Python est d'autant plus agréable que les différents types présents dans un fichier métainfo sont les même que ceux proposés par Python (str, int, list et dict). Les paramêtres nécessaires à l'envoir d'une requête valide sont info_hash (à calculer), peer_id (aléatoire, 20 octets), compact (que nous fixerons à 1), port (à fixer nous même) ainsi que uploaded (0), downloaded (0) left (taille totale du ou des fichiers) et event (started) qui nous déclarent comme nouveau peer et permettent notre entrée dans la liste du tracker. Le plus compliqué a été le calcul du hash SHA1 du dictionnaire info bencodé... Au départ je pensais chercher un moyen de le lire directement en analysant le fichier torrent au fûr et à mesure, mais devant la difficulté j'ai préféré trouvé une autre solution en utilisant le code déjà implémenté. Pour cela j'ai rajouté des fonctions de bencodage à celles déjà présentes de bdécodage. Une fois la structure info re-bencodée, il suffisait de calculer la somme SHA1... en théorie. La spécification dit que les clés du dictionnaire info doivent être ordonnées alphabétiquement. Visiblement les logiciels qui génèrent les fichiers torrent ne l'on pas pris en compte. Mais quelque soit l'ordre des clés, le résultat dans le fichier fera toujours la même taille. J'ai donc ré-encodé le dictionnaire info, calculé sa taille, puis extrait le nombre d'octets correspondant du fichier torrent pour calculer le SHA1 smile Le calcul de la taille totale des données est assez simple. Dans le mode "fichier seul" il nous suffit de lire le champ length, sinon il faut boucler sur chaque dictionnaire files et faire des additions. Le résultat est un script torrentscan.py qui prend comme arguments le nom du fichier torrent à utiliser et la liste des ports sur lesquels écouter. Voici le résultat de deux essais, sachant que mes ports 21-25, 6666 et 6881 sont redirigés depuis mon routeur vers ma machine :
python torrentscan.py aaf.torrent 21,80,6666,6880-6884
Tracker: http://denis.stalker.h3q.com:6969/announce
Hash: %27%CD%C0%D5%D2%0A%F4%01%E3X%9C%A9%21a%EAn%F6%B7%E8%40
Total length: 368701440
Announced port 6884
Announced port 80
Error listening on port 80
(98, 'Address already in use')
Announced port 6666
Announced port 6880
Announced port 21
Announced port 6882
Announced port 6881
Announced port 6883
[6881, 6666, 21]
Ici le programme a été lancé en root. Apache occupait déjà le port 80, ce qui explique le message "Address already in use". En simple utilisateur on aurait eu un "Permission denied" pour les ports 21 et 80. Les ports accessibles de l'extérieur sont affichés à la fin.
python torrentscan.py aaf.torrent 21,24,4444-4446,6666
Tracker: http://denis.stalker.h3q.com:6969/announce
Hash: %27%CD%C0%D5%D2%0A%F4%01%E3X%9C%A9%21a%EAn%F6%B7%E8%40
Total length: 368701440
Announced port 4446
Announced port 24
Announced port 4445
Announced port 21
Announced port 4444
Announced port 6666
[21, 6666, 24]
Le programme est assez long à s'exécuter. La partie qui attend les connexions demande à être améliorée. Pour chaque port, un thread est lancé qui envoit une annonce au tracker puis se met en écoute. Les threads ont jusqu'à 10 secondes pour s'exécuter mais la getion des sockets fait dépasser ce temps (même si le programme s'arrête tout seul au boût d'un moment). Ensuite j'ai remarqué que les clients BitTorrent communiquent très peu avec le tracker. Pour un gros fichier, j'ai compté que Azureus a envoyé moins de 5 requêtes. Les clients ne cherchent pas vraiment à mettre leur liste de peers à jour. Il faut alors compter sur les peers arrivant après nous pour qu'ils nous contactent. C'est pour cela qu'il est très important d'utiliser un torrent très demandé (le torrent pour les isos d'une distribution Linux juste après sa sortie est l'idéal) Attaque par amplification Un envoyant des requêtes d'annonce sur un grand nombre de trackers pour un nombre tout aussi important de torrent très demandé et en spécifiant l'adresse IP d'une machine dans le paramêtre "ip" de la requête, on peut effectuer une attaque DDoS (déni de service distribué) par amplification (comme le célèbre Smurf psmurf ). L'attaque est dite par amplification car en effectuant une seule connexion à une seulle machine (le serveur d'un tracker), on provoque la connexion de plusieurs peers sur la victime. L'efficacité de cette attaque est liée à tout un tas de paramêtres à prendre en considération : nombre de fichiers torrent, demandes pour ces données, réaction du serveur (va t-il fermer la connexion immédiatement en voyant arriver des données malformées ? sinon combien de temps va t-il attendre ?) et du client BitTorrent (va t-il laisser au serveur le soin de fermer la communication ? combien de nouvelles tentatives va t-il faire après le premier échec) etc. Utilisation par les Botnets Un bot pourrait très bien utiliser le tracker d'un torrent anodin pour se déclarer à son "bot herder". La majorité des bots existant utilisent le protocole IRC et se connectent à un channel avec un pseudo ayant une forme caractéristique (par exemple "botXXXXXXXX" où les 'X' sont plus ou moins aléatoires). Le paramêtre "peer_id" est l'identifiant du peer et doit faire 20 octets. C'est largement suffisant pour y placer des informations qui permettront au bot herder de le reconnaitre des peers légitimes. Quand au port déclaré auprès du tracker il pourrait en fait s'agir du port d'une backdoor, port choisi par exemple parce qu'il a été découvert comme NATé en utilisant le protocole BitTorrent wink et la porte dérobée attendant des commandes, à tout hazard une attaque BitTorrent-plifiée. Je reviendrais surrement un jour sur les protocoles décentralisés, parce qu'il y a tout un tas de choses passionantes (Distributed Hash Table et compagnie smile )

Conservation des logs : décret du 24 mars 2006

, , , ...

En ce jour du dimanche 26 mars 2006, un décret du ministère de la Justice oblige dorénavant les "opérateurs de communications électroniques" à conserver des logs de nos communications.

Le decret peut être lu ici mais je vais tenter, malgré mes faibles connaissances en droit, de vous en faire une petite analyse wink

Art. R. 10-12. - Pour l'application des II et III de l'article L. 34-1, les données relatives au trafic s'entendent des informations rendues disponibles par les procédés de communication électronique, susceptibles d'être enregistrées par l'opérateur à l'occasion des communications électroniques dont il assure la transmission et qui sont pertinentes au regard des finalités poursuivies par la loi.


Faisons le point sur ces "données susceptibles d'être enregistrées par l'opérateur à l'occasion des communications électroniques dont il assure la transmission".
Parmi ces données il y a bien évidemment nos emails. Non seulement ils transitent par le biais du FAI (Fournisseur d'Accès Internet) mais en plus ils sont conservés par les serveurs POP ou IMAP de ce dernier (parce qu'il faut bien que nos emails se "posent" quelque part).
Ensuite pour savoir si nos emails sont "pertinents au regard des finalités poursuivies par la loi" c'est on ne peut plus flou (à ce point du document).

Art. R. 10-13. - I. - En application du II de l'article L. 34-1 les opérateurs de communications électroniques conservent pour les besoins de la recherche, de la constatation et de la poursuite des infractions pénales :

  1. Les informations permettant d'identifier l'utilisateur ;
  2. Les données relatives aux équipements terminaux de communication utilisés ;
  3. Les caractéristiques techniques ainsi que la date, l'horaire et la durée de chaque communication ;
  4. Les données relatives aux services complémentaires demandés ou utilisés et leurs fournisseurs ;
  5. Les données permettant d'identifier le ou les destinataires de la communication.


Les "informations permettant d'identifier l'utilisateur" sont bien évidemment votre fiche client : nom, prénom, adresse, numéro de téléphone et plus encore.
"Les données relatives aux équipements terminaux de communication utilisés" : j'avoue avoir des difficultées à comprendre la signification des "équipements terminaux". J'aurais tendance à dire qu'il s'agit soit des relais utilisés dans une communication (par exemple un routeur, voire un proxy du FAI) soit la nature du protocole utilisé dans la communication... Si c'est le cas on peut considérer que cela signifie la conservation des ports source et destination d'une communication (généralement largement suffisant pour déterminer le protocole)
De toute façon ces données doivent être comprises dans les "caractéristiques techniques" citées dans le troisième point.
Le quatrième point c'est le brouillard total mais c'est sûrement rien de bon pour nous nervous
"Les données permettant d'identifier le ou les destinataires de la communication" : à première vue les adresses ip et/ou les noms de domaines. Ca peut aller jusqu'au nom, prénom etc si le destinataire de la communication utilise le même FAI (logique).

II. - Pour les activités de téléphonie l'opérateur conserve les données mentionnées au I et, en outre, celles permettant d'identifier l'origine et la localisation de la communication.


Je crois que tout est dit bigeyes

On nous apprend ensuite que les opérateurs de communications sont autorisés à conserver d'avantage de données techniques ou de données permettant la localisation s'ils en ont besoin pour la facturation.
Ce qui nous intéresse (en temps que simple internautes) se situe dans le paragraphe suivant :

Les données mentionnées aux I et II du présent article ne peuvent être conservées que si elles sont nécessaires à la facturation et au paiement des services rendus. Leur conservation devra se limiter au temps strictement nécessaire à cette finalité sans excéder un an.


Evidemment on peut se demander qui dans l'histoire va juger de la durée nécessaire de conservation de ces données...
On nous informe ensuite que l'opérateur peut enregistrer plus de données techniques pour les communications relatives à "la sécurité des réseaux et des installations". En fait le seul point rajouté concerne les "données permettant d'identifier l'origine de la communication".

C'est évident que lors d'une enquête, si la police se rend dans les locaux d'un FAI c'est qu'elle connaît probablement déjà l'adresse IP du fraudeur. Cela lui permet ensuite d'obtenir son identité et de savoir qu'elles communications il a effectué.
La conservation de données concernant l'origine de la destination peut être utile si la police ne possède pas d'adresse IP mais à réussi à retrouver quel est le FAI du pirate. En ce qui concerne les lois relatives au téléchargement cela est plus inquiétant. A priori cela ne rentre pas dans le cadre de "la sécurité des réseaux et des installations" mais la conservation de telles données pourrait permettre à la police de prendre totalement au hazard des personnes utilisant des logiciels de P2P.

Les opérateurs de communications électroniques, et notamment les personnes dont l'activité est d'offrir un accès à des services de communication au public en ligne, effacent ou rendent anonyme toute donnée relative au trafic, sous réserve des dispositions des II, III, IV et V.
Les personnes qui, au titre d'une activité professionnelle principale ou accessoire, offrent au public une connexion permettant une communication en ligne par l'intermédiaire d'un accès au réseau, y compris à titre gratuit, sont soumises au respect des dispositions applicables aux opérateurs de communications électroniques en vertu du présent article.


Traduction : le proxy que vous utilisez ou encore la chaîne de fast-food qui vous propose gentiment un accès wifi doivent suivre les même règle qu'un FAI ou qu'un opérateur téléphonique knockout

La dernière partie du document concerne les interdictions vis-à-vis des opérateurs (utilisation de données à des fins commerciales, spam, litiges etc).
Le plus important dans cette partie est (à propos des données conservées) :

Elles ne peuvent en aucun cas porter sur le contenu des correspondances échangées ou des informations consultées, sous quelque forme que ce soit, dans le cadre de ces communications.


En même temps je vois mal un opérateur stocker sur disque le contenu des communications qui transitent chez lui ^^
Evidemment dans le cadre d'un enquête la justice peut très bien obliger l'opérateur à surveiller de près certaines communications, en particulier leur contenu p

Pour résumer : les logs sont conservés pour une durée d'un an aussi bien chez les opérateurs (internet, téléphonie) que sur les serveurs proxy ou fournisseurs de point d'accès WiFi. Vous êtes prévenus wink

Mise à jour:
Le décret sur la conservation des logs a été validé par le conseil d'état, désormais les logs sont obligatoirement conservés pour une durée d'un an.
Source : ZDNet.fr

Le site lestelechargements.com sans langue de bois

, , , ...

Si seulement le site de propagande du gouvernement nous expliquait les choses clairement de cette façon on comprendrait tout de suite où ils veulent en venir bigsmile

En tout cas moi c'est ma version préférée yes

lestelechargements

, , , ...

Pour lutter contre le site de propagande du gouvernement visant à faire passer la pilule du projet de loi DADvSI, la Ligue Odebi a lancé une opération de Google Bombing visant le site Lestelechargements (si vous tenez à visiter le vrai site, vous le trouverez tout de même par Google).

La Ligue dénonce la désinformation du Ministre blanchisseur Donnedieu, qui consiste à tenter de restreindre le débat au problème du p2p, alors que le projet de loi DADVSI a pour but premier de légaliser les dispositifs de contrôle d'usage (DCU) que certains appellent DRM, et de pénaliser leur contournement.



Odebi a bien entendu écrit un texte expliquant de manière simple les dangers du DADVSI.

Pour participer à l'opération il suffit de placer le lien suivant où vous le pouvez sur le web :
Lestelechargements, c'est ici !

L'opération a pris forme sur le forum Odebi