अनुमतियाँ और स्लॉट¶
प्लगइन बनाने वालों के लिए: manifest क्या बता सकता है, इंस्टॉलर क्या जाँचता है, और चलते समय प्लगइन पर कौन से नियम लागू होते हैं। नीचे की सूची वह है जिसमें से आप चुनते हैं; सर्वर प्लगइन को कैसे सीमित रखता है, और यह सीमा क्या नहीं रोक सकती, यह प्लगइन सैंडबॉक्स और ख़तरा मॉडल में बताया गया है।
इंस्टॉल के समय क्या जाँचा जाता है¶
प्लगइन इंस्टॉल के समय मना हो जाता है, जब:
kindनहीं है, या नpluginहै नtheme;kind: pluginमेंlanguageयाentrypointनहीं है, याkind: themeइन्हें बताता है, याpermissionsयाcapabilitiesबताता है;- कोई अनुमति या क्षमता अनजानी है;
- कोई फ़्रंटएंड मॉड्यूल स्लॉट की सूची से बाहर का स्लॉट चुनता है;
external_fetchकी कोई एंट्री fetch के नियम तोड़ती है, याnetworkबिना किसी एंट्री के बताया गया है;- ZIP extraction की सीमाएँ तोड़ता है;
- स्थैतिक विश्लेषण में कोई गंभीर पैटर्न मिलता है, या कोई ऐसी चेतावनी जिसे
इंस्टॉलर गंभीर ही मानता है (असुरक्षित deserialization, obfuscation)। compiled
binary, अंदर रखे आर्काइव और native code मना होते हैं, जब तक manifest
native-binaryन बताए।
विश्लेषण से पहले comment हटा दिए जाते हैं, इसलिए comment में बंद की गई लाइन दर्ज नहीं होती। श्रेणियों की सूची प्लगइन सैंडबॉक्स और ख़तरा मॉडल में है।
इंस्टॉल करने से पहले एडमिन बताई गई अनुमतियाँ और क्षमताएँ देखता है, और यह भी कि विश्लेषण में क्या मिला; स्लॉट, होस्ट और सिग्नेचर अपडेट के समय और सुरक्षा डैशबोर्ड पर दिखते हैं। प्लगइन जो भी बताता है, उसमें से कुछ भी चुपचाप नहीं दिया जाता।
प्लगइन किन सीमाओं में चलता है¶
manifest कुछ भी बताए:
- प्लगइन अपना फ़ोल्डर देखता है, सर्वर का डेटा नहीं;
- उसके पास सीधा नेटवर्क नहीं होता:
networkअनुमति वाला प्लगइन अपनीexternal_fetchसूची के होस्ट तक होस्ट केFetchकॉल से पहुँचता है, और कहीं नहीं; subprocessके बिना वह child process शुरू नहीं कर सकता (thread काम करते हैं);- वह संसाधनों की उन सीमाओं में चलता है जिन्हें एडमिन बदल सकता है: डिफ़ॉल्ट रूप से 256 MiB मेमोरी, 64 प्रोसेस और thread, उसके फ़ोल्डर के लिए 100 MiB डिस्क, और कम CPU प्राथमिकता।
डेवलपमेंट के दौरान सिग्नेचर वैकल्पिक है। प्लगइन पर सिग्नेचर कैसे करें, और सर्वर कौन सी सिग्नेचर नीति लागू कर सकता है: प्लगइन लिखना।
अनुमतियों की सूची¶
अनुमति permissions में बताई जाती है; कोई और मान इंस्टॉल मना करवा देता है।
वेबहुक पाना (webhook.receiver) और मेटाडेटा देना (metadata.provider) क्षमताएँ
हैं, जो capabilities में बताई जाती हैं: देखें
प्लगइन API संदर्भ।
| अनुमति | यह क्या देती है |
|---|---|
network |
बैकएंड Fetch कॉल कर सकता है। इसके साथ खाली न हो ऐसी external_fetch सूची होनी चाहिए; उसके बिना इंस्टॉल के समय मना। प्रोसेस के पास खुद फिर भी कोई socket नहीं होता। |
subprocess |
बैकएंड child process शुरू कर सकता है। इसके बिना launcher का kernel फ़िल्टर fork, vfork और CLONE_THREAD के बिना clone को मना करता है, और interpreter वाले प्लगइन के लिए seccomp shim execve को मना करता है। thread दोनों हालत में काम करते हैं। एडमिन को एक अलग चेतावनी दिखती है। |
native-binary |
पैकेज में .so, .dll, .exe, .wasm, .jar, अंदर रखे आर्काइव या ऐसा native code हो सकता है जिसे विश्लेषण पढ़ नहीं सकता। एडमिन को ऐसा कोड दिखता है जिसे पढ़ा नहीं जा सकता, और उसे यह स्वीकार करना होता है। go प्लगइन के लिए ज़रूरी। |
filesystem |
प्लगइन के फ़ोल्डर के बाहर फ़ाइल सिस्टम छूने का बताया गया इरादा। दर्ज होता है और एडमिन को दिखाया जाता है; सैंडबॉक्स प्लगइन के फ़ोल्डर के बाहर कोई फ़ाइल पहुँच नहीं देता, चाहे कुछ भी बताया गया हो। |
media.read |
होस्ट पर GetMediaItem और ListMediaItems: मीडिया का पूरा रिकॉर्ड। |
media.write |
मेटाडेटा लिखने वाले कॉल के लिए आरक्षित, जो आज दिए नहीं जाते। |
api.library |
media.read वाले ही मीडिया पढ़ने के कॉल। |
api.user |
GetUserPreferences के लिए आरक्षित, जो आज दिया नहीं जाता। |
api.metadata |
UpdateMetadata के लिए आरक्षित, जो आज दिया नहीं जाता। |
notification.sender |
SendNotification के लिए आरक्षित, जो आज दिया नहीं जाता। |
public |
इंटरफ़ेस मीडिया आइटम की एक सुरक्षित झलक पढ़ सकता है (id, टाइटल, टाइप, साल, सारांश, पोस्टर), कभी रास्ते या stream नहीं। देखें evey.media.*। |
prefs |
इंटरफ़ेस मौजूदा उपयोगकर्ता की पसंद प्लगइन के अपने हिस्से में पढ़ और लिख सकता है। देखें evey.prefs.*। |
hardware.gpu |
प्रोसेस को होस्ट का DRM render node मिलता है (असली renderD1xx, कभी card node नहीं)। यह kernel driver पर हमले का एक रास्ता है, और transcoder के साथ बँटी GPU मेमोरी की एक सीमा: अटका हुआ GPU ट्रांसकोडिंग रोक सकता है। इसके बिना GPU node Landlock की अनुमति सूची से पूरी तरह बाहर रहते हैं; इसके साथ launcher उसी एक फ़ाइल तक सीमित एक IOCTL_DEV नियम जोड़ता है (Landlock ABI 5 या नया; पुराने kernel पर सिर्फ़ पढ़ने और लिखने की पहुँच से ही command भेजे जा सकते हैं)। प्लगइन इंस्टॉल होने के बाद सुरक्षा डैशबोर्ड एक गंभीर चेतावनी दिखाता है। यह सिर्फ़ उन प्लगइन को दें जिन्हें आप सैंडबॉक्स के बाहर भी चला लेते। |
External fetch के नियम¶
external_fetch: [...] में बताए जाते हैं और इंस्टॉल के समय जाँचे जाते हैं
(validateExternalFetch)। सब या कुछ नहीं: एक भी गलत एंट्री पूरा इंस्टॉल मना करवा
देती है।
एंट्री एक होस्ट का नाम है। आगे लगा scheme और अंत का path पार्स के समय हटा दिए
जाते हैं; सिर्फ़ होस्ट का नाम रखा जाता है। होस्ट ठीक-ठीक मिलने चाहिए, *.example.com
जैसा wildcard इंस्टॉल पर मना हो जाता है और port का suffix अनदेखा किया जाता है।
| एंट्री | मान्य | कारण |
|---|---|---|
api.tmdb.org |
हाँ | होस्ट का पूरा नाम, सामान्य रूप |
https://api.tmdb.org |
हाँ | scheme और path पार्स के समय हटा दिए जाते हैं, होस्ट का नाम रहता है |
*.tmdb.org |
नहीं | wildcard इंस्टॉल पर मना हो जाते हैं; हर होस्ट अलग से लिखें |
* |
नहीं | अकेला wildcard मना है |
192.168.1.1, ::1 |
नहीं | IP मना हैं, दोनों तरह के |
चलते समय होस्ट का broker अपनी सीमाएँ जोड़ता है, जिन्हें manifest बढ़ा नहीं सकता:
सिर्फ़ http और https, सिर्फ़ GET और HEAD, लक्ष्य होस्ट आपकी सूची से
बड़े-छोटे अक्षर का फ़र्क किए बिना मिलाया जाता है (एंट्री में :port अंत में हो तो
अनदेखा होता है), DNS से पता निकालने के बाद निजी या आरक्षित पते मना, body 8 MiB
तक और request 20 सेकंड तक सीमित। redirect को सूची और पते वाले नियम, दोनों से
फिर से जाँचा जाता है।
वही होस्ट सूची, आगे https:// लगाकर, प्लगइन के फ़्रेम का connect-src बनती है:
विजेट उन होस्ट को सीधे कॉल कर सकता है, सिर्फ़ https पर।
स्लॉट की अनुमति सूची¶
प्लगइन इंटरफ़ेस सिर्फ़ उन स्लॉट में डाल सकते हैं जिनकी साफ़ अनुमति है। संवेदनशील रास्ते जानबूझकर इसमें नहीं हैं।
| स्लॉट | साइन-इन ज़रूरी | टिप्पणी |
|---|---|---|
home.section |
हाँ | मुख्य पेज का कंटेंट वाला हिस्सा |
home.hero |
हाँ | सबसे ऊपर वाला बड़ा बैनर |
library.sidebar |
हाँ | लाइब्रेरी पेज का साइडबार |
media.detail.sidebar |
हाँ | मीडिया के जानकारी वाले पेज का साइडबार |
player.overlay |
हाँ | प्लेयर के ऊपर की परत |
settings.user.appearance |
हाँ | उपयोगकर्ता सेटिंग्स में रूप-रंग वाला हिस्सा |
sidebar.bottom |
हाँ | नेविगेशन साइडबार का निचला हिस्सा |
admin.nav |
हाँ | एडमिन पैनल में एक मेन्यू एंट्री, जो प्लगइन का अपना सैंडबॉक्स वाला पेज खोलती है; यह मौजूदा एडमिन स्क्रीन में कुछ नहीं डालती |
कभी अनुमति नहीं: admin.* (admin.nav को छोड़कर), login.*, setup.*,
profile.security.*। ये रास्ते साइन-इन या अधिकारों के लिए अहम हैं, और वहाँ कुछ
डालना अधिकार बढ़ाने या phishing का रास्ता है।
admin.nav का कंटेंट भी बाकी स्लॉट की तरह सैंडबॉक्स में है: यह
allow-same-origin के बिना एक <iframe sandbox="allow-scripts"> में बनता है, ऐसे
पेज में जिसकी नीति default-src 'none' है, इसलिए यह एडमिन वाले हिस्से में दिखाया
गया किसी तीसरे पक्ष का कंटेंट है, प्लगइन को दिया गया कोई एडमिन अधिकार नहीं।
bridge सीमित करता है कि फ़्रेम पेज से क्या माँग सकता है: evey.toast एक सेकंड में
ज़्यादा से ज़्यादा 3 संदेश, 200 अक्षर, कोई HTML नहीं; evey.navigate सिर्फ़
/home, /library, /media, /player, /settings और /search; evey.resize
50-800 px के बीच। फ़्रेम के पास कोई token नहीं होता: public और prefs कॉल के
लिए होस्ट (प्लगइन, उपयोगकर्ता) तक सीमित पाँच मिनट का एक token बनाता है, और सर्वर
डिफ़ॉल्ट रूप से हर वह method मना करता है जिसका नाम उस token में नहीं है।
अपडेट का तरीका¶
- एडमिन एक नया ZIP अपलोड करता है।
PreviewPluginUpdateस्थैतिक विश्लेषण और सिग्नेचर की जाँच चलाता है, और इंस्टॉल किए गए वर्ज़न से अनुमतियों, क्षमताओं, स्लॉट औरexternal_fetchका फ़र्क लौटाता है। - अगर फ़र्क खाली नहीं है, तो अपडेट लागू होने से पहले एडमिन को उसे स्वीकार करना
होता है (
requires_ack = true; अपलोड route से,accept_permission_changes=true)। - पैकेज का hash पूर्वावलोकन के समय लिया जाता है और लागू करते समय जाँचा जाता है: जिस ZIP का विश्लेषण हुआ, वही इंस्टॉल होता है।
- साइनिंग कुंजी की निरंतरता जाँची जाती है: इंस्टॉल किए गए वर्ज़न से अलग कुंजी
से साइन किया हुआ, या अब साइन न किया हुआ अपडेट तब तक मना रहता है जब तक एडमिन
नया प्रकाशक स्वीकार नहीं करता।
EVEY_PLUGINS_COSIGN_POLICY=enforceमें, लागू करने वाले कदम पर भरोसे से बाहर या अमान्य सिग्नेचर अपडेट रोक देता है, भले ही पूर्वावलोकन पास हो गया हो।