Deserialization Attacks: ডেটা প্রসেসিংয়ের দুর্বলতা কাজে লাগিয়ে সার্ভারে ক্ষতিকর কোড চালানো!
Insecure deserialization vulnerability কীভাবে server-এ remote code execution সম্ভব করে এবং Java, .NET, Python-এ এর exploitation কৌশল।
আধুনিক distributed system-এ data এক জায়গা থেকে আরেক জায়গায় যাতায়াত করে অবিরত— ব্যবহারকারীর browser থেকে server-এ, microservice-এর মধ্যে, queue থেকে worker-এ, cache থেকে application-এ। এই data movement-এর জন্য object-গুলোকে byte stream-এ রূপান্তর করতে হয়— এই প্রক্রিয়াকে serialization বলা হয়। গন্তব্যে পৌঁছানোর পর সেই byte stream-কে আবার object-এ পরিণত করা হয়— এটা deserialization।
সাধারণ মনে হলেও deserialization এমন একটি অপারেশন যেখানে untrusted byte stream-কে সরাসরি executable object-এ রূপান্তরিত করা হয়। এর ভেতরে যদি কেউ malicious payload লুকিয়ে রাখতে পারে, তাহলে সেই object তৈরির সময়ই server-এ code execute হতে পারে— সবচেয়ে ভয়াবহ ধরনের remote code execution। OWASP Top 10-এ "Insecure Deserialization" বছরের পর বছর থেকেছে, এবং এটি বহু বড় bug bounty award-এর কেন্দ্রে। এই নিবন্ধে আমরা advanced level-এ এই vulnerability class-এর কাঠামো, exploitation এবং defense বিশ্লেষণ করব।
মূল ধারণা
Serialization হলো একটি object-এর in-memory representation-কে এমন একটি format-এ রূপান্তর করা যা সংরক্ষণ বা transmission-এর জন্য উপযুক্ত। Format-গুলো বিভিন্ন রকম— Java-এর native binary serialization, Python-এর pickle, .NET-এর BinaryFormatter, এবং language-agnostic format যেমন JSON, XML, YAML, MessagePack, Protocol Buffers।
Insecure Deserialization vulnerability তখন তৈরি হয় যখন একটি application untrusted source থেকে আসা serialized data-কে deserialize করে, এবং সেই deserialization process এমন কোড execute করে যা আক্রমণকারীর নিয়ন্ত্রণে। মূল সমস্যা হলো অনেক serialization format শুধু data নয়, বরং class instantiation এবং method invocation-এর instruction-ও বহন করে।
আক্রমণকারী একটি carefully crafted serialized payload তৈরি করেন, যা deserialize হলে একটি বা একাধিক method call trigger করে। এই method call-গুলোর chain— "gadget chain" বলা হয়— final-এ একটি dangerous operation-এ পৌঁছায়, যেমন Runtime.exec() বা eval()। গুরুত্বপূর্ণ হলো, এই gadget-গুলো নিজে থেকে malicious নয়— এরা legitimate library-এর normal class এবং method। আক্রমণকারী শুধু এদের একটি unintended sequence-এ trigger করেন।
Deserialization vulnerability-র দুটি প্রধান প্রকার। প্রথমত, Object Injection— যেখানে আক্রমণকারী server-এ একটি unexpected object তৈরি করতে পারেন। দ্বিতীয়ত, Remote Code Execution— যেখানে gadget chain final-এ arbitrary command execution-এ পৌঁছায়। উভয় ক্ষেত্রেই impact severe।
Java Deserialization
Java-এর ObjectInputStream.readObject() method দীর্ঘকাল ধরে এই attack class-এর কেন্দ্রবিন্দু। ২০১৫ সালে Chris Frohoff এবং Gabriel Lawrence ysoserial নামে একটি tool প্রকাশ করেন, যা তখন থেকেই Java deserialization exploitation-এর standard হয়ে উঠেছে।
Apache Commons Collections gadget chain (CC1, CC3) সবচেয়ে বিখ্যাত। এই library-তে TransformedMap class-এর সাথে InvokerTransformer এর combination একটি reflective method invocation chain তৈরি করে যা final-এ Runtime.exec()-এ পৌঁছায়। সমস্যা হলো, Commons Collections এতই widely used যে অসংখ্য Java application-এ এই gadget উপস্থিত।
অন্যান্য জনপ্রিয় gadget chain-এ Spring-এর AbstractPointcutAdvisor, Hibernate-এর ToStringHandler, Groovy-এর ConvertedClosure, এবং JBoss-এর InterceptorChain রয়েছে। প্রতিটি chain একটি specific library-এর existence-এর ওপর নির্ভর করে, কিন্তু modern enterprise application-এ এই library-গুলো ব্যবহারের সম্ভাবনা প্রচুর।
বিখ্যাত cases-এ ২০১৭ সালে Equifax breach— যেখানে Apache Struts-এর CVE-2017-5638 (যদিও এটি OGNL injection ছিল, related class)— ১৪৭ মিলিয়ন মানুষের তথ্য ফাঁসিয়ে দিয়েছিল। JBoss এবং WebLogic-এর বহু critical CVE deserialization-related।
Java 17+-এ Object Deserialization Filtering যোগ করা হয়েছে— ObjectInputFilter API দিয়ে কোন class-গুলো deserialize হতে পারবে তা নিয়ন্ত্রণ। কিন্তু legacy code-এ এর adoption ধীর।
.NET Deserialization
.NET ecosystem-এ BinaryFormatter, NetDataContractSerializer, SoapFormatter, এবং XmlSerializer-এর মতো serializer-গুলো deserialization vulnerability সমস্যায় ভোগে। BinaryFormatter এত বিপজ্জনক যে Microsoft আনুষ্ঠানিকভাবে এটিকে deprecated ঘোষণা করেছে এবং .NET 9-এ এটি removed।
Alvaro Muñoz এবং Oleksandr Mirosh-এর গবেষণা— Friday the 13th JSON Attacks— দেখিয়েছিল কীভাবে JSON.NET-এর TypeNameHandling.All setting RCE-তে পরিণত হয়। Newtonsoft.Json-এ যদি এই setting enabled থাকে, তাহলে JSON-এ $type property দিয়ে আক্রমণকারী server-এ যেকোনো type instantiate করতে পারেন।
Common .NET gadget-এ System.Windows.Data.ObjectDataProvider— যা WPF-এর part— বিশেষভাবে ক্ষতিকর, কারণ এটি arbitrary method invocation সমর্থন করে। ActivitySurrogateSelector এবং WorkflowDataContext-ও বিখ্যাত।
ysoserial.net— ysoserial-এর .NET port— এই gadget-গুলোর precompiled payload generator। এতে XAML payload, Binary payload, এবং JSON payload— সব format-এর জন্য support আছে।
Real-world example-এ Microsoft Exchange-এর ProxyShell vulnerability chain-এ Deserialization একটি critical step ছিল। বহু SharePoint RCE-ও deserialization-based।
Python এবং অন্যান্য Language
Python-এ pickle module কুখ্যাত। pickle.loads() essentially Turing-complete code execution-এর মতো— আক্রমণকারী __reduce__ method override করে যেকোনো command execute করাতে পারেন। Python documentation স্পষ্ট warning দেয়: "Never unpickle data received from an untrusted or unauthenticated source."
কিন্তু এই warning সত্ত্বেও pickle ব্যবহৃত হয়— web framework cache, ML model storage, distributed task queue (Celery)। ২০২২ সালে PyTorch model file-এ malicious pickle inject করার কয়েকটি ঘটনা ঘটেছিল।
YAML-এ yaml.load() (without safe loader) Python-এ একই ধরনের সমস্যা সৃষ্টি করে। yaml.safe_load() ব্যবহার নিরাপদ, কিন্তু legacy code-এ অনেক জায়গায় unsafe loader থেকে যায়। CVE-2017-18342-এর মতো high-profile case এই pattern-এর।
PHP-তে unserialize() similar problem-এ ভোগে। PHP Object Injection নামে পরিচিত এই vulnerability class-এ Magic Method (__wakeup, __destruct, __toString) chained হয়ে RCE তৈরি হয়। POP chain (Property Oriented Programming) ব্যবহার করে এই exploitation। WordPress, Drupal, এবং Magento-এর বহু CVE এই pattern-এর।
Ruby-এর Marshal.load(), Perl-এর Storable::thaw()— সব language-এই native serialization unsafely ব্যবহৃত হলে একই hazard।
Exploitation কৌশল
একজন আক্রমণকারীর জন্য deserialization vulnerability exploit করার workflow সাধারণত এভাবে এগোয়। প্রথমত, deserialization sink identify করা— কোথায় application untrusted data deserialize করছে। এটা HTTP cookie, parameter, view state, message queue body, এমনকি file upload হতে পারে।
দ্বিতীয়ত, technology stack determine করা— Java, .NET, Python, PHP কোনটি? এটি error message, response header, এবং application behavior থেকে অনুমান করা যায়।
তৃতীয়ত, available gadget identify করা— কোন library-গুলো classpath-এ আছে। gadgetinspector (Java-এর জন্য), automated tool যা bytecode analyze করে gadget chain discover করে, সাহায্য করে।
চতুর্থত, payload craft করা— ysoserial বা ysoserial.net দিয়ে। Encode করতে হতে পারে base64 বা URL encoding-এ।
পঞ্চমত, payload deliver করা— vulnerable endpoint-এ এবং expected behavior observe করা। Blind exploitation-এ out-of-band communication (DNS, HTTP callback) ব্যবহার হয়।
Advanced exploitation-এ obfuscation এবং WAF evasion প্রয়োজন। Modern WAF অনেক common gadget signature ধরে। Custom payload আবিষ্কার, encoding chain, এবং polymorphic technique এই detection বাইপাস করে।
বাস্তব উদাহরণ
Equifax breach (২০১৭): যদিও এটি Apache Struts-এর OGNL injection ছিল, এর সাথে closely related deserialization patterns ছিল। ১৪৭ মিলিয়ন মানুষের তথ্য ফাঁস, ৭০০ মিলিয়ন+ ডলার জরিমানা।
Oracle WebLogic CVE-2019-2725: এই deserialization vulnerability-র সুযোগ নিয়ে cryptocurrency miner ব্যাপক হারে install করা হয়েছিল— "WebLogic cryptojacking" নামে পরিচিত wave।
PayPal Manager Account Takeover: Alvaro Muñoz-এর research-এ দেখানো হয়েছিল PayPal Manager-এ Java deserialization vulnerability-র মাধ্যমে account takeover সম্ভব।
Atlassian Confluence CVE-2022-26134— যদিও এটি OGNL injection, related class।
Microsoft Exchange ProxyShell এবং ProxyLogon— এই attack chain-এর কিছু step deserialization-based।
বাংলাদেশসহ দক্ষিণ এশিয়ার বিভিন্ন web application এবং ERP system-এও এই vulnerability class পাওয়া গেছে। Bug bounty program-এ deserialization-based finding-এর জন্য সাধারণত highest tier reward থাকে— $৫০০০-$২৫০০০ pretty common।
প্রতিরোধ ও প্রতিকার
সবচেয়ে কার্যকর প্রতিরোধ হলো untrusted data-কে deserialize না করা। যেখানে সম্ভব, simple data format যেমন JSON ব্যবহার করুন (proper safe parser দিয়ে— না Newtonsoft.Json-এর TypeNameHandling enabled অবস্থায়)। JSON parser শুধু data parse করে; object instantiation-এর arbitrary capability দেয় না।
যদি native serialization বাধ্যতামূলক হয়, তাহলে কিছু critical mitigation প্রয়োগ করতে হবে। Java-তে ObjectInputFilter configure করুন— শুধু whitelisted class deserialize হতে পারবে। JEP 290-এ এই facility-র details আছে। System.setProperty("jdk.serialFilter", "...") দিয়ে JVM-wide filter বা specific stream-এ per-stream filter।
SerialKiller এবং NotSoSerial— third-party Java library যা serialization filter সুবিধা যোগ করে। এদের ব্যবহার করে whitelist এবং blacklist প্রয়োগ করা যায়।
.NET-এ BinaryFormatter সম্পূর্ণভাবে এড়িয়ে চলুন। Microsoft-এর official guidance এটি replace করার জন্য JSON বা MessagePack ব্যবহারের সুপারিশ করে। যদি legacy code-এ অপরিহার্য হয়, তাহলে SerializationBinder configure করুন।
Python-এ pickle শুধু trusted source-এর জন্য। External data-এর জন্য JSON, MessagePack, বা Protocol Buffers ব্যবহার করুন। যদি pickle অপরিহার্য, তাহলে HMAC signature যোগ করুন data-এ যাতে integrity verify করা যায়।
YAML-এর জন্য সব সময় yaml.safe_load() ব্যবহার করুন। ML model file-এর জন্য safetensors-এর মতো safer format consider করুন pickle-এর বিকল্প হিসেবে।
Integrity Protection একটি গুরুত্বপূর্ণ defensive layer। Serialized data-তে HMAC signature যোগ করুন। Deserialization-এর আগে signature verify করুন। যদি signature mismatch করে, reject করুন। এটি tampering detection নিশ্চিত করে।
Network-level controls-এ Web Application Firewall-এ deserialization signature-based detection। তবে modern WAF-ও সব gadget chain ধরতে পারে না; এটি defense in depth-এর একটি স্তর মাত্র।
Runtime Application Self-Protection বা RASP— Java-এর জন্য Contrast Security, Imperva-এর মতো solution— runtime-এ deserialization behavior monitor করে এবং dangerous operation block করে।
Java Security Manager— যদিও deprecated— historical-ভাবে privileged operation নিয়ন্ত্রণে কার্যকর ছিল। Modern Java application-এর জন্য Sandbox এবং Container-based isolation-এ shift হয়েছে।
নিরাপদ Design Pattern
সবচেয়ে fundamental defensive practice হলো trust boundary স্পষ্ট করা। যেখানে data trust boundary cross করে— বাইরের user, external service, untrusted file system— সেখানে data validation এবং transformation থাকা উচিত।
Data Transfer Object (DTO) pattern ব্যবহার করুন। External serialized data কখনোই সরাসরি domain object-এ deserialize করবেন না। প্রথমে DTO-তে deserialize করুন (যেখানে শুধু simple data field থাকে, কোনো business logic নয়), তারপর validate করে domain object-এ map করুন।
Schema-driven approach— Protocol Buffers, Avro, Thrift— গুলো বিশেষভাবে recommended কারণ এগুলো শুধু data carry করে, code execution-এর জন্য কোনো facility নেই। Strong typing এবং schema enforcement security এবং reliability— দুটোই বাড়ায়।
Microservice architecture-এ inter-service communication-এ gRPC বা REST/JSON ব্যবহার করুন। Internal communication-এ native serialization (RMI, JMS object message) এড়িয়ে চলুন।
ভবিষ্যৎ এবং Defensive Trend
Memory-Safe Language-এর adoption— Rust, Go— deserialization vulnerability-র অনেক class কে eliminate করে। Rust-এর serde framework শুধুমাত্র explicit schema-supported deserialization করে; arbitrary code execution-এর pathway নেই।
Automated Gadget Detection-এ গবেষণা এগিয়ে চলেছে। Joogle, Tabby, এবং অন্যান্য static analysis tool নতুন gadget chain discover করতে সাহায্য করে। AI-driven analysis future-এ আরো sophisticated হবে।
Sandboxing এবং Capability-based Security— deserialization context-এ এই concept-গুলোর প্রয়োগ বাড়ছে। JEP 411 (Deprecating Security Manager) এবং পরবর্তী Capability-based proposal— Java ecosystem-এ এই দিকে evolution।
Deserialization Attack আধুনিক application security-র সবচেয়ে impactful vulnerability class-এর একটি। একটি single successful exploitation server compromise, data breach, এবং সম্পূর্ণ infrastructure takeover-এ পরিণত হতে পারে। এর severity-র কারণে এটি bug bounty hunter, red team, এবং threat actor— সবার পছন্দের target।
প্রতিরক্ষা multi-layered এবং proactive হতে হবে। শুধু "untrusted data validate করব" এই ধরনের generic advice যথেষ্ট নয়— deserialization-এর specific risks বুঝে, framework-এর specific guidance follow করে, এবং continuous monitoring-এর মাধ্যমে এই vulnerability class-এর বিরুদ্ধে কার্যকর প্রতিরক্ষা গড়ে তোলা সম্ভব। যেকোনো application যেখানে আপনি object serialization-এর সাথে কাজ করছেন, সেখানে এই hazard সম্পর্কে সচেতন থাকা একজন professional security engineer-এর জন্য অপরিহার্য।
আপনার জ্ঞান যাচাই করতে প্রস্তুত? আজই HackCert-এ Deserialization Attacks MCQ Quiz-টি দিন!
Related articles
5G Security: Unveiling Cyber Attack Risks in Modern Networks and Mitigation Strategies
10 min
Active Directory: Why the Heart of the Corporate Network is the Ultimate Hacker Target
11 min
AD Exploitation: Advanced Tactics Hackers Use to Conquer Active Directory
10 min
ADCS Exploitation: How Hackers Hijack Networks Using Fake Digital Certificates
10 min

