FlawOpen

flawopen.com/Teardowns/cve-2026-105750-docling-html-render-local-file-disclosure

● CVE-2026-105750 · CVSS 5.9 · मध्यम
सुरक्षा अनुसंधान · FlawOpen

CVE-2026-105750: Docling HTML रेंडरिंग में स्थानीय फ़ाइल का खुलासा

2.118.1 से पुराने Docling संस्करण स्थानीय टेक्स्ट फ़ाइलें उजागर कर सकते हैं, जब Python कोड Playwright स्थापित होने पर render_page=True के साथ filesystem Path से अविश्वसनीय HTML रेंडर करता है। ब्राउज़र पथ ने enable_local_fetch लागू नहीं किया और पहुँच को दस्तावेज़ निर्देशिका तक सीमित नहीं किया। 2.118.1 या बाद के संस्करण में अपग्रेड करें।

💡 आसान भाषा में (ELI5)

दस्तावेज़ कन्वर्टर को ऐसे कर्मचारी की तरह समझें जो ब्राउज़र में खुले पन्ने की तस्वीर लेता है। एक सेटिंग कहती थी “स्थानीय फ़ाइलें मत लाओ”, लेकिन रेंडरिंग का एक रास्ता फिर भी ऐसे अनुरोधों को जाने देता था। यदि दिया गया पन्ना ब्राउज़र से कन्वर्टर द्वारा पढ़ी जा सकने वाली फ़ाइल दिखवा दे, तो दिखाई देने वाला पाठ लौटाए गए दस्तावेज़ की छवि में आ सकता है। सुधार सेटिंग जाँचता है और अनुमत स्थानीय फ़ाइलों को स्रोत दस्तावेज़ की निर्देशिका तक सीमित करता है।

इस पेज के मुख्य शब्द

Docling HTML backend
Docling का वह घटक जो HTML पढ़ता है और दृश्य लेआउट लेने के लिए पृष्ठ को headless browser में रेंडर कर सकता है।
HTMLBackendOptions(render_page=True)
Python API विकल्प जो ब्राउज़र रेंडरिंग पथ चालू करता है। यह डिफ़ॉल्ट रूप से बंद रहता है।
enable_local_fetch
नीति विकल्प जो नियंत्रित करता है कि स्थानीय फ़ाइलें दस्तावेज़ संसाधन के रूप में प्राप्त की जा सकती हैं या नहीं। प्रत्येक backend को हर संसाधन अनुरोध पर इसे लागू करना चाहिए।
Playwright
Docling के HTML पृष्ठ रेंडरिंग में प्रयुक्त वैकल्पिक ब्राउज़र-स्वचालन निर्भरता।
Path input
फ़ाइल सिस्टम पथ के रूप में दी गई स्रोत फ़ाइल। stream इनपुट से अलग, यह ब्राउज़र पथ को file URL origin देता है।
CWE-863
Incorrect Authorization: रेंडरिंग मोड का अनुरोध फ़िल्टर स्थानीय फ़ाइल पहुँच की कॉन्फ़िगर की गई नीति लागू नहीं कर पाया।

फ्रेमवर्क मैपिंग

  • इस गाइड में बताई गई कमजोरी के लिए CWE संदर्भ: CWE-863

मूल कारण विश्लेषण (Root Cause)

प्रभावित रेंडरिंग संस्करणों में HTMLDocumentBackend._get_browser_request_block_reason() ने enable_local_fetch जाँचने या resolved path को स्रोत दस्तावेज़ की निर्देशिका तक सीमित करने से पहले file: URL की अनुमति दी। सलाह के अनुसार Docling 2.82.0–2.90.x में रेंडरिंग मोड कोई अनुरोध फ़िल्टर ही नहीं करता था। दोष की सीमा ब्राउज़र संसाधन-अनुरोध नीति है, सामान्य HTML पार्सिंग या हर Docling deployment नहीं। GitHub सलाह मूल कारण के लिए CWE-863 और खुलासे के प्रभाव के लिए CWE-552 भी सूचीबद्ध करती है; यह लेख मूल कारण के प्राथमिक वर्गीकरण के रूप में CWE-863 चुनता है।

हमले का चरण-दर-चरण प्रवाह

चरण 1

ऐप वैकल्पिक HTML रेंडरिंग चालू करता है

प्रभावित deployment Python API में HTMLBackendOptions(render_page=True) और स्थापित Playwright का उपयोग करता है। सलाह के अनुसार डिफ़ॉल्ट कॉन्फ़िगरेशन, Docling CLI और docling-serve प्रभावित सेटअप में शामिल नहीं हैं।

चरण 2

ऐप HTML को filesystem Path के रूप में देता है

सलाह प्रभावित इनपुट को Path के रूप में दिए गए अविश्वसनीय HTML तक सीमित करती है। stream इनपुट page.set_content() के साथ opaque origin का उपयोग करता है और इस file subresource पथ से प्रभावित नहीं होता।

चरण 3

Headless browser स्थानीय संसाधन माँगता है

HTML रेंडरिंग के दौरान subresource अनुरोध कर सकता है। प्रभावित callback ने स्थानीय पहुँच अनुमति लागू किए बिना file: अनुरोध स्वीकार किए; विकल्प चालू होने पर भी स्रोत निर्देशिका तक सीमा नहीं थी, जबकि बिना रेंडरिंग वाला पथ यह सीमा लगाता था।

चरण 4

पठनीय पाठ रेंडर की गई छवि में दिख सकता है

बताया गया प्रभाव उस पाठ तक सीमित है जिसे स्थानीय फ़ाइल ब्राउज़र के दृश्य क्षेत्र में दिखाती है। Docling 2.91.0 से ब्राउज़र में JavaScript बंद है; इसे मनमाने कोड निष्पादन या अदृश्य bytes पढ़ने के रूप में न बताएं।

चरण 5

सुधरा फ़िल्टर दोनों जाँचें बहाल करता है

Docling 2.118.1 स्रोत दस्तावेज़ को स्वयं लोड करने देता है, enable_local_fetch चालू न हो तो अन्य file अनुरोध रोकता है और अनुमत स्थानीय subresources को दस्तावेज़ निर्देशिका तक सीमित करता है।

सोर्स कोड: कमज़ोर बनाम सुरक्षित कार्यान्वयन

कमज़ोर अंश में file: की बिना शर्त अनुमति दिखाई गई है, जैसा कि maintainer सलाह में वर्णित है; यह पूरी source फ़ाइल नहीं है। सुधरा अंश upstream commit 1612b88 का अनुसरण करता है: स्रोत HTML को अनुमति देता है, अन्य स्थानीय फ़ाइलों के लिए enable_local_fetch आवश्यक करता है, माँगे गए पथ को resolve करता है और उसे दस्तावेज़ निर्देशिका में सीमित रखता है। इस अंश को कॉपी करने के बजाय 2.118.1 या बाद में अपग्रेड करें। data:, about: और blob: का अलग व्यवहार स्थानीय फ़ाइल नियम का हिस्सा नहीं है।

सोर्स अंश: docling/backend/html_backend.py — अनुरोध और रेंडरिंग नीति के केंद्रित अंश

कमज़ोर कार्यान्वयन
# प्रभावित रेंडरिंग पथ: स्थानीय फ़ेच नीति की जाँच से पहले file: को अनुमति-सूची में रखा गया था।
if scheme in {"file", "data", "about", "blob"}:
    return None
सुरक्षित और सुदृढ़ फ़िक्स
def _is_allowed_browser_file_request(self, request_url: str) -> bool:
    local_base_path = self._get_browser_local_base_path()
    if local_base_path is not None and request_url == local_base_path.as_uri():
        return True  # The source document itself must remain loadable.

    if not self.options.enable_local_fetch or local_base_path is None:
        return False

    requested_path = Path(url2pathname(urlparse(request_url).path)).resolve()
    return requested_path.is_relative_to(local_base_path.parent)

# _get_browser_request_block_reason() में:
if scheme == "file":
    if self._is_allowed_browser_file_request(request_url):
        return None
    # अन्यथा अनुरोध अवरुद्ध होने का कारण लौटाएँ।

इंजीनियरिंग और सिस्टम सुरक्षा चेकलिस्ट

स्रोत