XXE: XML external entity আক্রমণ ও বন্ধ করার উপায়
XML-এর একটি feature ডকুমেন্টকে বাইরের কনটেন্ট টেনে আনতে দেয়। আপনার parser অনুমতি দিলে আক্রমণকারী এটি ব্যবহার করতে পারে। সমাধান একটি parser সেটিং।

XML External Entity (XXE) হলো অবিশ্বস্ত উৎস থেকে XML parse করা অ্যাপের একটি vulnerability। এটি "security misconfiguration" পরিবারের, কারণ বিপজ্জনক feature প্রায়ই পুরোনো parser-এ ডিফল্টে চালু থাকে।
ধারণাটা
XML-এ entity নামে একটি feature আছে, এক ধরনের shortcut বা variable, যা ডকুমেন্টের শুরুতে DTD (Document Type Definition)-এ সংজ্ঞায়িত করা যায়। External entity একটি ফাইল বা URL-এর দিকে নির্দেশ করতে পারে, এবং parser তা এনে ডকুমেন্টে বসিয়ে দেয়।
অ্যাপ user-এর দেওয়া XML parse করে ফল ব্যবহার বা ফেরত দিলে আক্রমণকারী parser-কে দিয়ে করাতে পারে:
- Server-এর স্থানীয় ফাইল পড়া (যেমন configuration ফাইল) এবং ফল output বা error-এ ঢোকানো।
- Server থেকে অভ্যন্তরীণ সিস্টেমে network request (এটি SSRF-এর একটি রূপ)।
- Denial of service, যেমন nested entity expansion ("billion laughs" আক্রমণ)।
XML কোথায় লুকিয়ে থাকে
- SOAP ও পুরোনো API, SAML single sign-on, RSS ও Atom feed।
- XML-এর zip ফাইল ফরম্যাট: DOCX, XLSX, PPTX, SVG, ODT।
- XML-ভিত্তিক configuration, SVG ছবি প্রক্রিয়া ও "import" feature।
Content-Type: application/xmlনেয় এমন যেকোনো endpoint (এবং কখনো header বদলালে JSON endpoint-ও XML নেয়)।
প্রতিরোধ
নির্ভরযোগ্য সমাধান হলো XML parser কনফিগার করা, যাতে DTD ও external entity বন্ধ থাকে।
- Java:
XMLConstants.FEATURE_SECURE_PROCESSINGসেট করুন,disallow-doctype-declfeature (http://apache.org/xml/features/disallow-doctype-decl= true) চালু করুন এবং external general ও parameter entity বন্ধ করুন। - Python: অবিশ্বস্ত input-এ সাধারণ XML parser-এর বদলে
defusedxmlব্যবহার করুন। - PHP: আধুনিক libxml সংস্করণ ডিফল্টে external entity বন্ধ রাখে, তবে অবিশ্বস্ত data-য় কখনো
LIBXML_NOENTবাLIBXML_DTDLOADচালু করবেন না। - .NET:
DtdProcessing = DtdProcessing.Prohibit(বাIgnore) সেট করুন এবং nullXmlResolverব্যবহার করুন। - Node.js: external entity resolve করে না এমন parser বাছুন, এবং আপনার ব্যবহৃত parser-এর ডকুমেন্টেশন দেখুন।
অন্যান্য প্রতিরক্ষা:
- সম্ভব হলে JSON-এর মতো সহজ ফরম্যাট পছন্দ করুন।
- Input যাচাই করুন এবং দরকার না থাকলে DOCTYPE আছে এমন ডকুমেন্ট প্রত্যাখ্যান করুন।
- Library হালনাগাদ রাখুন। ডিফল্ট সময়ের সাথে নিরাপদ হয়েছে।
- Server থেকে network access সীমিত করুন (egress filtering), যাতে parser URL আনলেও অভ্যন্তরীণ সিস্টেমে পৌঁছাতে না পারে।
- অ্যাপ least privilege-এ চালান, যাতে সংবেদনশীল ফাইল পড়তেই না পারে।
নিরাপদে পরীক্ষা
শুধু আপনার নিজের অ্যাপ বা ইচ্ছাকৃতভাবে দুর্বল lab ব্যবহার করুন। কোডে parser সেটিং পর্যালোচনা এবং static analysis ব্যবহার করুন, যা প্রোডাকশনে খোঁচানোর চেয়ে নিরাপদ।
মূল কথা: অবিশ্বস্ত input ছোঁয় এমন প্রতিটি XML parser-এ DTD ও external entity বন্ধ করুন, আর সম্ভব হলে JSON পছন্দ করুন।
ওয়েব সিকিউরিটি সিরিজ, পর্ব ২ (আরও bug শ্রেণি ও hardening): 5 নম্বর (মোট 6)। আগের লেখা: Insecure deserialization: অবিশ্বস্ত data থেকে object নয় কেন.
