InfoSec टीमों और ऐप रिव्यूअर्स के लिए
Peel में सुरक्षा
संक्षेप में: बोर्ड का कंटेंट ब्राउज़र में एक ऐसी की से एन्क्रिप्ट होता है जो लिंक के फ़्रैगमेंट में रहती है, इसलिए हमारे सर्वर ऐसा सिफ़रटेक्स्ट स्टोर और आगे भेजते हैं जिसे वे पढ़ नहीं सकते। यह ठीक-ठीक कैसे होता है, और इसकी सीमाएँ कहाँ हैं, यहाँ बताया गया है।
सारांश
- कार्ड का टेक्स्ट, नाम, बोर्ड टाइटल, वोट और स्टिकर ब्राउज़र में बनी बोर्ड की से AES-256-GCM द्वारा एन्क्रिप्ट होते हैं। की URL फ़्रैगमेंट (
#k=) में चलती है और कभी किसी सर्वर को नहीं भेजी जाती। - फैसिलिटेटर के एक्शन, बोर्ड हेडर और स्नैपशॉट फैसिलिटेटर की Ed25519 की से साइन होते हैं। बोर्ड id उसी की से निकाली जाती है, इसलिए क्लाइंट की बदले जाने को पकड़ लेते हैं।
- छिपे कार्ड रिवील तक फैसिलिटेटर के लिए सील (X25519 sealed box) रहते हैं, और salted commitments से बँधे होते हैं ताकि रिवील हुआ टेक्स्ट बदला न जा सके।
- डिफ़ॉल्ट रूप से गुमनाम: ऑपरेशंस में लेखक की कोई id नहीं होती; वोट और रिएक्शन हर बोर्ड की एक रैंडम id इस्तेमाल करते हैं।
- पार्टिसिपेंट्स कभी ऑथेंटिकेट नहीं करते। न एनालिटिक्स SDK, न ऐड, न कोई थर्ड-पार्टी स्क्रिप्ट, सिवाय चेकआउट पेज पर Paddle.js के।
- सिर्फ़ Cloudflare। जिन बोर्ड पर किसी अकाउंट ने दावा नहीं किया, वे आख़िरी विज़िट के 60 दिन बाद डिलीट हो जाते हैं।
डेटा कैसे चलता है
URL का फ़्रैगमेंट (# के बाद सब कुछ) ब्राउज़र संभालता है और यह HTTP रिक्वेस्ट का हिस्सा नहीं होता। Peel बोर्ड की की वहीं रखता है।
थ्रेट मॉडल
हमारा डिज़ाइन ऐसा है कि पूरी तरह से हैक हुआ या जिज्ञासु सर्वर, हम ख़ुद भी, यह कम से कम जान पाए कि टीम क्या कहती है।
हम क्या सुरक्षित रखते हैं
- कार्ड का टेक्स्ट, चुने गए GIF और, नाम वाले मोड में, लेखक का नाम।
- पार्टिसिपेंट्स के नाम और अवतार, बोर्ड का नाम और कस्टम टेम्पलेट टाइटल।
- किसने किस पर वोट या रिएक्ट किया, और कौन-सा कार्ड किसने लिखा।
- रेट्रो की इंटेग्रिटी: स्टेप, रिवील और फैसिलिटेटर के फ़ैसले जाली नहीं बनाए जा सकते।
किन ख़तरों को ध्यान में रखते हैं
- हमारे अपने सर्वर, कोई बदनीयत अंदरूनी व्यक्ति, या कोई जो हमारे स्टोरेज में सेंध लगाए: उन्हें सिफ़रटेक्स्ट और मेटाडेटा ही मिलता है।
- नेटवर्क अटैकर: हर जगह TLS; की कभी नेटवर्क पार नहीं करती।
- की बदलने वाला सर्वर: बोर्ड id फैसिलिटेटर की पब्लिक की से निकाली जाती है, और क्लाइंट साइन किया हुआ हेडर वेरिफ़ाई करते हैं।
- झाँकना या जालसाज़ी करना चाहने वाला पार्टिसिपेंट: छिपे कार्ड फैसिलिटेटर के लिए सील होते हैं; फैसिलिटेटर ऑपरेशंस के लिए फैसिलिटेटर का सिग्नेचर चाहिए; कार्ड एडिट के लिए कार्ड की की चाहिए।
- ऑफ़लाइन लेखक की जगह दोबारा पब्लिश करने वाले फैसिलिटेटर: commitments उन्हें टेक्स्ट बदलने से रोकते हैं।
दायरे से बाहर, ईमानदारी से
- जिसके पास पार्टिसिपेंट लिंक है, वह बोर्ड पढ़ सकता है। लिंक ही एक्सेस कंट्रोल है। इसे बोर्ड जितनी ही सावधानी से शेयर करें।
- हैक हुआ डिवाइस, कोई बदनीयत ब्राउज़र एक्सटेंशन, या कोई जो आपके कंधे के ऊपर से झाँक रहा हो।
- ट्रैफ़िक एनालिसिस: सर्वर समय, साइज़ और गिनती देखता है (डेटा मैप देखें)।
- सर्वर की ओर से डिनायल ऑफ़ सर्विस: वह मैसेज रोक या देर कर सकता है, पर पढ़ या जाली नहीं बना सकता।
क्रिप्टोग्राफ़ी
सारे प्रिमिटिव ब्राउज़र के WebCrypto API से आते हैं। न कोई कस्टम क्रिप्टोग्राफ़ी, न थर्ड-पार्टी क्रिप्टो लाइब्रेरी।
| की | एल्गोरिदम | किस काम के लिए |
|---|---|---|
| K_board | AES-256-GCM, 96-बिट रैंडम IV | हर ऑपरेशन, स्नैपशॉट और प्रेज़ेंस अपडेट को एन्क्रिप्ट करती है। additional data बोर्ड id, ऑपरेशन टाइप और ऑपरेशन id को बाँधता है, ताकि सिफ़रटेक्स्ट को किसी दूसरे बोर्ड या स्लॉट में दोबारा न चलाया जा सके। सिर्फ़ लिंक फ़्रैगमेंट #k= में रहती है। |
| K_owner | Ed25519 | फैसिलिटेटर का अधिकार। फैसिलिटेटर ऑपरेशंस (स्टेप, टाइमर, स्पॉटलाइट, टेम्पलेट, सेटिंग्स, वोट खोलना, कार्ड छिपाना), बोर्ड हेडर और स्नैपशॉट पर साइन करती है। लगातार बढ़ता काउंटर रीप्ले रोकता है। सिर्फ़ फैसिलिटेटर लिंक में (&o=)। |
| बोर्ड id | SHA-256, पहले 80 बिट, base32 | फैसिलिटेटर की पब्लिक की से निकाली जाती है, इसलिए id ख़ुद साबित करती है कि बोर्ड किस की का है। अगर हेडर की की हैश id से मेल न खाए, तो क्लाइंट उसे रिजेक्ट कर देते हैं। |
| K_fac | X25519 sealed box: ephemeral X25519 + HKDF-SHA256 + AES-256-GCM | लोग जब लिख रहे होते हैं, छिपे कार्ड फैसिलिटेटर की पब्लिक की के लिए सील होते हैं। उन्हें सिर्फ़ फैसिलिटेटर लिंक (&f=) खोल सकता है। |
| कार्ड कीज़ | Ed25519, हर कार्ड के लिए एक की | सिर्फ़ लेखक के पास रहती है। एडिट और रिवील इसी से साइन होते हैं: पहचान बताए बिना प्रामाणिकता। |
| Commitments | 128-बिट रैंडम salt के साथ HMAC-SHA256 | छिपा कार्ड अपने कंटेंट का एक commitment पब्लिश करता है। रिवील पर कंटेंट और salt पब्लिश होते हैं और हर क्लाइंट उन्हें जाँचता है, इसलिए कोई टेक्स्ट बदल नहीं सकता। |
| प्रेज़ेंस | K_board के तहत AES-256-GCM | नाम, अवतार और टाइपिंग इंडिकेटर भी बाकी सब की तरह एन्क्रिप्ट होते हैं। |
| की बंडल | पासकी PRF या रिकवरी कोड से HKDF-SHA256, AES-256-GCM | साइन इन किए हुए फैसिलिटेटर डिवाइसों के बीच बोर्ड कीज़ सिंक कर सकते हैं। बंडल डिवाइस पर ही एन्क्रिप्ट होता है; सर्वर सिर्फ़ सिफ़रटेक्स्ट और रैप की गई कीज़ स्टोर करता है। |
साइनिंग मैसेज डोमेन-सेपरेटेड होते हैं (जैसे peel/sig/v1, peel/header/v1, peel/snap/v1), ताकि एक काम का सिग्नेचर किसी दूसरे काम में दोबारा इस्तेमाल न हो सके।
गुमनामी
- ऑपरेशंस में लेखक की कोई id नहीं होती। सर्वर किसी कार्ड को किसी व्यक्ति से नहीं जोड़ सकता, और डिफ़ॉल्ट रूप से फैसिलिटेटर भी नहीं।
- वोट और रिएक्शन हर बोर्ड की एक रैंडम id से जुड़े होते हैं, जो किसी नाम से लिंक नहीं होती।
- टाइपिंग इंडिकेटर बताते हैं कि कोई लिख रहा है, यह कभी नहीं कि क्या।
- नाम वाला मोड बोर्ड की एक साफ़ सेटिंग है; तब लेखक का नाम एन्क्रिप्टेड कार्ड के अंदर चलता है।
- पार्टिसिपेंट्स कभी साइन इन नहीं करते, इसलिए जोड़ने के लिए कोई अकाउंट ही नहीं है।
डेटा मैप
हमारे पास जो कुछ है, वह कहाँ रहता है, कौन पढ़ सकता है और कितने समय तक रहता है।
| डेटा | कहाँ | कौन पढ़ सकता है | कब तक |
|---|---|---|---|
| कार्ड, वोट, रिएक्शन, स्टिकर, एक्शन, बोर्ड का नाम, कस्टम टेम्पलेट टाइटल | Durable Object स्टोरेज, सिफ़रटेक्स्ट के रूप में | जिनके पास बोर्ड का लिंक है | बोर्ड डिलीट होने तक |
| ऑपरेशन एनवेलप: टाइप, सर्वर सीक्वेंस और समय, साइज़, फैसिलिटेटर काउंटर | Durable Object स्टोरेज | Peel | बोर्ड डिलीट होने तक |
| पार्टिसिपेंट्स के नाम, अवतार, टाइपिंग | सिफ़रटेक्स्ट के रूप में रिले; कनेक्ट रहने तक मेमोरी में | जिनके पास बोर्ड का लिंक है | कनेक्ट रहने तक |
| बोर्ड स्टेटस: स्टेप, पार्टिसिपेंट और कार्ड की गिनती, कैटलॉग टेम्पलेट id, लॉक फ़्लैग, बनने और एक्सपायर होने का समय | Durable Object, D1; इंस्टॉल हो तो Slack/Teams मैसेज | Peel; आपका Slack/Teams चैनल | बोर्ड की उम्र तक |
| फैसिलिटेटर अकाउंट: प्रोवाइडर id, नाम, ईमेल (अगर शेयर किया हो), लिंक किए गए प्रोवाइडर, बनने की तारीख़, सेशन | D1 | Peel | जब तक आप अकाउंट डिलीट न करें |
| की बंडल और रैप की गई कीज़ | D1, सिफ़रटेक्स्ट के रूप में | सिर्फ़ आप (पासकी या रिकवरी कोड) | जब तक आप अकाउंट डिलीट न करें |
| प्लान, सब्सक्रिप्शन स्टेटस, Paddle कस्टमर और सब्सक्रिप्शन ids | D1; Paddle | Peel, Paddle | जितना टैक्स क़ानून माँगे |
| Slack/Teams वर्कस्पेस, चैनल और मैसेज ids; बॉट टोकन (AES-GCM से एन्क्रिप्टेड) | D1 | Peel | अनइंस्टॉल होने तक |
| IP एड्रेस | Cloudflare एज पर, कुछ पल के लिए (डिलीवरी, रेट लिमिट) | Cloudflare, Peel का रेट लिमिटर | हमारे डेटाबेस में स्टोर नहीं होता |
| रोज़ाना के काउंटर (बनाए गए बोर्ड, पूरे हुए स्टेप) | D1 | Peel | सिर्फ़ कुल संख्या, कोई पहचान नहीं |
हमारा सर्वर क्या कर सकता है और क्या नहीं
यह कर सकता है
- ऑपरेशन टाइप, साइज़, टाइमिंग, स्टेप, पार्टिसिपेंट और कार्ड की गिनती, कैटलॉग टेम्पलेट id और लॉक फ़्लैग देखना।
- ऑपरेशंस को गिराना, देर करना या डिलीवर करने से मना करना (डिनायल ऑफ़ सर्विस)।
- नेटवर्क एज पर IP एड्रेस देखना।
- बोर्ड और पूरे हुए स्टेप गिनना, कुल संख्या में।
- बोर्ड डिलीट करना (एक्सपायरी, दुरुपयोग की रिपोर्ट)।
यह नहीं कर सकता
- कार्ड का टेक्स्ट, नाम, बोर्ड टाइटल, कस्टम टेम्पलेट टाइटल, वोट या स्टिकर पढ़ना।
- रिवील से पहले छिपे कार्ड पढ़ना (उसके बाद भी नहीं)।
- फैसिलिटेटर के एक्शन जाली बनाना: उनके लिए फैसिलिटेटर का सिग्नेचर चाहिए।
- अपनी कीज़ घुसाना: बोर्ड id पोल खोल देती है।
- कार्ड का रिवील हुआ टेक्स्ट बदलना: commitments और कार्ड सिग्नेचर पोल खोल देते हैं।
- यह बताना कि कौन-सा कार्ड किसने लिखा।
किसी भी वेब ऐप की तरह, आप उस कोड पर भरोसा करते हैं जो हम सर्व करते हैं। हम उस दायरे को छोटा रखते हैं: सख़्त Content Security Policy, script-src सिर्फ़ हमारे अपने origin तक, कोई थर्ड-पार्टी स्क्रिप्ट नहीं, और प्रोटोकॉल अनुरोध पर रिव्यू के लिए उपलब्ध है।
Slack और Microsoft Teams
- मैसेज में बोर्ड का लिंक और मेटाडेटा (टाइटल, स्टेप, गिनती) होता है। कार्ड का टेक्स्ट तभी भेजा जाता है जब फैसिलिटेटर समरी पोस्ट करें और कन्फ़र्म करें।
- Join कार्ड में पार्टिसिपेंट लिंक होता है, जिसमें की शामिल है। जो भी उस चैनल को पढ़ सकता है, वह जुड़ सकता है, बिल्कुल वहाँ लिंक पेस्ट करने की तरह।
- लिंक अनफ़र्ल सिर्फ़ स्टेप और गिनती दिखाते हैं, कंटेंट कभी नहीं।
- Slack स्कोप:
commands,chat:write,links:read,links:write;users:readसिर्फ़ तब जब कोई टीम मेंशन चालू करे। - बॉट टोकन स्टोरेज में एन्क्रिप्टेड रहते हैं (AES-GCM, की Worker secret के रूप में)। हर रिक्वेस्ट पर Slack रिक्वेस्ट सिग्नेचर और Bot Framework टोकन वेरिफ़ाई होते हैं।
- ऐप अनइंस्टॉल करने पर सारी पोस्टिंग रुक जाती है और उसके टोकन डिलीट हो जाते हैं।
वेब और इंफ़्रास्ट्रक्चर
- सिर्फ़ Cloudflare: 1801 Labs अकाउंट पर Pages, Workers, Durable Objects, D1, R2 और KV। कोई दूसरा सर्वर नहीं।
- हर जगह TLS, HSTS, और सख़्त Content Security Policy।
- न एनालिटिक्स SDK, न ऐड, न थर्ड-पार्टी स्क्रिप्ट। एकमात्र अपवाद Paddle.js है, जो सिर्फ़ चेकआउट पेज पर लोड होता है।
- एक ही कुकी, सिर्फ़ साइन इन किए हुए फैसिलिटेटर के लिए:
peel_session, httpOnly, Secure, SameSite=Lax। - GIF सर्च और मीडिया हमारे API से होकर जाते हैं, इसलिए पार्टिसिपेंट्स के IP एड्रेस कभी GIPHY तक नहीं पहुँचते।
- फ़ॉन्ट और एसेट हमारे अपने सर्वर पर होस्ट हैं। न CDN फ़ॉन्ट, न ट्रैकिंग पिक्सेल।
- हर IP और हर बोर्ड पर रेट लिमिट; दुरुपयोग की रिपोर्ट और फैसिलिटेटर लॉक।
अकाउंट और डेटा रिटेंशन
- पार्टिसिपेंट्स कभी ऑथेंटिकेट नहीं करते। फैसिलिटेटर Google (या Teams के ज़रिए Entra ID) से सिर्फ़ बोर्ड रखने या पेड फ़ीचर्स के लिए साइन इन करते हैं।
- अकाउंट में एक id, प्रोवाइडर से मिला नाम और ईमेल, और एक एन्क्रिप्टेड की बंडल होता है जो पासकी (WebAuthn PRF) या रिकवरी कोड से अनलॉक होता है। साइन इन करने से मालिकाना हक़ मिलता है, कंटेंट तक पहुँच नहीं।
- बोर्ड पर दावा करते समय मालिकाना हक़ फैसिलिटेटर सिग्नेचर से साबित होता है। बोर्ड कीज़ कभी नहीं भेजी जातीं।
- बिना अकाउंट वाले बोर्ड आख़िरी विज़िट के 60 दिन बाद डिलीट हो जाते हैं; हर विज़िट पर घड़ी फिर से शुरू होती है। Durable Object अलार्म स्टोरेज डिलीट करते हैं।
- अकाउंट डिलीट करने पर सेशन, की बंडल और आपकी लाइब्रेरी डिलीट हो जाती है, और आपके बोर्ड पर फिर से 60 दिन की एक्सपायरी लागू हो जाती है।
रिस्पॉन्सिबल डिस्क्लोज़र
कुछ मिला? पहले हमें बताइए, हम आपके साथ मिलकर काम करेंगे। हम तीन कामकाजी दिनों के अंदर रिपोर्ट की पुष्टि करते हैं।
- कृपया सार्वजनिक करने से पहले हमें ठीक करने के लिए उचित समय दें (हमारा लक्ष्य 90 दिन है)।
- अपने ख़ुद के बोर्ड और अकाउंट से टेस्ट करें। दूसरों का डेटा एक्सेस न करें और सर्विस को नुकसान न पहुँचाएँ।
- इन नियमों का पालन करते हुए नेक इरादे से की गई रिसर्च पर हम कोई क़ानूनी कार्रवाई नहीं करेंगे।
- मशीन से पढ़ा जा सकने वाला संपर्क:
/.well-known/security.txt।
Company प्लान के ग्राहकों को सिक्योरिटी रिव्यू पैक मिलता है (प्रश्नावली के जवाब, सब-प्रोसेसर, डेटा फ़्लो)। DPA · प्राइवेसी