
Path Traversal vulnerability in TahaBakhtari/SubtitleGenerator - CVE-2026-51592
TahaBakhtari/SubtitleGenerator के /update_subtitle एंडपॉइंट में पथ-भ्रमण भेद्यता मौजूद है। यह एंडपॉइंट एक अप्रमाणित क्लाइंट से file_name पैरामीटर स्वीकार करता है और पथ-भ्रमण अनुक्रमों को सैनिटाइज़ किए बिना os.path.join() का उपयोग करके इसे एक निश्चित आधार निर्देशिका से जोड़ता है। परिणामस्वरूप, एक दूरस्थ, अप्रमाणित हमलावर इच्छित data/subtitles/ निर्देशिका के बाहर, चल रही प्रक्रिया की अनुमतियों के अंतर्गत, मनमानी फ़ाइलें लिख सकता है।
2e2553a (परीक्षण के समय नवीनतम)app.py, update_subtitle फ़ंक्शन (पंक्तियाँ 225–238)@app.route('/update_subtitle', methods=['POST'])
def update_subtitle():
file_type = request.form.get('file_type', 'srt')
new_content = request.form.get('new_content')
file_name = request.form.get('file_name')
if not file_name:
return jsonify({'status': 'error', 'message': '...'}), 400
file_path = os.path.join("data/subtitles", file_name)
try:
with open(file_path, "w", encoding="utf-8") as f:
f.write(new_content)
return jsonify({'status': 'success', 'message': '...'})
except Exception as e:
return jsonify({'status': 'error', 'message': str(e)}), 500
file_name पैरामीटर का उपयोग बिना किसी सत्यापन के फ़ाइल पथ बनाने के लिए किया जाता है। एक हमलावर ../../pwned.txt जैसा मान प्रदान कर सकता है, जिससे data/subtitles/ निर्देशिका से बाहर निकलकर उस मनमाने स्थान पर लिखा जा सकता है जहाँ प्रक्रिया में लिखने की पहुँच है।
डिफ़ॉल्ट रूप से, एप्लिकेशन 0.0.0.0:5000 पर बाइंड होता है (देखें app.py), जिसका अर्थ है कि यह नेटवर्क पर पहुँच योग्य है और लोकलहोस्ट तक सीमित नहीं है।
CWE-22: पथनाम का प्रतिबंधित निर्देशिका में अनुचित सीमांकन ('पथ भ्रमण')
Flask प्रक्रिया की अनुमतियों के अंतर्गत मनमानी फ़ाइल लेखन
मौजूदा कॉन्फ़िगरेशन या एप्लिकेशन फ़ाइलों को अधिलेखित करना
एप्लिकेशन स्रोत फ़ाइलों (जैसे app.py) का संभावित अधिलेखन, जो अगले पुनरारंभ पर कोड निष्पादन का कारण बन सकता है
महत्वपूर्ण फ़ाइलों के भ्रष्टाचार के माध्यम से सेवा से वंचित करना (DoS)
हमला वेक्टर: दूरस्थ
प्रमाणीकरण आवश्यक: नहीं
उपयोगकर्ता सहभागिता आवश्यक: नहीं
गंभीरता (प्रारंभिक): उच्च
curl -X POST "http://target:5000/update_subtitle" \
--data "file_name=../../pwned.txt&new_content=HACKED"
प्रतिक्रिया:
{"status": "success", "message": "..."}
सर्वर पर सत्यापन:
$ ls
... pwned.txt ...
$ cat pwned.txt
HACKED
pwned.txt फ़ाइल प्रोजेक्ट की रूट निर्देशिका में लिखी गई, जो इच्छित data/subtitles/ निर्देशिका से दो स्तर ऊपर है — यह पथ-भ्रमण की पुष्टि करता है।
इस प्रमाण की अवधारणा के चलने योग्य संस्करण के लिए poc.sh देखें।
फ़ाइल खोलने से पहले os.path.realpath() का उपयोग करके सत्यापित करें कि हल किया गया पथ data/subtitles/ के अंदर रहता है:
base_dir = os.path.realpath("data/subtitles")
target = os.path.realpath(os.path.join("data/subtitles", file_name))
if not target.startswith(base_dir + os.sep):
return jsonify({'status': 'error', 'message': 'invalid filename'}), 400
file_path = target
यह सुनिश्चित करता है कि परिणामी पथ हमेशा data/subtitles/ के अंदर हल होता है, जिससे ../../ जैसे भ्रमण अनुक्रम प्रभावी रूप से अवरुद्ध हो जाते हैं।
पूरा पैच patch.diff में उपलब्ध है। इस सुधार को एक स्थानीय परीक्षण उदाहरण के विरुद्ध कार्यान्वित और सत्यापित किया गया था: ऊपर PoC में उपयोग किए गए समान पेलोड के लिए अब फ़ाइल लिखने के बजाय "invalid filename" त्रुटि लौटाई जाती है।
अर्दा कुरुओग्लू द्वारा खोजा और रिपोर्ट किया गया।
यह भेद्यता अनुरक्षक को प्रारंभिक रिपोर्ट की तिथि से शुरू होने वाली 90-दिवसीय जिम्मेदार प्रकटीकरण समयरेखा का पालन करते हुए प्रकट की गई थी।
README.md — यह लेखनpoc.sh — भेद्यता प्रदर्शित करने वाली प्रमाण-अवधारणा स्क्रिप्टpatch.diff — सुझाया गया पैच, एक स्थानीय परीक्षण उदाहरण के विरुद्ध मान्ययह लेखन और संलग्न फ़ाइलें MIT लाइसेंस के अंतर्गत जारी की गई हैं।