آسیب پذیری تزریق کد

تزریق کد معمولا زمانی اتفاق می افتد که ورودی های نامطمعن و بدون اعتبار سنجی مستقیما در برنامه اجرا شود. یکی از منابع بالقوه ی آسیب پذیریِ تزریق کد استفاده از جاوا اسکریپت در کد جاوا است. بسته javax.script شامل اینترفیس ها و کلاس هایی است که موتورهای اسکریپت جاوا را تعریف می کنند و چارچوبی برای استفاده از آن در کد جاوا است.

مهاجم با سوء استفاده از api این پکیج قادر به اجرای کد های مخرب در سیستم هدف است. این تقریبا مثل SQL injection است.

مثال :

این متد یک رشته به عنوان نام کاربر دریافت و نتیجه را در خروجی چاپ میکند:


private static void evalScript(String firstName) throws ScriptException {
  ScriptEngineManager manager = new ScriptEngineManager();
  ScriptEngine engine = manager.getEngineByName("javascript");
  engine.eval("print('"+ firstName + "')");
}

یک مهاجم می تواند یک نمونه ی مخرب از کد را به عنوان آرگومان به این متد تزریق کند، و مثلا اگر این کد جاوا اسکریپت را به متد evalScript بدهیم ابتدا “dummy” چاپ میشود و بعد در فایل تنظیمات فرضی عبارت “some text” رو نوشته خواهد شد…


dummy\');
var bw = new JavaImporter(java.io.BufferedWriter);
var fw = new JavaImporter(java.io.FileWriter);
with(fw) with(bw) {
   bwr = new BufferedWriter(new FileWriter(\"config.cfg\"));
   bwr.write(\"some text\"); bwr.close();
}
// ;

روش های مقابله:

۱- لیست سفید (Whitelisting):

بهترین روش برای مقابله با این آسیب پذیری استفاده از لیست سفید کاراکتر های مجاز است. کافیه قبل از اجرا بررسی بشه که  کاراکتر غیر مجازی در رشته وجود نداشته باشد:


private static void evalScript(String firstName) throws ScriptException {
  // Allow only alphanumeric and underscore chars in firstName
  // (modify if firstName may also include special characters)
  if (!firstName.matches("[\\w]*")) {
    // String does not match whitelisted characters
    throw new IllegalArgumentException();
  }
 
  ScriptEngineManager manager = new ScriptEngineManager();
  ScriptEngine engine = manager.getEngineByName("javascript");
  engine.eval("print('"+ firstName + "')");
}

۲- جعبه شنی امن (Secure Sandbox):

یک روش جایگزین استفاده از مدیر امنیت (security manager ) برای ایجاد یک جعبه شنی امن است. برنامه باید از اجرای دستورات دلخواه توسط اسکریپت مانند پرس و جو از سیستم فایل محلی جلوگیری کند.


class ACC {
  private static class RestrictedAccessControlContext {
    private static final AccessControlContext INSTANCE;
   
    static {
      INSTANCE = new AccessControlContext(
                   new ProtectionDomain[] {
                     new ProtectionDomain(null, null) // No permissions
                   });
    }
  }
   
  private static void evalScript(final String firstName)
      throws ScriptException {
    ScriptEngineManager manager = new ScriptEngineManager();
    final ScriptEngine engine = manager.getEngineByName("javascript");
    // Restrict permission using the two-argument form of doPrivileged()
    try {
      AccessController.doPrivileged(
        new PrivilegedExceptionAction<0bject>() {
                         
          public Object run() throws ScriptException {
            engine.eval("print('" + firstName + "')");
            return null;
          }
        },
        // From nested class
        RestrictedAccessControlContext.INSTANCE);
                                                                     
    } catch (PrivilegedActionException pae) {
      // Handle error
    }
  }
}

این رویکرد می تواند با لیست سفید برای امنیت بیشتر ترکیب شود.

 

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

This site uses Akismet to reduce spam. Learn how your comment data is processed.