SORU
2 ŞUBAT 2009, PAZARTESİ


Bir Java uygulaması olarak zararlı kodlara karşı sanal

Bir simülasyon sunucu ortamında kullanıcıların izin verilir gönder kendi kod çalıştırmak için sunucu olacağını açıkça avantajlı olmak için herhangi bir kullanıcı tarafından gönderilen bir kod çalıştırılabilir tarafı bir kum değil, aksine Uygulamaları içinde bir tarayıcı. JVM kendisi kaldıraç mümkün, başka bir VM katman bu gönderilen bileşenleri izole etmek için eklemek yerine olmak istedim.

Sınırlama bu tür Olası varolan Java sanal modeli kullanarak görünüyor, ama dinamik bir şekilde sadece bunu etkinleştirmek için gönderilen kullanıcı çalışan bir uygulama bölümleri?

CEVAP
2 ŞUBAT 2009, PAZARTESİ


  1. Kendi iş parçacığı güvenilmeyen kodu çalıştırın. Bunun için örnek problemler sonsuz döngü ile ve bu tür engeller ve daha kolay gelecek adımları yapar. Ana iş parçacığı için iş parçacığı bitirmek için beklemek zorunda, ve eğer çok uzun sürerse, konu ile öldürün.dur. İplik.dur önerilmiyor, ama güvenilmeyen kodu herhangi bir kaynağa erişimi olması gerekmiyor beri, onu öldürmek için güvenli olacaktır.

  2. Bu iş Parçacığı üzerinde SecurityManager bir Set. checkPermission(Permission perm) sadece seçilmiş birkaç kişi dışında tüm izinleri SecurityException atmak için geçersiz kılan SecurityManager bir alt sınıfı oluşturmak. Yöntem ve burada gerekli izinleri listesi var: Permissions in the JavaTM 6 SDK.

  3. Özel bir ClassLoader güvenilmeyen kodu yüklemek için kullanın. Sınıf yükleyici güvenilmeyen kodu kullanan tüm sınıflar için adlı, tek tek İLGİLENİYORUZ sınıflar erişimi devre dışı gibi şeyler yapabilirsiniz. Yapılması gereken şey beyaz liste izin İLGİLENİYORUZ sınıfları var.

  4. Ayrı bir JVM güvenilmeyen kod çalıştırmak isteyebilirsiniz. Süre önceki adımları yapardı kodu güvenli, orada rahatsız edici bir şey izole kod olabilir hala: ayırmak kadar bellek olarak, hangi neden görünür ayak izinin başlıca kullanım büyür.

JSR 121: Application Isolation API Specification bunu çözmek için tasarlanmış, ama ne yazık ki bir uygulama henüz yok.

Bu çok detaylı bir konudur, ve çoğunlukla kafamın üst kapalı yazıyorum.

Ama yine de, biraz eksik, kullan--your-kendi-risk, muhtemelen buggy (pseudo) kod:

ClassLoader

class MyClassLoader extends ClassLoader {
  @Override
  public Class<?> loadClass(String name) throws ClassNotFoundException {
    if (name is white-listed JDK class) return super.loadClass(name);
    return findClass(name);
  }
  @Override
  public Class findClass(String name) {
    byte[] b = loadClassData(name);
    return defineClass(name, b, 0, b.length);
  }
  private byte[] loadClassData(String name) {
    // load the untrusted class data here
  }
}

SecurityManager

class MySecurityManager extends SecurityManager {
  private Object secret;
  public MySecurityManager(Object pass) { secret = pass; }
  private void disable(Object pass) {
    if (pass == secret) secret = null;
  }
  // ... override checkXXX method(s) here.
  // Always allow them to succeed when secret==null
}

İplik

class MyIsolatedThread extends Thread {
  private Object pass = new Object();
  private MyClassLoader loader = new MyClassLoader();
  private MySecurityManager sm = new MySecurityManager(pass);
  public void run() {
    SecurityManager old = System.getSecurityManager();
    System.setSecurityManager(sm);
    runUntrustedCode();
    sm.disable(pass);
    System.setSecurityManager(old);
  }
  private void runUntrustedCode() {
    try {
      // run the custom class's main method for example:
      loader.loadClass("customclassname")
        .getMethod("main", String[].class)
        .invoke(null, new Object[]{...});
    } catch (Throwable t) {}
  }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bogdan Gabriel

    Bogdan Gabri

    5 Aralık 2006
  • Engadget

    Engadget

    18 EYLÜL 2006
  • RinconDynamic

    RinconDynami

    1 EKİM 2011