فاسٹ جیسون 1.2.83 میں ڈیفالٹ AutoType=false کے تحت بھی روایتی گیڈجٹ کے بغیر ریموٹ کوڈ ایکزیکیشن ہو سکتی ہے، جسے JDK 8/17/21/25 + اسپرنگ بُوت لودر انکلوزر ماحول میں دوبارہ بنایا گیا ہے۔مضمون کے مصنف، ماخذ: GCSA
خلاصہ
روایتی جاوا دی سیریلائزیشن کے خطرات کے تحفظ نظام میں، صنعت میں عام طور پر درج ذیل جہالتیں پائی جاتی ہیں: “آٹوٹائپ کو ڈیفالٹ طور پر بند کر دیا گیا ہے، اس لیے یہ محفوظ ہے”، “parseObject کے دوسرے پیرامیٹر (اوپری ہدف ٹائپ) کو ثابت کر دیا گیا ہے، اس لیے یہ محفوظ ہے”، “مقامی کلاس پاتھ میں سیریلائزیشن گیڈجٹ کے منابع کو خالی کر دیا گیا ہے، اس لیے یہ محفوظ ہے”۔ تاہم، نئے تکنیکی حملوں اور دفاع کے ترقیات نے ان تمام امیدوں کو ختم کر دیا ہے۔
GCSA عالمی سائبر سیکیورٹی اتحاد نے آج اس ٹیکنیکل انسائٹ رپورٹ کو منفرد طور پر جاری کیا ہے۔ رپورٹ میں Fastjson 1.2.83 کے ڈیفالٹ AutoType=false حالت میں، روایتی Gadget کی ضرورت کے بغیر دور دراز کوڈ اجرا (RCE) کو فعال کرنے کی بنیادی وجوہات کا جائزہ لیا گیا ہے۔ اب تک، یہ استعمال کی گئی ٹیکنالوجی JDK 8 / 17 / 21 / 25 اور Spring Boot Loader انکلوژن ماحول میں مکمل طور پر دوبارہ بنائی جا چکی ہے۔ یہ خرابی روایتی “سیاہ فہرست سے بچنے کے بعد مقامی Gadget تلاش کرنا” نہیں ہے، بلکہ یہ Fastjson کے اپنے Class میٹاڈیٹا سرچ منطق کو دور دراز برائے خرابی Class حاصل کرنے اور اجازت دینے والے چینل میں تبدیل کرتی ہے۔ درج ذیل متن ہے
جاری کنندہ: GCSA عالمی سائبر سیکیورٹی اتحاد
رپورٹ کا قسم: انحصاری ٹیکنیکل انسائٹس / خامی کی گہری تجزیہ رپورٹ
رپورٹ کی تاریخ: 2026-07-21
رپورٹ کی حالت: ماخذ کا جائزہ اور علیحدہ ماحول میں دوبارہ بنایا گیا
خرابی کا نمبر: اندری تحقیق نمبر FJ-GETRESOURCE-RCE (کوئی عوامی CVE سے مطابقت نہیں)
Fastjson 1.2.83، جبکہ AutoType=false ہے، اب بھی روایتی gadget کے بغیر ریموٹ کوڈ ایکزیکیشن کو فعال کر سکتا ہے، جسے JDK 8/17/21/25 + Spring Boot Loader انکلوزر ماحول میں دوبارہ بنایا گیا ہے۔ تجویز کیا جاتا ہے کہ فوراً SafeMode فعال کیا جائے اور Fastjson 2.x پر منتقلی کی جائے۔
1. ایگزیکٹو سمری
Fastjson 1.2.83 کا ParserConfig.checkAutoType صارف کنٹرول کردہ @type قیمت کو class ریسورس نام میں تبدیل کر دیتا ہے اور اسے موجودہ ClassLoader کے getResourceAsStream کو دے دیتا ہے:

ایفٹ-جار کلاس لودر ماحول میں جہاں مطلق URL وسائل کے نام کو تحلیل کیا جا سکتا ہے، حملہ آور نقطہ کے استعمال سے http:، jar:http: اور jar:file: URL بناسکتا ہے اور حملہ کنندہ طرف سے @JSONType کے ساتھ بری بھری کلاس ڈاؤن لوڈ کرسکتا ہے۔ فاسٹ جیسن اس نوٹیشن کو پکڑنے کے بعد loadClass کو بلاواسطہ بلاتاخیر فراہم کردیتا ہے، خطرناک بنیادی کلاس چیک اور مقصدی قسم کی مطابقت چیک سے پہلے۔ جب کلاس کو انسٹینس اور شروع کیا جاتا ہے تو اس سے کوئی بھی کوڈ نفاذ ہوسکتا ہے۔
یہ استعمال مطلوبہ classpath میں موجود روایتی دی-سیریلائزیشن گیڈجٹ پر منحصر نہیں ہے اور Fastjson AutoType=false کی ڈیفالٹ حالت میں بھی فعال ہو سکتا ہے۔ JSON.parseObject کے مقصد کے قسم کو مقرر کرنا اجراء کو روکنے میں ناکام رہتا ہے؛ SafeMode کو فعال کرنے سے وسائل تک رسائی سے پہلے عام استعمال کے راستے کو روکا جا سکتا ہے۔
اس رپورٹ میں ایک ہی JSON پیلود کا استعمال کرتے ہوئے ایک علیحدہ لینکس کنٹینر میں درج ذیل دوبارہ تشخیص کی گئی:

2. خامی کا درجہ

صرف کمپوننٹ کے ورژن کے بنیاد پر CVSS 9.8 کا ایک یکساں اقدام تجویز نہیں کیا جا سکتا: عام AppClassLoader منفی کنٹرول ہے، جبکہ جدید JDK کی مکمل چین دونوں مطلق JAR URL کو پڑھنے والے لودر اور /proc/self/fd پر منحصر ہے۔ اس رپورٹ کے مثبت ماحول کو پورا کرنے والے ایپلیکیشنز میں، خرابی کا اثر بنا ہوئے نیٹ ورک RCE ہے۔
3. اثر کی دائرہ اور پیش شرطیں
3.1 دائرہ کار تصدیق شدہ
- چلائیں کی تصدیق: Fastjson 1.2.83
- جے ڈی کے تصدیق شدہ: 8، 17، 21، 25
- آپریٹنگ سسٹم تصدیق: لینکس؛ میک او ایس پر /dev/fd کا استعمال کرتے ہوئے JDK 17/21/25 کی دوبارہ تخلیق مکمل ہو گئی
- لوڈر تصدیق: سپرنگ بُوٹ 2.7.18 کلاسک لوڈر + JDK 8؛ سپرنگ بُوٹ 3.2.0 لوڈر + JDK 17/21/25
- API تصدیق: JSON.parse، اور ثابت بالائی سطح کے ٹائپ کے لیے JSON.parseObject
ورژن 3.2 کے دائرہ کار کی وضاحت
بیرونی تفصیل میں 1.2.68–1.2.83 کو معلوم ٹیسٹنگ رینج کے طور پر زیادہ مناسب سمجھا جا سکتا ہے، نہ کہ خرابی کا داخلہ ورژن۔ سورس کوڈ کی جانچ سے پتہ چلتا ہے کہ فیصلہ کن کلاس ریسورس ڈیٹیکشن کوڈ 1.2.67 اور 1.2.68 میں پہلے ہی موجود تھا۔ اس رپورٹ میں صرف 1.2.83 کے لیے مکمل JDK رن ٹائم ویریفیکیشن کیا گیا ہے۔
3.3 ضروری شرائط کا استعمال
1. حملہ آور Fastjson میں داخل ہونے والے JSON کو کنٹرول کر سکتا ہے، اور ان پٹ میں @type کو حل کیا جائے گا۔
2. سیف موڈ فعال نہیں ہے۔
3. فاسٹ جیسون کا کلاس لودر تعمیر کردہ مطلق وسائل کے نام کو URL میں حل کر سکتا ہے۔
4. متاثرہ پروسیس حملہ آور کی HTTP سروس سے جُڑ سکتی ہے۔
5. جدید لینکس لنک کے لیے درکار ہے کہ /proc/self/fd قابل پڑھنا ہو اور لوڈر قابل تحلیل ہو
jar:file:/proc/self/fd/N!...۔
1. JDK کو معمول کے دوران ریموٹ JAR عارضی کیش کو بنانے کی صلاحیت ہونی چاہیے؛ جس کا مطلب عام طور پر یہ ہے کہ JVM عارضی ڈائرکٹری لکھنے کے قابل ہو۔
حملہ آور کو ضرورت نہیں ہے:
- ہدف کلاس پاتھ میں فائل لکھیں
- مقصد کلاس پاتھ میں پہلے سے ٹیمپلیٹسImpl، JNDI، C3P0، کامنز کولکشنز جیسے گیڈجٹس ڈالے گئے ہیں
- فاسٹ جیسون آٹو ٹائپ کو آن کریں
- JSON.parseObject کے دوسرے پیرامیٹر کو کنٹرول کریں
4. بنیادی وجوہات کا تجزیہ
4.1 صارف کے قسم کا نام وسائل کے URL کے طور پر استعمال ہوتا ہے
سورس کا مقام:

کور کوڈ:

یہ منطق یہ فرض کرتا ہے کہ resource صرف عام classpath راستہ ہے، لیکن اس کے پروٹوکول، مطلق راستہ کے معنی یا ذرائع پر کوئی پابندی نہیں ہے۔ خاص fat-jar لودر کے لیے، درج ذیل ان پٹ کو تبدیل کرنے کے بعد مطلق URL بن جائے گا:

اس لیے getResourceAsStream مقامی میٹا ڈیٹا کے سوال سے باہر نکل کر حملہ آور کے کنٹرول والے نیٹ ورک وسائل کو لوڈ کرتا ہے۔
4.2 ریموٹ کلاس کا @JSONType اجازت کے طور پر استعمال کیا جاتا ہے
Fastjson اپنا ASM ClassReader استعمال کرتا ہے وسائل کے مواد کو تجزیہ کرنے کے لیے:

حمل کرنے والے ریموٹ کلاس میں صرف Fastjson کا @JSONType ٹیگ ہونا ضروری ہے تاکہ jsonType کو true پر سیٹ کیا جا سکے۔ یہاں جانچ کی جا رہی ہے کہ حملہ آور کی طرف سے فراہم کردہ بائٹس ہیں، نہ کہ ایک قابل اعتماد classpath سے لوڈ ہوچکا کلاس۔
4.3 jsonType اصلی کلاس کو لوڈ کرتا ہے
سورس کا مقام:
TypeUtils.loadClass سیاق و سباق میں واضح لوڈر، تھریڈ کنٹیکسٹ لوڈر اور Class.forName کو ترتیب سے کوشش کرتا ہے۔ مثبت ماحول میں، تھریڈ کنٹیکسٹ لوڈر ایک ہی مطلق وسائل کے نام کو دوبارہ حل کرتا ہے، class ڈاؤن لوڈ کرتا ہے اور defineClass کو انجام دیتا ہے۔
4.4 @JSONType ابتدائی واپسی سے بعد کی سیکورٹی چیکس سے گزرنا
سورس کا مقام:
- خطر کی بنیادی جانچ نہیں کی جائے گی
- expectClass.isAssignableFrom(clazz) نہیں چلے گا
- فکسڈ ڈیٹا بائنڈنگ قسم کلاس کی شروعات سے پہلے انجام کو روک نہیں سکتی
4.5 استثناء/خرابی کے بعد سافٹ چینل کا سفٹ فارمیشن ناکام
سورس کا مقام:
4.6 سیف موڈ کی جگہ
سیف موڈ چیک ریسورس تک رسائی سے پہلے ہوتا ہے:
5. لینک کا تفصیلی جائزہ
5.1 JDK 8: فوری ریموٹ کلاس لوڈنگ
سب سے مختصر شکل:
JDK 17+ نیٹ ورک درخواستوں کو مکمل کرے گا، لیکن اندر کے نام میں خالی راستہ کے حصوں کو مسترد کر دے گا،
5.2 جدید JDK مرحلہ اول: دوران JAR ڈاؤن لوڈ کریں
اولین عنصر پیلود کی پہلی فہرست میں:
JDK 17+ نے بعد میں پہلے مرحلے کے jar:http://... کے اندر کے نام کو مسترد کر دیا، لیکن Fastjson نے Exception سے متعلقہ پس منظر کی وجہ سے صف کو جاری رکھا۔
5.3 جدید JDK مرحلہ دوم: کیشے FD دوبارہ کھولیں
موجودہ امیدوار عناصر:
JDK 17 کے کلاس-لوڈ لاگ میں پہلا مطابقت ہے:
5.4 ایک پیلوزڈ کیوں JDK 8 اور جدید JDK دونوں کے ساتھ مطابقت رکھتا ہے
- JDK 8 فوراً پہلے مرحلے کے jar:http://... کلاس کو قبول کرتا ہے اور انجام دیتا ہے
- فاز اول کے کلاس کے حکم کے بعد جان بوجھ کر RuntimeException("stage-one-stop") کو پھینک دیا جاتا ہے، تاکہ JDK 8 غیر متعلق socket/pipe FD کی کوشش جاری نہ رکھے۔
- JDK 17+ پہلے مرحلے میں غلط نام کی وجہ سے کلاس کی شروعات سے پہلے ناکام ہو جاتا ہے، اس کے بعد Exception کے ذریعے نرمی سے FD ایnumerیشن مرحلے میں داخل ہوتا ہے
6. ماحول اور ثبوت کی دوبارہ تکرار
6.1 ٹیسٹ کیے جانے والے کمپوننٹ کا ہیش
6.2 ایک کلک پر دوبارہ بنائیں

Expected Output:اسکرپٹ کرے گا:
- ہارٹ فیٹ جار کو ترکیب دیں؛
- ایف ڈی کے لیے مخصوص کلاس کے ساتھ حملہ JAR تیار کریں؛
- ایک JSON ارے پیلوزڈ بنائیں؛
- ایزولیٹڈ ڈاکر نیٹ ورک میں حملہ کرنے والی HTTP سروس شروع کریں؛
- جےڈیکے 8/17/21/25 کے متاثرہ کنٹینرز کو الگ الگ شروع کریں؛
- ہر کنٹینر میں منڈیا گیا /tmp/fastjson-getresource-rce کی جانچ کریں۔
6.3 ہاتھ سے حملہ JAR اور پیلوزڈ تیار کریں
6.4 Burp Suite کے ذریعے جمع کرائیں
Burp صرف Fastjson پارسر پوائنٹس والے متاثرہ ایپی کے لیے JSON بھیجتا ہے؛ حملہ کرنے والی JAR فائل ابھی بھی حملہ آور کی HTTP سروس سے فراہم کی جانی چاہیے۔
درخواست ٹیمپلیٹ:
اگر ایپلیکیشن فکسڈ ٹاپ لیول ٹائپ استعمال کرتا ہے، تو آپ فیلڈ سٹرکچر کے مطابق ارے کو پیک کر سکتے ہیں، جیسے:
اس تجربے میں JSON.parseObject(json, BoundEnvelope.class) کا استعمال کیا گیا تاکہ اوپر والے مکمل پیکیج کو تحلیل کیا جا سکے، جس کا نتیجہ اب بھی RCE-OK رہا اور BoundEnvelope کو درست طریقے سے واپس کر دیا گیا۔
6.5 اہم سرحدی ٹیسٹ

7. درستگی اور کمی کی تجاویز7.1 ترجیحی: Fastjson 1.x سے منتقلی
فاسٹجسون 2.x کو مینٹیننس کے دوران ترجیح دیں اور تمام پولی مورفک ٹائپس، آٹوٹائپ اور کمپیٹیبل موڈ کانفیگریشنز کی دوبارہ تصدیق کریں۔ ریگریشن ٹیسٹ کیے بغیر صرف JAR فائل کو تبدیل نہ کریں۔
7.2 فوراً سیف موڈ فعال کریں
کوڈ کنفیگریشن:
JVM پیرامیٹرز:
نوٹ: اگر ایپ نے AutoTypeCheckHandler کو رجسٹر کیا ہے، تو اسے SafeMode چیک سے پہلے ایگزیکیٹ ہونے کی وجہ سے ایک ساتھ آڈٹ کیا جانا چاہیے یا ہٹا دیا جانا چاہیے۔
7.3 ڈی سیریلائزیشن انٹری کو محدود کریں
- غیر قابل اعتماد درخواستوں کو براہ راست JSON.parse/JSON.parseObject کو نہ دیں
- گیٹ وے یا ایپ انٹری پر کسی بھی قسم کے خاص میٹا ڈیٹا کو مسترد کر دیں
- صرف اُوپری لیول کا Java ٹائپ فکس کرنا کافی تحفظ نہیں ہے، کیونکہ نیسٹڈ آبجیکٹس اب بھی @type کو پروسیس کر سکتے ہیں، اور اس خامی کے لیے jsonType پہلے سے واپس آ جاتا ہے جس سے مطابقت کی جانچ کو دور کر دیا جاتا ہے
7.4 WAF/گیٹ وے عارضی قواعد
JSON کی کلید کو ڈی کوڈ کرنے کے بعد جو @type کے برابر ہو، اس کے درخواستوں کو عارضی طور پر روکیں اور URL پیرامیٹرز، درخواست بادی اور نیسٹڈ آبجیکٹس کو اووررائٹ کریں۔ صرف متن "@type" کو تلاش کرنا کافی نہیں، کیونکہ Fastjson lexer فیلڈ ناموں کو پہلے ڈی کوڈ کرتا ہے، مثلاً:
WAF قواعد صرف کمی کے لیے ہیں، کمپوننٹس کے اپ گریڈ اور سیف موڈ کی جگہ نہیں لے سکتیں۔
7.5 آؤٹگو اور رن ٹائم ایڈجسٹمنٹ
- غیر ضروری باہری پتے کے لیے JVM کو HTTP/HTTPS کنکشن شروع کرنے سے منع کریں۔
- ایپلیکیشن کنٹینرز پر حداقل نیٹ ورک پالیسی لاگو کریں۔
- جب مطابقت ممکن ہو تو /proc/self/fd کی نمائش کو محدود کریں یا زیادہ سخت کنٹینر سینڈ باکس استعمال کریں۔
- اے ڈٹ کلاس لوڈر کے مطلق URL وسائل کے نام کے ساتھ سلوک کو چیک کریں، جس میں http:، https:، jar:، file: جیسے پروٹوکولز کو مسترد کر دیا جائے۔
- جے وی ایم عارضی ڈائرکٹری میں غیر معمولی jar_cache* سرگرمیوں کا نگرانی کریں۔
8. تجاویز اور IOC کا پتہ لگائیں
8.1 درخواست کی طرف کے خصوصیات
ڈیکوڈ شدہ @type قیمت میں شامل ہیں:
ایکلیپشن کو الگ طور پر ایلارم کے لیے کافی نہیں سمجھا جانا چاہیے، اسے پروٹوکول فارمیٹ، @type اور صف میں مسلسل FD امیدواروں کے ساتھ مل کر تجزیہ کیا جانا چاہیے۔
8.2 نیٹ ورک سائیڈ خصوصیات
- JVM غیر معمولی ہوسٹ کو وسعت کے بغیر JAR یا .class فائل کے لیے درخواست کرتا ہے
- ایک ہی تجزیہ درخواست کے دوران 1–3 بار دہرایا گیا GET/HEAD
- درخواست کے راستے میں /x، /a.class یا حملہ آور کی طرف سے تعریف شدہ مساوی راستے شامل ہو سکتے ہیں
8.3 ہوسٹ طرف کے خصوصیات
- JVM عارضی ڈائریکٹری میں jar_cache* بنایا جاتا ہے
- جاوا پروسس /proc/self/fd/N کے ذریعے اپنے فائل کو دوبارہ کھولتا ہے
- کلاس-لوڈ لاگ میں ایسے ظاہر ہوتا ہے:
9. نتیجہ
یہ کمزوری روایتی “کالا فہرست کو دور کر کے مقامی گیڈجٹ تلاش کرنا” نہیں ہے، بلکہ اس میں Fastjson کا اپنا class میٹا ڈیٹا کا پتہ لگانے والا منطق دور دراز class حاصل کرنے اور اجازت کے چینل میں تبدیل ہو گیا ہے۔ @JSONType کا جلد واپس آنا اجازت دیتا ہے کہ حملہ آور کی فراہم کردہ class خطرناک بنیادی class اور قسم بندی کی جانچ سے پہلے قبول ہو جائے؛ Exception کا نرم چینل اور JDK jar:http: عارضی کیش نے JDK 8 کے براہ راست لوڈنگ پریمیٹ کو JDK 17/21/25 تک وسعت دے دی ہے۔
اس لیے مندرجہ ذیل عام ججمنٹس درست نہیں ہیں:
- "آٹو ٹائپ ڈیفالٹ طور پر بند ہے، اس لیے محفوظ ہے" — درست نہیں
- "فکسڈ parseObject دوسرا پیرامیٹر، اس لیے محفوظ" — درست نہیں
- "classpath میں کوئی معلوم گیڈجیٹ نہیں ہے، اس لیے محفوظ" — درست نہیں
- "JKD 17+ http:// اندر نام کو مسترد کر دے گا، اس لیے صرف SSRF تک محدود ہو گا" — درست نہیں
ایک تصدیق شدہ لوڈر، نیٹ ورک اور فائل ڈیسکرپٹر کے شرائط کے ساتھ ڈیپلویمنٹ میں، یہ مسئلہ ایک منفرد غیر تصدیق شدہ JSON درخواست سے حقیقی ریموٹ کوڈ ایکزیکیشن تک ترقی کر سکتا ہے۔ فاسٹ جیسن 2.x کو فوری طور پر اپ گریڈ کرنا چاہئے اور فوراً سیف موڈ کو فعال کرنا چاہئے، باہر کی نکاسی اور کلاس لودر ریسورس حل کرنے کے حدود کو سخت بنانا چاہئے۔
10. منسلکات اور ثبوت کا راستہ
نقل اور کاپی رائٹ کا اعلان: یہ رپورٹ اور متعلقہ ٹیکنیکل تجزیہ GCSA عالمی سائبر سیکیورٹی کنسل کی منفرد طور پر جاری کردہ ہے۔ اگر آپ اسے نقل کرنا چاہتے ہیں تو GCSA کے اصل ذرائع اور اصل لنک کو مکمل طور پر برقرار رکھیں اور رپورٹ کے مرکزی خیالات میں بری طرح تبدیلی نہ کریں۔
ذریعہ: GCSA عالمی سائبر سیکیورٹی اتحاد
ویب سائٹ: www.gcsa.org
