3 पॉइंट द्वारा GN⁺ 2024-11-25 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • Daniel Mangum ने AT Protocol की blob upload और record reference संरचना का उपयोग करके दिखाया कि Bluesky PDS पर अपलोड की गई text/html फ़ाइल को ब्राउज़र में खुलने वाले वेबपेज की तरह उपलब्ध कराया जा सकता है
  • मुख्य व्यवहार यह है कि अपलोड किया गया blob तुरंत सार्वजनिक नहीं होता; PDS उसे सार्वजनिक रूप से सुलभ तभी बनाता है जब कोई record उस blob को refer करे
  • सामान्य Bluesky image embed केवल image/* MIME type की अनुमति देता है, लेकिन अज्ञात lexicon के record या open union आधारित custom embed text/html blob reference को store कर सकते हैं
  • getBlob बिना authentication के सुलभ है, और bsky.social के अनुरोध असली PDS porcini.us-east.host.bsky.network पर redirect होकर HTML लौटाते हैं
  • Bluesky getBlob पर CSP header और nosniff लागू करता है और default blob upload को 5MB तक सीमित करता है, लेकिन PDS hosting service पर मनमानी फ़ाइल hosting और storage·transfer cost का बोझ फिर भी बना रहता है

AT Protocol blob के साथ वेबसाइट अपलोड करने का तरीका

  • यह उदाहरण Bluesky app की सामान्य सुविधा से अधिक AT Protocol और PDS API के काम करने के तरीके पर आधारित है
  • Bluesky उपयोगकर्ता के PDS तक पहुँचने के लिए PDS entryway उपलब्ध कराता है, और कई PDS instances को bsky.social domain के ज़रिए expose करता है
  • अलग-अलग PDS instances तक सीधे भी पहुँचा जा सकता है, और उदाहरण वेबसाइट porcini.us-east.host.bsky.network के com.atproto.sync.getBlob endpoint पर खुलती है
  • लेख प्रकाशित करने से पहले Bluesky टीम से बातचीत हुई थी; यह व्यवहार application के इच्छित उपयोग जैसा नहीं है, लेकिन यह ज्ञात व्यवहार है और यह vulnerability disclosure प्रक्रिया नहीं है

records और blobs अलग क्यों हैं

  • AT Protocol में application data को बड़े तौर पर records और blobs में बाँटा जाता है
    • records वे मुख्य entities हैं जिन्हें उपयोगकर्ता बनाते हैं, और उनमें structure तथा metadata हो सकते हैं
    • blobs images जैसे बड़े unstructured data होते हैं, और आमतौर पर उन्हें expose करने के लिए किसी record का reference ज़रूरी होता है
  • Bluesky में image शामिल पोस्ट बनाते समय यह उपयोगकर्ता को एक ही action जैसा दिखता है, लेकिन API स्तर पर blob upload और record creation अलग-अलग होते हैं
  • blob specification के अनुसार blob को किसी record द्वारा reference किए जाने से पहले PDS पर अपलोड करना होता है
  • server upload के समय यह नहीं जान सकता कि blob किस Lexicon में इस्तेमाल होगा, इसलिए शुरुआती upload पर केवल सामान्य blob restrictions लागू होती हैं और record creation के समय Lexicon-आधारित restrictions लागू होती हैं
  • सफलतापूर्वक अपलोड किया गया blob अस्थायी storage में जाता है; इस स्थिति में उसे download या distribute नहीं किया जा सकता और वह listBlobs output में भी शामिल नहीं होता
  • record creation सफल होने और उस record द्वारा blob को reference किए जाने पर server blob को publicly accessible स्थिति में बदल देता है

HTML blob upload और public करना

  • authentication token, com.atproto.server.createSession XRPC method के ज़रिए user credentials के exchange से प्राप्त किया जाता है
  • उदाहरण में com.atproto.sync.listBlobs से मौजूदा blobs की संख्या देखी गई, और upload से पहले यह 391 थी
  • वेबसाइट का body एक साधारण index.html फ़ाइल था, जिसे com.atproto.repo.uploadBlob से upload किया गया
    • Content-Type था text/html
    • लौटाए गए blob metadata में CID bafkreic5fmelmhqoqxfjz2siw5ey43ixwlzg5gvv2pkkz7o25ikepv4zeq, mimeType: text/html, size: 268 शामिल थे
  • upload के तुरंत बाद com.atproto.sync.getBlob से उसे लाने की कोशिश करने पर access नहीं मिला, और listBlobs की संख्या भी 391 ही रही
  • यदि Bluesky पोस्ट के image embed में HTML blob को reference किया जाए, तो app.bsky.embed.image schema image/* MIME type माँगता है, इसलिए यह विफल हो जाता है
    • text/html को वैसे ही रखने पर Wrong type of file. It is text/html but it must match image/*. त्रुटि आती है
    • mimeType को image/jpeg में बदलने पर stored blob MIME type और reference MIME type के अलग होने की त्रुटि आती है

अज्ञात lexicon record से blob को public करना

  • blob type, Bluesky-विशेष नहीं बल्कि AT Protocol data model का हिस्सा है
  • Bluesky PDS implementation open source है, और findBlobRefs recursive रूप से LexValue को खोजकर $type: blob references ढूँढता है
  • PDS को समय के साथ नए lexicon support करने होते हैं, इसलिए उसे ऐसे lexicon भी process करने चाहिए जिन्हें वह नहीं जानता
  • com.danielmangum.hack.website type का record बनाकर जब HTML blob को reference किया गया, तो PDS ने record को store कर लिया
    • response में validationStatus: unknown शामिल था
    • PDS com.danielmangum.hack.* lexicon को नहीं जानता था, इसलिए validation नहीं कर सका, लेकिन record storage की अनुमति दी गई
  • इसके बाद listBlobs की संख्या 392 हो गई, जिससे पुष्टि हुई कि blob स्थायी रूप से store हो गया
  • getBlob को authentication token के बिना भी call किया जा सकता है, क्योंकि records के साथ काम करने वाली unauthenticated entities को भी blobs प्राप्त करने में सक्षम होना चाहिए
  • bsky.social के getBlob call ने 302 redirect के साथ असली PDS URL लौटाया, और -L के साथ redirect follow करने पर HTML content ज्यों का त्यों वापस मिला

security headers, CDN, और direct access का बोझ

  • AT Protocol blob spec की Security Considerations arbitrary user-uploaded files को web server से serve करने पर उत्पन्न content security जोखिमों पर चर्चा करती है
    • प्रमुख उदाहरण समान origin पर script या SVG content के चलने से जुड़ा XSS है
    • getBlob endpoint पर Content Security Policy लागू करना लगभग अनिवार्य है
    • blob store को सीधे browser और web agents को उपलब्ध कराने का तरीका व्यावहारिक रूप से supported नहीं है; application को स्वतंत्र CDN, proxy, web service आदि से होकर जाना चाहिए
  • Bluesky PDS के getBlob handler में recommended security headers लागू हैं
    • x-content-type-options: nosniff
    • content-security-policy: default-src 'none'; sandbox
  • default blob upload सीमा 5MB है
  • Bluesky application के सामान्य image blobs PDS से सीधे serve नहीं होते, बल्कि cdn.bsky.app के CDN URL के माध्यम से दिए जाते हैं
    • feed thumbnail URL और full size URL अलग-अलग मौजूद होते हैं
    • post record में image CID शामिल होता है, और application को CDN serving के तरीके की जानकारी होनी चाहिए
  • getBlob direct access GitHub issue में image labeling, user content export, और future use cases के कारण बनाए रखा गया है
    • उसी चर्चा में यह संभावना भी शामिल है कि उपयोगकर्ता content को hotlink करें या Bluesky को free hosting की तरह इस्तेमाल करें
    • शुरुआती implementation में security headers नहीं थे और बाद में जोड़े गए
  • पारंपरिक social platforms में valid content types सीमित होते हैं, इसलिए upload के समय blobs पर अधिक सख्त restrictions लगाना संभव होता है, लेकिन Bluesky और AT Protocol की extensibility अधिक जटिल processing की माँग करती है

open union से पोस्ट में custom embed जोड़ना

  • app.bsky.feed.post type valid embeds की सूची को union के रूप में define करता है
  • AT Protocol lexicon में union को यदि स्पष्ट रूप से closed न किया जाए, तो वह default रूप से open होता है
    • future schema revision में type जोड़े जा सकते हैं, इसलिए implementations को validation के समय उदार होना चाहिए
    • closed flag होने पर type set स्थिर हो जाता है
  • Bluesky पोस्ट का embed union closed के रूप में चिह्नित नहीं है
  • इसलिए सूचीबद्ध न किए गए embed $type के साथ भी पोस्ट बनाया जा सकता है
  • उदाहरण में app.bsky.feed.post record के अंदर com.danielmangum.hack.sites embed डाला गया, और उसके भीतर HTML blob को reference किया गया
    • response का validationStatus valid था
    • Bluesky application में उस embed को चुपचाप नज़रअंदाज़ कर दिया गया
    • record में content और reference स्थायी रूप से store रहते हैं, इसलिए दूसरी applications इस embed को render कर सकती हैं
  • ऐसे lexicon गुणों का उपयोग मौजूदा use cases के ऊपर छोटे extensions जोड़ने के लिए किया जा सकता है, और उदाहरण के तौर पर पोस्ट के भीतर छोटे code snippets को WebAssembly sandbox में चलाने जैसी संभावना सामने आती है

1 टिप्पणियां

 
GN⁺ 2024-11-25
Hacker News की राय
  • Daniel ने टीम से सीधे संपर्क किया, इसके लिए आभार, और blob hosting ऐसा क्षेत्र है जिसे दुरुपयोग के रास्तों को बेहतर समझते हुए लगातार समायोजित करना ही पड़ेगा
    अभी के लिए इस तरह के उपयोग को वास्तव में काम करते देखना दिलचस्प है, और PDS को इस तरह डिज़ाइन किया गया है कि जैसे webserver वेबसाइट होस्ट करता है, वैसे यह database host बन सके

    • यह जानने की जिज्ञासा है कि क्या Beaker Browser को फिर से जीवित करने की कोई योजना है
      पहले उसके साथ प्रयोग करना मज़ेदार था, और यह नहीं पता था कि वह Bluesky में आ गया है, जो काफ़ी रोचक है
    • अगर content bsky जैसे किसी खास appview से गुज़रे बिना यूज़र के अपने domain से लिंक हो, तो शायद दुरुपयोग की संभावना कम हो सकती है
      Bsky पहले से यूज़र domain को redirect.bsky.com पर ALIAS के रूप में जोड़ने का समर्थन करता है: https://bsky.app/profile/jacob.gold/post/3kh6rnpdzmp2v
    • Beaker वाकई एक शानदार प्रोजेक्ट था, और लगता है कि उसका अनुभव Bluesky में काफ़ी काम आ सकता है
    • यह तरीका copyright, CSAM, porn जैसे content moderation के गड्ढे में सीधे कूदने जैसा है
  • यह किस security context में चलता है, यह जानने के लिए curl से PDS blob URL देखा गया, और response headers में access-control-allow-origin: *, content-security-policy: default-src 'none'; sandbox, x-content-type-options: nosniff आदि थे
    access-control-allow-origin: * का मतलब है कि किसी भी domain के webpage JavaScript से fetch() के ज़रिए इस content तक पहुँचा जा सकता है, जो दिलचस्प है, और default-src 'none'; sandbox एक बहुत कड़ी setting है जो अतिरिक्त scripts या images लोड नहीं होने देती और JavaScript execution भी रोकती है: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Co...
    ratelimit-limit: 3000 शायद IP-आधारित limit लगती है

    • JavaScript को पूरी तरह ब्लॉक करना या allowlist तक सीमित करना ही लगभग एकमात्र तरीका है जिससे CSP के ज़रिए app को पूरी तरह बंद रखा जा सके और data exfiltration रोकी जा सके, और अगर prefetch मौजूद हो तो शायद वह भी काफ़ी न हो
      लेख के अंत में WebAssembly के उपयोग का सुझाव सही दिशा में लगता है, और link click की समस्या को untrusted code को iframe में रखकर तथा parent में child-src के माध्यम से सिर्फ़ खास domains या data: की अनुमति देकर सीमित किया जा सकता है
      https://github.com/w3c/webappsec/issues/656#issuecomment-246...
      https://www.w3.org/TR/CSP3/#exfiltration
    • यह जानना दिलचस्प होगा कि sandbox इस्तेमाल होने पर भी default-src ज़रूरी है या यह duplicate setting है
  • Bluesky को blob data store की तरह इस्तेमाल करने की संभावना को लेकर काफ़ी उत्साह है
    एक दोस्त के साथ यह सोचा गया कि DOOM WAD को Bluesky पर स्टोर करके पोस्ट की तरह “map pack” साझा किए जा सकते हैं, और अगर accounts, lists, और starter packs को follow किया जाए, तो GZDoom जैसे client को बदलकर उन accounts द्वारा अपलोड किए गए WAD को खोजने और देखने लायक बनाया जा सकता है
    यह Steam Workshop जैसा होगा, लेकिन Bluesky के ज़रिए

    • बढ़िया विचार है, लेकिन सवाल है कि इसे self-host करने का इरादा है या Bluesky server पर अपलोड करने का
      यह भी स्पष्ट नहीं है कि Bluesky ने blob storage उपयोग के लिए guidelines का कभी ज़िक्र किया है या नहीं; DOOM files छोटे होने से अच्छा उदाहरण हैं, लेकिन यह भी जिज्ञासा है कि कहीं इसका दुरुपयोग बड़े server space को externalize करने के लिए तो नहीं हो सकता
    • आखिरकार यह Bluesky को मनमाने data के लिए RSS feed की तरह इस्तेमाल करना ही नहीं है क्या
  • मैंने यह खास दौर खुद नहीं देखा, लेकिन BlueSky users को इस तरह तकनीकी गहराई में उतरते देखना उस समय की याद दिलाता है जब लोग MySpace पर पहली बार HTML सीख रहे थे
    social media बाज़ार पहले से कहीं ज़्यादा भरा हुआ है, लेकिन यह सोचने लायक है कि क्या BlueSky से प्रोग्रामर्स की नई पीढ़ी निकल सकती है

    • MySpace और पुराने forums एक abstraction ladder देते थे: टेक्स्ट को बॉक्स में डालो और वह webpage पर दिखे, फिर images जोड़ो, फिर BBCode/markup, फिर HTML और CSS, और अंत में पूरा script लिखो
      Bluesky अभी सिर्फ़ पहला चरण देता है, और उसके बाद का कदम काफ़ी बड़ा छलांग जैसा लगता है
    • भले ही इसे “14 मिनट का” कहा गया हो, लेकिन ऐसा लगता है कि नया idea आज़माने के लिए लगभग बारह links पढ़ना ज़रूरी होगा
      अगर बात HTTP/HTML की हो, तो सिर्फ़ basic Python या किसी दूसरी programming language का थोड़ा ज्ञान रखने वाले व्यक्ति को भी 14 मिनट में शून्य से server बनाना सिखाया जा सकता है
      मेरा मानना है कि tech giants को communities का शोषण करने से रोकने के लिए hash-addressed communication protocol की ज़रूरत है, लेकिन यह भरोसा नहीं है कि AT Protocol ने अपने लक्ष्य इतने सही साधे हैं कि वह HTTP जैसी क्रांति ला सके
  • यहाँ एक अहम बात यह है कि जिस PDS की चर्चा हो रही है, वह Bluesky product itself नहीं बल्कि Personal Data Server का हिस्सा है, इसलिए नतीजे में यह असीमित मुफ़्त data storage जैसा दिख सकता है
    Bluesky टीम जिस subscription service का कभी-कभी ज़िक्र करती रही है, वह शायद इसी से जुड़ सकती है, और PDS पर ज़्यादा space, bandwidth, और high-quality video देने वाली hosting premium tier के रूप में बेचने के लिए उपयुक्त लगती है

    • अगर मैंने सही समझा है, तो यह PDS Bluesky द्वारा ही host किया जा रहा था
      इसे कहीं और भी host किया जा सकता है, इसलिए Bluesky app से आगे बढ़कर इंटरैक्ट किया जा सकता है, यह बात सही लगती है
  • अगर आप इंटरनेट पर लोगों को कुछ अपलोड करने की सुविधा देते हैं, तो आखिरकार कोई न कोई उस पर मनमानी फ़ाइल होस्टिंग करने की कोशिश करेगा — लगता है इस घटना का कोई नाम होना चाहिए

    • शायद यही एक बड़ा कारण है कि Google account अब अतिरिक्त भुगतान तक 15GB सीमा के साथ आता है
      जब यह unlimited था, तब Gmail आदि पर filesystems का backup लेने की कोशिश करने वाले कई open source projects आए थे, और Drive आने के बाद यह और बढ़ गया
      free services को पहले से मानकर चलना चाहिए कि ऐसी समस्या आएगी, और default limits रखनी चाहिए
    • “parasitic computation” जैसा शब्द पहले से है, तो इसे “parasitic data storage” कहा जा सकता है
    • Johnson का नियम: किसी चीज़ पर जितना अधिक ध्यान जाता है, उसका प्रभाव क्षेत्र भी उतना ही बड़ा हो जाता है
    • यह Inner Platform effect के काफ़ी करीब है
      https://en.wikipedia.org/wiki/Inner-platform_effect
  • अगर यह विषय दिलचस्प लगे, तो atfile भी देखने लायक है: https://github.com/electricduck/atfile

  • काफ़ी बढ़िया है, और पोस्ट के नीचे लिंक किए गए दिलचस्प GitHub issue को तुरंत देखा जा सकता है
    Bluesky के मशहूर शख्स pfrazee भी इसमें आते हैं: https://github.com/bluesky-social/atproto/issues/523
    AT से काफ़ी उम्मीदें हैं, और Fediverse में शानदार काम कर चुके बहुत से समझदार लोग भी हैं, लेकिन यह paradigm ज़्यादा टिकाऊ और व्यावहारिक लगता है
    मूल रूप से centralized व्यवस्था दी जाए, लेकिन ज़रूरत पड़ने पर या advanced users को असली decentralization support मिले — यही इसका तरीका है

    • sustainability के लिहाज़ से, “Blockchain Capital से funding लेना” की तुलना में इससे बेहतर business model की उम्मीद है
      firehose mirroring से निवेश पर रिटर्न कमाने का कोई तरीका चाहिए, और उदाहरण के लिए ऐसा Discord alternative जहाँ कुछ users लंबे वीडियो होस्टिंग के लिए भुगतान करें, Patreon जैसी संरचना जहाँ relays access और decryption keys संभालें और fee लें, या Bandcamp जैसे social marketplace भी संभव लगते हैं
      वैसे भी यह एक खुला platform है, इसलिए अभी भी इसे न कर पाने की कोई वजह नहीं है
      https://www.blockchaincapital.com/blog/bluesky-13m-users-and...
      https://bsky.social/about/blog/09-11-2024-video
  • ऐसा लगता है कि इस तरीके का phishing या malware वितरण के लिए दुरुपयोग हो सकता है

    • क्या कोई ऐसी hosting site है जिसका दुरुपयोग नहीं होता?
      hosting site बनाते ही कोई न कोई उसे बुरे मकसद के लिए इस्तेमाल करने की कोशिश करेगा — यह लगभग computing का नियम लगता है
    • हाँ, असल में ऐसा होगा ही
      Matrix attachments में भी यही समस्या थी
    • लगभग 5 मिनट के भीतर *.bsky.network को Google Safe Browsing, Palo Alto, Bluecoat आदि ब्लॉक करना शुरू कर देंगे
    • पक्का नहीं
      यह लेखक के Bluesky server, यानी PDS, का direct link है, इसलिए स्वाभाविक रूप से यह लेखक के नियंत्रण में है
  • Strava के हालिया API बदलाव देखकर याद आया कि उनके platform पर संग्रहीत data तक पहुँच कितनी सीमित है
    fitness क्षेत्र की प्रमुख सेवा होने के कारण, वे धीरे-धीरे features को subscription wall के पीछे भी डाल सकते हैं
    privacy या safety concerns अपनी जगह हैं, लेकिन सोचने वाली बात है कि क्या AT Protocol GPX या FIT files को store करने के platform के रूप में उपयुक्त हो सकता है

    • Strava का कोई federated alternative हो तो अच्छा होगा
      लेकिन जहाँ तक मुझे पता है, AT Protocol अभी private या limited-public posts को support नहीं करता, और Strava जैसे उपयोग में यह feature काफ़ी अहम लगता है