একটি জাভা অ্যাপ্লিকেশনটিতে দূষিত কোডের বিরুদ্ধে স্যান্ডবক্স


92

সিমুলেশন সার্ভারের পরিবেশে যেখানে ব্যবহারকারীরা তাদের নিজস্ব কোডটি সার্ভারের দ্বারা চালিত করার জন্য জমা দেওয়ার মঞ্জুরিপ্রাপ্ত সেখানে কোনও ব্যবহারকারী-জমা দেওয়া কোডটি স্যান্ডবক্সের পাশেই চালানো পক্ষে সুবিধাজনক হবে, অ্যাপলেটগুলি ব্রাউজারের বিপরীতে নয়। আমি এই জমা দেওয়া উপাদানগুলি বিচ্ছিন্ন করার জন্য অন্য ভিএম স্তর যুক্ত করার পরিবর্তে নিজেই জেভিএমকে উপস্থাপন করতে সক্ষম হতে চাই।

বিদ্যমান জাভা স্যান্ডবক্স মডেলটি ব্যবহার করে এই ধরণের সীমাবদ্ধতা পাওয়া সম্ভব বলে মনে হচ্ছে, তবে চলমান অ্যাপ্লিকেশনটির কেবলমাত্র ব্যবহারকারী-জমা দেওয়া অংশগুলির জন্য এটি সক্ষম করার কোনও গতিশীল উপায় আছে?

উত্তর:


110
  1. নিজের থ্রেডে অবিশ্বস্ত কোড চালান Run উদাহরণস্বরূপ এটি অসীম লুপগুলি এবং এ জাতীয় সমস্যাগুলি প্রতিরোধ করে এবং ভবিষ্যতের পদক্ষেপগুলি আরও সহজ করে তোলে। মূল থ্রেডটি থ্রেডটি শেষ হওয়ার জন্য অপেক্ষা করুন এবং যদি খুব বেশি সময় লাগে তবে এটি থ্রেড.স্টপ দিয়ে হত্যা করুন। থ্রেড.স্টপকে অবমূল্যায়ন করা হয়েছে, তবে যেহেতু অবিশ্বস্ত কোডটির কোনও সংস্থান ব্যবহারের অ্যাক্সেস থাকা উচিত নয়, এটি এটি হত্যা করা নিরাপদ।

  2. সেই থ্রেডে সিকিউরিটি ম্যানেজার সেট করুন । সিকিউরিটি ম্যানেজারের একটি সাবক্লাস তৈরি করুন যা কয়েকটি বাছাই করা ব্যতীত সমস্ত অনুমতিগুলির জন্য সিকিউরিটিএক্সসেপশন কেবল ছুঁড়ে ফেলতে চেকপিরমিশন (পার্মিশন পারমি) ওভাররাইড করে। তাদের এখানে প্রয়োজনীয় পদ্ধতি এবং অনুমতিগুলির একটি তালিকা রয়েছে: জাভা টিএম 6 এসডিকে অনুমতি

  3. অবিশ্বস্ত কোড লোড করতে একটি কাস্টম ClassLoader ব্যবহার করুন। অবিশ্বস্ত কোড ব্যবহার করে এমন সমস্ত ক্লাসের জন্য আপনার ক্লাস লোডারকে ডাকা হবে, যাতে আপনি পৃথক জেডিকে ক্লাসে অ্যাক্সেস অক্ষম করার মতো কাজ করতে পারেন। করণীয় হ'ল অনুমোদিত জেডিকে ক্লাসগুলির একটি সাদা তালিকা রয়েছে।

  4. আপনি অবিশ্বস্ত কোডটি আলাদা জেভিএমে চালাতে চাইতে পারেন। পূর্ববর্তী পদক্ষেপগুলি কোডটি সুরক্ষিত করে তুলবে, বিচ্ছিন্ন কোডটি এখনও করতে পারে এমন একটি বিরক্তিকর জিনিস রয়েছে: যতটা সম্ভব মেমরি বরাদ্দ করুন, যার ফলে মূল অ্যাপ্লিকেশনটির দৃশ্যমান পদচিহ্ন বৃদ্ধি পেতে পারে।

জেএসআর 121: অ্যাপ্লিকেশন আইসোলেশন এপিআই স্পেসিফিকেশন এটি সমাধানের জন্য তৈরি করা হয়েছিল, তবে দুর্ভাগ্যক্রমে এটির এখনও কোনও বাস্তবায়ন হয়নি।

এটি একটি সুন্দর বিস্তারিত বিষয়, এবং আমি বেশিরভাগই আমার মাথার উপরের অংশে এই সমস্ত লিখছি।

তবে যাইহোক, কিছু অসম্পূর্ণ, নিজের-নিজের ঝুঁকিতে ব্যবহার, সম্ভবত বগি (সিউডো) কোড:

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
  }
}

নিরাপত্তা ব্যবস্থাপক

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
}

থ্রেড

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) {}
  }
}

4
এই কোডটিতে কিছু কাজের প্রয়োজন হতে পারে। আপনি সত্যিই JVM প্রাপ্যতা রক্ষা করতে পারবেন না। প্রক্রিয়াটি হত্যা করার জন্য প্রস্তুত থাকুন (সম্ভবত স্বয়ংক্রিয়ভাবে)। কোডটি অন্য থ্রেডে উঠুন - উদাহরণস্বরূপ চূড়ান্ত থ্রেড। Thread.stopজাভা লাইব্রেরি কোডে সমস্যা সৃষ্টি করবে। একইভাবে, জাভা লাইব্রেরি কোডের অনুমতি প্রয়োজন হবে। SecurityManagerব্যবহার করার অনুমতি দেওয়ার চেয়ে আরও ভাল java.security.AccessController। ক্লাস লোডার সম্ভবত ব্যবহারকারী কোডের নিজস্ব ক্লাসে অ্যাক্সেসের অনুমতি দেওয়া উচিত।
টম হাটিন -

4
এটি এত জটিল বিষয় প্রদত্ত যে, জাভা "প্লাগইনগুলি" নিরাপদ উপায়ে পরিচালনা করার জন্য কি কোনও সমাধান নেই?
নিক স্পেস্ক

10
এই পদ্ধতির সমস্যা হ'ল আপনি যখন সিকিউরিটি ম্যানেজারটিকে সিস্টেমে সেট করেন, এটি কেবল চলমান থ্রেডকেই প্রভাবিত করে না, তবে অন্যান্য থ্রেডকেও প্রভাবিত করে!
জেলিন লুও

4
দুঃখিত তবে থ্রেড.স্টপ () ছোঁড়া যায়। আপনি যখন (থ্রেড.আইএসএলাইভ) থ্রেড.স্টপ () করতে পারেন তবে তারপরে আমি একটি ফাংশন কল করতে পুনরাবৃত্তি করতে পারি যা ব্যতিক্রমটিকে ধরা দেয়। আমার পিসিতে পরীক্ষিত, পুনরাবৃত্ত ফাংশনটি স্টপ () এ জয়ী হয়। এখন আপনার কাছে একটি আবর্জনা সূতা রয়েছে, সিপিইউ এবং সংস্থানগুলি চুরি করছে
Lesto

9
System.setSecurityManager(…)পুরো জেভিএমকে প্রভাবিত করবে এই বিষয়টি ছাড়াও , কেবল সেই পদ্ধতিটিই সূচিত করে থ্রেডই নয়, জাভা ১.০ থেকে ১.১ এ পরিবর্তন করা হলে থ্রেডের ভিত্তিতে সুরক্ষা সিদ্ধান্ত নেওয়ার ধারণাটি পরিত্যাগ করা হয়েছে। এই সময় এটি স্বীকৃত ছিল যে অবিশ্বস্ত কোড বিশ্বাসযোগ্য কোড এবং তার বিপরীতে, যে থ্রেড কোডটি কার্যকর করে তা নির্বিশেষে আবেদন করতে পারে। কোনও বিকাশকারীকে ভুলটির পুনরাবৃত্তি করা উচিত নয়।
হলগার

18

স্পষ্টতই এই জাতীয় স্কিম সমস্ত ধরণের সুরক্ষা উদ্বেগ উত্থাপন করে। জাভাতে কঠোর সুরক্ষার কাঠামো রয়েছে তবে এটি তুচ্ছ নয়। এটিকে ত্রুটিযুক্ত করার এবং একটি অনিবদ্ধ ব্যবহারকারীকে অ্যাক্সেসের অত্যাবশ্যক সিস্টেমের উপাদানগুলিতে প্রবেশের সম্ভাবনাটি এড়িয়ে যাওয়া উচিত নয়।

এই সতর্কতাটি একদিকে রেখে, যদি আপনি উত্স কোড আকারে ব্যবহারকারী ইনপুট নিচ্ছেন তবে আপনাকে প্রথমে যা করতে হবে তা তা জাভা বাইটকোডে সংকলন করা। আফিক, এটি স্থানীয়ভাবে করা যাবে না, সুতরাং আপনাকে জাভ্যাকের জন্য একটি সিস্টেম কল করতে হবে এবং ডিস্কের বাইটকোডে উত্স কোডটি সংকলন করতে হবে। এখানে একটি টিউটোরিয়াল যা এর সূচনা পয়েন্ট হিসাবে ব্যবহার করা যেতে পারে। সম্পাদনা করুন : আমি মন্তব্যগুলিতে যেমন শিখেছি, আপনি আসলে জাভাক্স.টুলস ব্যবহার করে উত্স থেকে জাভা কোডটি সংকলন করতে পারেন ava জাভা কম্পাইলার

আপনার কাছে একবার জেভিএম বাইটকোড হয়ে গেলে, আপনি এটি ক্লাসলুডারের ডিফাইনক্লাস ফাংশনটি ব্যবহার করে জেভিএম এ লোড করতে পারেন । এই বোঝা শ্রেণীর জন্য সুরক্ষা প্রসঙ্গ সেট করতে আপনাকে একটি প্রোটেকশনডোমাইন নির্দিষ্ট করতে হবে । প্রোটেকশনডোমেনের জন্য সর্বনিম্ন নির্মাণকারীর জন্য কোডসোর্স এবং একটি অনুমতি সংকলন উভয়ই প্রয়োজন । পারমিশন সংগ্রহটি আপনার কাছে এখানে প্রাথমিক ব্যবহারের অবজেক্ট-আপনি লোড শ্রেণীর সঠিক অনুমতি নির্ধারণ করতে এটি ব্যবহার করতে পারেন। এই অনুমতিগুলি শেষ পর্যন্ত জেভিএম এর অ্যাক্সেস নিয়ন্ত্রণকারী দ্বারা প্রয়োগ করা উচিত ।

এখানে প্রচুর ত্রুটির সম্ভাব্য পয়েন্ট রয়েছে এবং কোনও কিছু প্রয়োগের আগে আপনাকে সমস্ত কিছু বোঝার জন্য অত্যন্ত সতর্ক হওয়া উচিত।


4
JDK 6 এর জাভ্যাক্স.টুলস এপিআই ব্যবহার করে জাভা সংকলনটি বেশ সহজ।
অ্যালান ক্রুয়েগার

10

জাভা স্যান্ডবক্স অনুমতি সীমিত সেট দিয়ে জাভা কোড নির্বাহ জন্য একটি লাইব্রেরী। এটি কেবলমাত্র সাদা-তালিকাভুক্ত শ্রেণি এবং সংস্থানগুলির একটি সেট অ্যাক্সেসের অনুমতি দেওয়ার জন্য ব্যবহার করা যেতে পারে। এটি পৃথক পদ্ধতিতে অ্যাক্সেসকে সীমাবদ্ধ রাখতে সক্ষম বলে মনে হচ্ছে না। এটি অর্জনের জন্য এটি একটি কাস্টম শ্রেণীর লোডার এবং সুরক্ষা ব্যবস্থাপক সহ একটি সিস্টেম ব্যবহার করে।

আমি এটি ব্যবহার করি নি তবে এটি দেখতে সুন্দরভাবে ডিজাইন করা হয়েছে এবং যুক্তিসঙ্গতভাবে ভাল নথিভুক্ত রয়েছে।

কীভাবে নিজেকে বাস্তবায়ন করা সম্ভব তা ব্যাখ্যা করে ওয়াকাস একটি অত্যন্ত আকর্ষণীয় উত্তর দিয়েছেন given তবে বিশেষজ্ঞদের কাছে এই জাতীয় সুরক্ষা সমালোচনা এবং জটিল কোড রেখে যাওয়া অনেক বেশি নিরাপদ।

লক্ষ্য করুন যে ২০১৩ সাল থেকে প্রকল্পটি আপডেট হয়নি এবং নির্মাতারা এটিকে "পরীক্ষামূলক" হিসাবে বর্ণনা করেন। এর হোম পৃষ্ঠাটি অদৃশ্য হয়ে গেছে তবে সোর্স ফোর্স এন্ট্রি রয়ে গেছে।

প্রকল্পের ওয়েবসাইট থেকে অভিযোজিত উদাহরণ কোড:

SandboxService sandboxService = SandboxServiceImpl.getInstance();

// Configure context 
SandboxContext context = new SandboxContext();
context.addClassForApplicationLoader(getClass().getName());
context.addClassPermission(AccessType.PERMIT, "java.lang.System");

// Whithout this line we get a SandboxException when touching System.out
context.addClassPermission(AccessType.PERMIT, "java.io.PrintStream");

String someValue = "Input value";

class TestEnvironment implements SandboxedEnvironment<String> {
    @Override
    public String execute() throws Exception {
        // This is untrusted code
        System.out.println(someValue);
        return "Output value";
    }
};

// Run code in sandbox. Pass arguments to generated constructor in TestEnvironment.
SandboxedCallResult<String> result = sandboxService.runSandboxed(TestEnvironment.class, 
    context, this, someValue);

System.out.println(result.get());

4

গৃহীত উত্তরে সমস্যার সমাধানের জন্য যার মাধ্যমে কাস্টমটি SecurityManagerপ্রতিটি থ্রেডের ভিত্তিতে না হয়ে JVM- র সমস্ত থ্রেডের জন্য প্রযোজ্য হবে, আপনি একটি কাস্টম তৈরি করতে পারেন SecurityManagerযা নির্দিষ্ট থ্রেডের জন্য সক্ষম / অক্ষম করা যেতে পারে:

import java.security.Permission;

public class SelectiveSecurityManager extends SecurityManager {

  private static final ToggleSecurityManagerPermission TOGGLE_PERMISSION = new ToggleSecurityManagerPermission();

  ThreadLocal<Boolean> enabledFlag = null;

  public SelectiveSecurityManager(final boolean enabledByDefault) {

    enabledFlag = new ThreadLocal<Boolean>() {

      @Override
      protected Boolean initialValue() {
        return enabledByDefault;
      }

      @Override
      public void set(Boolean value) {
        SecurityManager securityManager = System.getSecurityManager();
        if (securityManager != null) {
          securityManager.checkPermission(TOGGLE_PERMISSION);
        }
        super.set(value);
      }
    };
  }

  @Override
  public void checkPermission(Permission permission) {
    if (shouldCheck(permission)) {
      super.checkPermission(permission);
    }
  }

  @Override
  public void checkPermission(Permission permission, Object context) {
    if (shouldCheck(permission)) {
      super.checkPermission(permission, context);
    }
  }

  private boolean shouldCheck(Permission permission) {
    return isEnabled() || permission instanceof ToggleSecurityManagerPermission;
  }

  public void enable() {
    enabledFlag.set(true);
  }

  public void disable() {
    enabledFlag.set(false);
  }

  public boolean isEnabled() {
    return enabledFlag.get();
  }

}

ToggleSecurirtyManagerPermissionjava.security.Permissionকেবল অনুমোদিত কোডই সুরক্ষা পরিচালককে সক্ষম / অক্ষম করতে পারে তা নিশ্চিত করার জন্য এটি কেবল একটি সাধারণ বাস্তবায়ন । দেখে মনে হচ্ছে:

import java.security.Permission;

public class ToggleSecurityManagerPermission extends Permission {

  private static final long serialVersionUID = 4812713037565136922L;
  private static final String NAME = "ToggleSecurityManagerPermission";

  public ToggleSecurityManagerPermission() {
    super(NAME);
  }

  @Override
  public boolean implies(Permission permission) {
    return this.equals(permission);
  }

  @Override
  public boolean equals(Object obj) {
    if (obj instanceof ToggleSecurityManagerPermission) {
      return true;
    }
    return false;
  }

  @Override
  public int hashCode() {
    return NAME.hashCode();
  }

  @Override
  public String getActions() {
    return "";
  }

}

4
: আপনার (নিজের) উৎসনির্দেশ alphaloop.blogspot.com/2014/08/... এবং github.com/alphaloop/selective-security-manager
জিৎসেমার

সিস্টেম-স্কোপড সিকিউরিটি ম্যানেজারগুলি কার্যকরভাবে থ্রেড-স্কোপড (যা বেশিরভাগ ব্যবহারকারীরা চাইবেন) তৈরি করতে থ্রেডলোকালের খুব স্মার্ট ব্যবহার। অবিশ্বাস্য কোড দ্বারা উত্পন্ন থ্রেডগুলিতে অস্বীকৃত সম্পত্তিটি স্বয়ংক্রিয়ভাবে প্রেরণ করার জন্য InheritableThreadLocal ব্যবহার বিবেচনা করুন।
নিক

4

ভাল কোন পরামর্শ বা সমাধান দিতে দেরি হয়ে গেছে, তবুও আমি একই ধরণের ইস্যু, এক ধরণের আরও গবেষণা কেন্দ্রিক মুখোমুখি হয়েছি। মূলত আমি ই-লার্নিং প্ল্যাটফর্মগুলিতে জাভা কোর্সের জন্য প্রোগ্রামিং কার্যের জন্য একটি বিধান এবং স্বয়ংক্রিয় মূল্যায়ন সরবরাহ করার চেষ্টা করছিলাম।

  1. একটি উপায় হতে পারে, একটি পৃথক ভার্চুয়াল মেশিন তৈরি করুন (জেভিএম নয়) তবে প্রতিটি শিক্ষার্থীর জন্য ন্যূনতম কনফিগারেশন সম্ভব ওএস সহ প্রকৃত ভার্চুয়াল মেশিন।
  2. আপনার প্রোগ্রামিং ভাষা অনুযায়ী জাভা বা লাইব্রেরিগুলির জন্য জেআরই ইনস্টল করুন, আপনি যে কোনও শিক্ষার্থী এই মেশিনগুলিতে সংকলন করতে এবং চালনা করতে চান।

আমি জানি এটি বেশ জটিল এবং প্রচুর কাজগুলি শোনায় তবে ওরাকল ভার্চুয়াল বাক্সটি ইতিমধ্যে জাভা API কে গতিশীলভাবে ভার্চুয়াল মেশিনগুলি তৈরি বা ক্লোন করতে সরবরাহ করে। https://www.virtualbox.org/sdkref/index.html (দ্রষ্টব্য, এমনকি ভিএমওয়্যার এছাড়াও এপিআই সরবরাহ করে)

এবং সর্বনিম্ন আকার এবং কনফিগারেশন লিনাক্স বিতরণের জন্য আপনি এখানে http://www.slitaz.org/en/ উল্লেখ করতে পারেন ,

সুতরাং এখন যদি শিক্ষার্থীরা গোলযোগ বা এটির চেষ্টা করে তবে মেমরি বা ফাইল সিস্টেম বা নেটওয়ার্কিং, সকেট সহ থাকতে পারে, সর্বাধিক সে তার নিজের ভিএম ক্ষতি করতে পারে।

অভ্যন্তরীণভাবে এই ভিএম এর মধ্যে আপনি জাভা বা লিনাক্সে ব্যবহারকারীদের নির্দিষ্ট অ্যাকাউন্ট তৈরি করতে এবং যেমন অ্যাক্সেসকে সীমাবদ্ধ করার জন্য অতিরিক্ত সুরক্ষা সরবরাহ করতে পারেন Sand

আশাকরি এটা সাহায্য করবে !!


3

সমস্যার একটি থ্রেড-নিরাপদ সমাধান এখানে:

https://svn.code.sf.net/p/loggifier/code/trunk/de.unkrig.commons.lang/src/de/unkrig/commons/lang/security/Sandbox.java

package de.unkrig.commons.lang.security;

import java.security.AccessControlContext;
import java.security.Permission;
import java.security.Permissions;
import java.security.ProtectionDomain;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.WeakHashMap;

import de.unkrig.commons.nullanalysis.Nullable;

/**
 * This class establishes a security manager that confines the permissions for code executed through specific classes,
 * which may be specified by class, class name and/or class loader.
 * <p>
 * To 'execute through a class' means that the execution stack includes the class. E.g., if a method of class {@code A}
 * invokes a method of class {@code B}, which then invokes a method of class {@code C}, and all three classes were
 * previously {@link #confine(Class, Permissions) confined}, then for all actions that are executed by class {@code C}
 * the <i>intersection</i> of the three {@link Permissions} apply.
 * <p>
 * Once the permissions for a class, class name or class loader are confined, they cannot be changed; this prevents any
 * attempts (e.g. of the confined class itself) to release the confinement.
 * <p>
 * Code example:
 * <pre>
 *  Runnable unprivileged = new Runnable() {
 *      public void run() {
 *          System.getProperty("user.dir");
 *      }
 *  };
 *
 *  // Run without confinement.
 *  unprivileged.run(); // Works fine.
 *
 *  // Set the most strict permissions.
 *  Sandbox.confine(unprivileged.getClass(), new Permissions());
 *  unprivileged.run(); // Throws a SecurityException.
 *
 *  // Attempt to change the permissions.
 *  {
 *      Permissions permissions = new Permissions();
 *      permissions.add(new AllPermission());
 *      Sandbox.confine(unprivileged.getClass(), permissions); // Throws a SecurityException.
 *  }
 *  unprivileged.run();
 * </pre>
 */
public final
class Sandbox {

    private Sandbox() {}

    private static final Map<Class<?>, AccessControlContext>
    CHECKED_CLASSES = Collections.synchronizedMap(new WeakHashMap<Class<?>, AccessControlContext>());

    private static final Map<String, AccessControlContext>
    CHECKED_CLASS_NAMES = Collections.synchronizedMap(new HashMap<String, AccessControlContext>());

    private static final Map<ClassLoader, AccessControlContext>
    CHECKED_CLASS_LOADERS = Collections.synchronizedMap(new WeakHashMap<ClassLoader, AccessControlContext>());

    static {

        // Install our custom security manager.
        if (System.getSecurityManager() != null) {
            throw new ExceptionInInitializerError("There's already a security manager set");
        }
        System.setSecurityManager(new SecurityManager() {

            @Override public void
            checkPermission(@Nullable Permission perm) {
                assert perm != null;

                for (Class<?> clasS : this.getClassContext()) {

                    // Check if an ACC was set for the class.
                    {
                        AccessControlContext acc = Sandbox.CHECKED_CLASSES.get(clasS);
                        if (acc != null) acc.checkPermission(perm);
                    }

                    // Check if an ACC was set for the class name.
                    {
                        AccessControlContext acc = Sandbox.CHECKED_CLASS_NAMES.get(clasS.getName());
                        if (acc != null) acc.checkPermission(perm);
                    }

                    // Check if an ACC was set for the class loader.
                    {
                        AccessControlContext acc = Sandbox.CHECKED_CLASS_LOADERS.get(clasS.getClassLoader());
                        if (acc != null) acc.checkPermission(perm);
                    }
                }
            }
        });
    }

    // --------------------------

    /**
     * All future actions that are executed through the given {@code clasS} will be checked against the given {@code
     * accessControlContext}.
     *
     * @throws SecurityException Permissions are already confined for the {@code clasS}
     */
    public static void
    confine(Class<?> clasS, AccessControlContext accessControlContext) {

        if (Sandbox.CHECKED_CLASSES.containsKey(clasS)) {
            throw new SecurityException("Attempt to change the access control context for '" + clasS + "'");
        }

        Sandbox.CHECKED_CLASSES.put(clasS, accessControlContext);
    }

    /**
     * All future actions that are executed through the given {@code clasS} will be checked against the given {@code
     * protectionDomain}.
     *
     * @throws SecurityException Permissions are already confined for the {@code clasS}
     */
    public static void
    confine(Class<?> clasS, ProtectionDomain protectionDomain) {
        Sandbox.confine(
            clasS,
            new AccessControlContext(new ProtectionDomain[] { protectionDomain })
        );
    }

    /**
     * All future actions that are executed through the given {@code clasS} will be checked against the given {@code
     * permissions}.
     *
     * @throws SecurityException Permissions are already confined for the {@code clasS}
     */
    public static void
    confine(Class<?> clasS, Permissions permissions) {
        Sandbox.confine(clasS, new ProtectionDomain(null, permissions));
    }

    // Code for 'CHECKED_CLASS_NAMES' and 'CHECKED_CLASS_LOADERS' omitted here.

}

অনুগ্রহ করে মন্তব্য করুন!

সিইউ

আরনো


0

আপনার সম্ভবত একটি কাস্টম সিকিউরিটি ম্যানেজার এবং / অথবা অ্যাক্সেস কনট্রোলার ব্যবহার করতে হবে । প্রচুর বিশদের জন্য, জাভা সুরক্ষা আর্কিটেকচার এবং সূর্যের অন্যান্য সুরক্ষা নথি দেখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.