2013-09-24 2 views
3

Ce problème m'a fait me gratter la tête pendant quelques jours maintenant. Pour les sites sur un certain réseau (qui se trouve être un fournisseur de migration DDOS), les appels checkConnect de gestion de la sécurité semblent prendre très, très longtemps par rapport à d'autres sites.Java Security Manager SocketPermission très lente résolution, connectez

Est-il possible que les sites de ce réseau puissent analyser les contrôles d'accès du responsable de la sécurité? Y a-t-il une configuration que je ne connais pas? Est-ce que je vais (plus) fou?

Voici un test qui démontre ...

package com.test; 

import java.net.Socket; 
import java.util.ArrayList; 
import java.util.List; 

public class SSCCE 
{ 

static class StatCounter 
{ 
    boolean security; 
    String host; 
    long avg; 
    long total; 
    int iterations; 

    StatCounter(String host) 
    { 
     this.host = host; 
    } 

    @Override 
    public String toString() 
    { 
     return host + "\t\titerations (" + iterations + ")\t\tavg (" + avg + ")\t\tsecurity (" + security + ")"; 
    } 

    void inc(long time) 
    { 
     ++iterations; 
     total += time; 
    } 

    void avg() 
    { 
     avg = total/(long)iterations; 
    } 

    void reset() 
    { 
     total = 0; 
     iterations = 0; 
    } 
} 

static String[] hosts = new String[] 
{ 
    "google.com", 
    "youtube.com", 
    "oracle.com", 
    "random.org", 
    "phpbb.com", 
    "staminus.net", 

    // MUCH Higher Latency with site below (only with security manager enabled?) 
    "blacklotus.net" 
}; 

public static void main(String[] argv) throws Throwable 
{ 
    int iterations = Integer.parseInt(argv[0]); 
    List<StatCounter> counters = new ArrayList<StatCounter>(hosts.length); 
    for(String host : hosts) 
    { 
     counters.add(new StatCounter(host)); 
    } 
    System.out.println("Running Without Security"); 
    for(int i = 0; i < iterations; ++i) 
    { 
     for(StatCounter counter : counters) 
     { 
      long then = System.currentTimeMillis(); 
      new Socket(counter.host, 80).close(); 
      counter.inc(System.currentTimeMillis() - then); 
     } 
    } 
    for(StatCounter counter : counters) 
    { 
     counter.avg(); 
     System.out.println(counter); 
     counter.reset(); 
     counter.security = true; 
    } 
    System.setProperty("java.security.policy", "sscce.policy"); 
    System.setSecurityManager(new SecurityManager()); 

    System.out.println("\n\nRunning With Security"); 

    for(int i = 0; i < iterations; ++i) 
    { 
     for(StatCounter counter : counters) 
     { 
      long then = System.currentTimeMillis(); 
      new Socket(counter.host, 80).close(); 
      counter.inc(System.currentTimeMillis() - then); 
     } 
    } 

    for(StatCounter counter : counters) 
    { 
     counter.avg(); 
     System.out.println(counter); 
    } 

} 
} 

Fichier politique

grant 
{ 
permission java.net.SocketPermission "google.com:80", "connect"; 
permission java.net.SocketPermission "youtube.com:80", "connect"; 
permission java.net.SocketPermission "oracle.com:80", "connect"; 
permission java.net.SocketPermission "random.org:80", "connect"; 
permission java.net.SocketPermission "phpbb.com:80", "connect"; 
permission java.net.SocketPermission "staminus.net:80", "connect"; 
permission java.net.SocketPermission "blacklotus.net:80", "connect"; 
}; 

Exécuter avec java com.test.SSCCE

Résultat

Running Without Security 
google.com  iterations (4)  avg (65)  security (false) 
youtube.com  iterations (4)  avg (61)  security (false) 
oracle.com  iterations (4)  avg (104)  security (false) 
random.org  iterations (4)  avg (101)  security (false) 
phpbb.com  iterations (4)  avg (143)  security (false) 
staminus.net  iterations (4)  avg (137)  security (false) 
blacklotus.net  iterations (4)  avg (137)  security (false) 


Running With Security 
google.com  iterations (4)  avg (261)  security (true) 
youtube.com  iterations (4)  avg (64)  security (true) 
oracle.com  iterations (4)  avg (103)  security (true) 
random.org  iterations (4)  avg (100)  security (true) 
phpbb.com  iterations (4)  avg (882)  security (true) 
staminus.net  iterations (4)  avg (303)  security (true) 
blacklotus.net  iterations (4)  avg (4669)  security (true) 

J'apprécierais vraiment toute contribution, merci.

Pour autant que je peux voir, tout semble bon (sauf pour ce qui est apparemment la latence du réseau!)

+0

Pouvez-vous ramasser votre journal des erreurs? Je pense que le code est correct – PengWu

+0

Il n'y a pas d'erreurs. Les connexions sont en cours, mais avec blacklotus.net, il y a une augmentation de la latence d'au moins un facteur 4 (mais UNIQUEMENT avec un gestionnaire de sécurité installé). Si vous le souhaitez, exécutez l'exemple et confirmez que mes données peuvent être répliquées. Merci –

Répondre

3

I » Enfin, nous avons découvert la cause première de ce phénomène en procédant au reverse engineering des bibliothèques système JRE avec des informations de débogage supplémentaires. Je suis en mesure de retracer la cause du retard jusqu'à la méthode native

java.net.Inet4AddressImpl.getHostByAddr([B)Ljava.lang.String 

Il se trouve résoudre l'hôte en question de son adresse IP échoue pour une raison inconnue et après dépassement de délai, la méthode d'appel tente une autre voie pour renvoyer un nom d'hôte valide. J'ai vérifié cela avec plusieurs outils de recherche inversée basés sur le Web et il semble qu'il y a probablement un problème avec blacklotus.net (ou peut-être une fonctionnalité pour empêcher les recherches inversées?)

J'espère que cela aide quelqu'un d'autre qui rencontre un cas impair-ball comme ça. T-moins 36 heures, cas fermé.