Bitwarden के वॉल्ट को लीक करने वाली Nginx भेद्यता
(labs.hakaioffsec.com)- Nginx, एक बहुउद्देश्यीय web server है जिसका 2004 से प्रमुख market share रहा है
- Nginx की गलत configuration सुरक्षा भेद्यताओं और data exposure का कारण बन सकती है
- Nginx की भेद्यताओं का पता लगाने के लिए automated tool NavGix का परिचय
- इस भेद्यता के जरिए अनचाहे दायरे की files और directories तक access किया जा सकता है
- Bitwarden और Google के HPC Toolkit पर case studies इस भेद्यता की गंभीरता दिखाती हैं
1 टिप्पणियां
Hacker News टिप्पणियाँ
जानकारी के लिए, gixy (nginx config checker) इस समस्या को पकड़ लेता है: https://github.com/yandex/gixy/blob/master/docs/en/plugins/a...
और NixOS अपने जरिए जनरेट किए गए config पर gixy अपने-आप चलाता है, और समस्या मिलने पर system build को अस्वीकार कर देता है
$uriका इस्तेमाल कर रहा थालेकिन सोच रहा हूँ कि क्या कोई बेहतर option searcher है. हज़ारों options में पूरी सूची खोजने का तरीका मुझे खास पसंद नहीं आया, और मैं सिर्फ
sshजैसे package को देखकर उससे जुड़े options ही देखना चाहता हूँ, लेकिन बहुत सारे गैर-ज़रूरी results भी साथ आ जाते हैंयह शायद बेवकूफी भरा सवाल हो, लेकिन क्या कोई अच्छा कारण है कि nginx URL path में
..के जरिए parent directory में ऊपर जाने की अनुमति दे? यह तो बस मुसीबत को न्योता देने जैसा लगता हैसंपादन: असली vulnerability में क्या हो रहा है, इस पर मैं थोड़ा भ्रमित हूँ. ऐसा लगता है कि http://localhost/foo../secretfile.txt को
/var/www/foo/../secretfile.txtजैसा समझा जाता है, लेकिन अगर server vulnerable नहीं है तो http://localhost/foo/../secretfile.txt को भी उसी तरह क्यों नहीं समझा जाएगा? मुझे समझ नहीं आ रहा कि path में..सिर्फ कुछ मामलों में ही क्यों काम करता हैइस मामले में, URL का एक हिस्सा config में local filesystem पर map होने के तरीके की वजह से nginx द्वारा directory (http://localhost/foo) के रूप में समझा जाता है. चूँकि वह directory जैसा दिखता है, nginx जब requested resource का पूरा path बनाता है तो वह
"${mapped_path}/../secretfile.txt"बन जाता है, और भले ही URL के नज़रिए से इसका मतलब न बने, local filesystem पर यह वैध हो जाता है. URL असली path components नहीं बल्कि सिर्फ strings होते हैं, इसलिए slash की जगह भी मूल रूप से महत्वपूर्ण नहीं होतीवेब के शुरू होने के बाद से यह webservers में बहुत आम समस्या रही है. URL को सीधे file paths पर map करना इसलिए लोकप्रिय था क्योंकि इसकी शुरुआत index वाले साधारण file servers से हुई थी, लेकिन जल्दी ही माहौल ऐसा हो गया जहाँ URL path नहीं बल्कि application identifiers बन गए. path का एक हिस्सा app को बताता है और बाकी हिस्सा parameters या arguments की तरह लिया जाता है
और सामान्य तौर पर filesystem objects के लिए URL के
.या..का सम्मान करना अक्सर तर्कसंगत नहीं होता. मेरी apps request path को साफ़ करती हैं ताकि सही mapping हो सके. browser relative links बनाते समय URL को path की तरह मानते हैं, इसलिए trailing/को कब और कैसे इस्तेमाल करना है, इस पर भी सावधानी रखनी पड़ती है. server की तरफ़ इसका अर्थ किसी और resource से हो सकता हैlocationमेंallow_parent_traversal on;जैसे flag के साथ इसे स्पष्ट रूप से चालू करने वाला व्यवहार बनाना ज़्यादा सही लगता है"/foo/bar/.."की जाँच करके उसे रोकता होगा या"/foo/"में normalize करता होगा. लेकिन"/foo/bar.."पूरी तरह वैध filename है, इसलिए शायद ऐसी जाँच से बच निकलता है..कब काम करेगा, यह पूरी तरह file permissions पर निर्भर करता हैइस मामले में मान लें कि web index directory (
../index.html) से root directory (/) तक files पढ़ने की permission है, तो root तक नीचे जाने की permission होने के बाद आप root से पहुँच योग्य हर world-readable file, जैसे/etc/passwd, भी देख सकते हैंइसे तीन दाँत वाले काँटे की तरह सोचें, जहाँ webserver सबसे दाएँ वाले हिस्से पर है. अगर जिस हैंडल वाले हिस्से पर तीनों शाखाएँ मिलती हैं उसे filesystem मानें, तो जब webserver को अपने दाएँ वाले हिस्से से उस हैंडल तक आने वाली files और directories की access permission होती है, तब हैंडल तक पहुँचने के बाद वह दूसरी शाखाओं की files तक भी पहुँच सकता है
मुझे समझ नहीं आता कि इसे nginx की vulnerability क्यों नहीं माना जाता. यह व्यवहार पूरी तरह बेतुका है, किसी उपयोगी उद्देश्य का नहीं लगता, और तुरंत exploit किया जा सकता है
यह भी याद रखना चाहिए कि Nginx को Apache2 से ज़्यादा “web scale” साबित करने वाले benchmarks की वजह से लोकप्रियता मिली थी
ऐसा करने का विचार आता है। Linux kernel के filename parser में
..विकल्प को हटाने वाला Linux capability जैसा कोई option रखा जाएweb apps में telephone modem वाले ज़माने से ही दो dots को किसी-न-किसी तरह घुसाने वाली कई bypass तकनीकें लगातार आती रही हैं। जैसे Linux kernel ने user space bugs की कई दूसरी categories के लिए किया, वैसे ही अब इस समस्या को भी एक बार में बंद करने का तरीका खोजने का समय आ गया है
RESOLVE_BENEATHहैFreeBSD में सामान्य
openat(2)परO_RESOLVE_BENEATHके रूप में यह सुविधा मौजूद हैnginx को बहुत सीमित permissions वाले अलग user के रूप में चलाएँ या Docker में चलाएँ। इसके साथ regular updates करें, तो आम तौर पर security issues का 90% हल हो जाता है
/some/../pathको लगभग 100% प्रतिबंधित होना चाहिए। “किसी ने बदसूरत code लिखा है” के अलावा इसका कोई तर्कसंगत use case नहीं है../some/pathका कम-से-कम कभी-कभी मतलब होता हैलेकिन शायद यह उतना उपयोगी नहीं होगा जितना लगता है। कई apps OS को देने से पहले ही
..को resolve कर देते हैंअगर आप किसी folder से web पर files serve कर रहे हैं, तो web framework को यह सुनिश्चित करना चाहिए कि वह तय public root folder के बाहर न निकल सके। अगर आप यह खुद बना रहे हैं, तो इसमें ऐसी तमाम स्थितियों पर विचार करना होगा
“Google VRP Team ने इस vulnerability को ढूँढने के लिए 500 डॉलर का reward दिया। उनका मानना था कि application पर इसका असर इतना गंभीर नहीं था कि अधिक reward दिया जाए” — तो GCP account email और private key exposure की कीमत सिर्फ 500 डॉलर है? यह क्या बात हुई। बिल्कुल Google जैसा लगता है
अच्छा है कि leaked चीज़ें अभी भी encrypted थीं। जब इस क्षेत्र में विशेषज्ञता रखने वाली कंपनियाँ भी leaks से नहीं बच पातीं, तो ईमानदारी से कहें तो यह best-case scenario ही है
शीर्षक काफ़ी संपादित किया गया है। मूल शीर्षक Hunting for Nginx Alias Traversals in the wild है
HN submission title Bitwarden vulnerability पर ज़ोर देता है, लेकिन लेख में Google वाला मामला भी साथ में लिया गया है
अगर resource usage न्यूनतम रखते हुए भरोसेमंद और सुरक्षित static file serving ही चाहिए, तो आजकल सबसे अच्छा विकल्प क्या है? पहले मैं Nginx चुनता, लेकिन security के नज़रिये से सोचता हूँ कि शायद कम-purpose और कम-configurable tool बेहतर हो
यह cross-platform है, Rust में लिखा गया है, configuration सरल है, और सुरक्षित defaults देता है। इसके hardened container images और hardened NixOS modules भी हैं
मैं Caddy की सिफारिश नहीं करूँगा। इसकी official Docker image default रूप से root के रूप में चलती है [1], और यह ठीक से sandboxed systemd unit file भी नहीं देती [2]
[1]: https://github.com/caddyserver/caddy-docker/issues/104
[2]: https://github.com/caddyserver/dist/blob/master/init/caddy.s...
संपादन: शब्दों को थोड़ा सुधारा
file_servermodule हैशायद यह बेवकूफ़ी भरा सवाल हो, लेकिन Bitwarden ने शुरुआत से ही
/attachmentsके लिए unauthenticated requests क्यों allow किए? अगर Nginx bug होने पर भी उस URL के लिए authentication चाहिए होती, तो क्या request fail नहीं हो जाती?फिर भी Docker के ज़रिए risky configuration deploy की गई, इसलिए ज़िम्मेदारी Bitwarden की ही है। लगता है Bitwarden ने यह माना भी और बाद में इसे ठीक किया
मूर्खतापूर्ण सवाल के लिए माफ़ी। क्या सही directory और file ownership होने पर ऐसी traversal रुक नहीं जानी चाहिए?
अगर nginx root के रूप में नहीं चल रहा है, तो nginx user उन फ़ाइलों के अलावा दूसरी फ़ाइलें कैसे पढ़ सकता है जो उसे स्पष्ट रूप से assign की गई हों?
go-rwxलगाइए, और “static” files का groupwww-dataरखकर सिर्फg+rदीजिए, तो webserver app files तक पहुँच नहीं पाएगायह सचमुच app hosting 101 है, और 20 साल पहले भी लोग ऐसा ही करते थे
/homeके नीचे जैसी महत्वपूर्ण directories पर तो ऐसा होना ही चाहिएgroup membership के साथ थोड़ा और काम करना पड़ सकता है, लेकिन यह पूरी तरह से इसके लायक है
शायद मैं वाकई बहुत बुरी तरह गड़बड़ कर रहा हूँ। आह
www-dataजैसे user को स्पष्ट रूप से assign करने की भी ज़रूरत नहीं होती। अगर application sensitive data बनाती है, तो निश्चित रूप से 077 umask इस्तेमाल करना बेहतर हैदुर्भाग्य से nginx और दूसरे web servers को सामान्य web applications में अक्सर root के रूप में चलना पड़ता है। क्योंकि उन्हें 80 या 443 port पर listen करना होता है। 1024 से कम ports केवल root ही खोल सकता है
और विस्तार से यहाँ समझाया गया है: https://unix.stackexchange.com/questions/134301/why-does-ngi...