Insecure deserialization: অবিশ্বস্ত data থেকে object নয় কেন
Byte থেকে object ফেরানো ঝুঁকিপূর্ণ, যখন byte আক্রমণকারীর কাছ থেকে আসে। কেন, আর বদলে কী ব্যবহার করবেন, জানুন।

Serialization মেমোরির object-কে সংরক্ষণ বা পাঠানোর জন্য byte বা টেক্সটে রূপ দেয়। Deserialization আবার তা object-এ ফেরায়। এটি স্বাভাবিক ও কাজের। কিন্তু data অবিশ্বস্ত উৎস থেকে এলে এটি বিপজ্জনক।
কেন বিপজ্জনক
কিছু serialization ফরম্যাট লোড করার সময় কোন class তৈরি হবে ও কোন কোড চলবে তাও বর্ণনা করতে পারে। data আক্রমণকারীর নিয়ন্ত্রণে থাকলে সে এমন object বাছতে পারে যেগুলো তৈরি হওয়াই ক্ষতিকর কাজ চালু করে। ভাষা ও আপনার server-এর library অনুযায়ী এর ফল হতে পারে:
- Remote code execution।
- ক্ষেত্র বদলে privilege escalation (যেমন serialized session-এ
isAdmin=true)। - বিশাল বা গভীর nested data দিয়ে denial of service।
- অপ্রত্যাশিত object ঢোকানো (object injection)।
কোথায় দেখা যায়
- ভাষার নিজস্ব ফরম্যাট: Python
pickle, JavaObjectInputStream, PHPunserialize(), RubyMarshal, .NETBinaryFormatter(এখন নিরুৎসাহিত)। - Cookie, লুকানো ফর্ম ফিল্ড বা API parameter-এ serialized object।
- Message queue, cache ও session store, যেখানে আক্রমণকারী data লিখতে পারে।
- যে YAML loader ইচ্ছামতো object বানাতে পারে ("safe" loader ব্যবহার করুন)।
- Request body স্বয়ংক্রিয়ভাবে সমৃদ্ধ object-এ রূপ দেওয়া framework।
কীভাবে ঠেকাবেন
১. অবিশ্বস্ত data নেটিভ object ফরম্যাটে deserialize করবেন না। সেরা সমাধান এটি এড়ানো।
২. সহজ data ফরম্যাট ব্যবহার করুন। JSON পছন্দ করুন (শুধু data, কোড বা class নয়), এবং সাধারণ data structure-এ parse করুন।
৩. Schema দিয়ে যাচাই করুন। ব্যবহারের আগে ধরন, পরিসর ও অনুমোদিত ফিল্ড যাচাই করুন (JSON Schema, Zod, Pydantic ও অনুরূপ)। অপ্রত্যাশিত ফিল্ড প্রত্যাখ্যান করুন।
৪. যে data ঘুরিয়ে আনতে হয় তাতে সই বা encryption দিন। Client-এ state রাখলে (cookie) signature (HMAC) বা authenticated encryption দিয়ে রক্ষা করুন এবং পড়ার আগে যাচাই করুন। আরও ভালো: state server-এ রেখে client-কে শুধু random ID দিন।
৫. সমৃদ্ধ ধরন লাগলে allow-list ব্যবহার করুন। কিছু library কোন class তৈরি হতে পারবে তা সীমিত করতে দেয়। তালিকা খুব ছোট রাখুন।
৬. Resource সীমিত করুন। Parse-এর সর্বোচ্চ আকার, গভীরতা ও সময় ঠিক করুন।
৭. Dependency হালনাগাদ রাখুন। অনেক পরিচিত deserialization আক্রমণ classpath-এর নির্দিষ্ট দুর্বল library ("gadget")-এর ওপর নির্ভর করে।
৮. Least privilege-এ চালান এবং অস্বাভাবিক deserialization error নজরে রাখুন।
সহজ নিয়ম
Data data-ই থাকুক। যে ফরম্যাট কোন কোড চলবে তার নির্দেশও বহন করতে পারে, তাতে বাইরের কেউ ছুঁয়েছে এমন কিছু দেবেন না।
মূল কথা: অবিশ্বস্ত input-এ নেটিভ object deserialization এড়ান, কড়া schema যাচাইসহ JSON ব্যবহার করুন, এবং client-কে যা দেন তাতে সই করুন।
ওয়েব সিকিউরিটি সিরিজ, পর্ব ২ (আরও bug শ্রেণি ও hardening): 4 নম্বর (মোট 6)। আগের লেখা: নিরাপদ file upload: কী যাচাই করবেন ও কোথায় রাখবেন.
