Bluesky पर होस्ट की गई वेबसाइट
(danielmangum.com)- 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 embedtext/htmlblob reference को store कर सकते हैं getBlobबिना authentication के सुलभ है, औरbsky.socialके अनुरोध असली PDSporcini.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.socialdomain के ज़रिए expose करता है - अलग-अलग PDS instances तक सीधे भी पहुँचा जा सकता है, और उदाहरण वेबसाइट
porcini.us-east.host.bsky.networkकेcom.atproto.sync.getBlobendpoint पर खुलती है - लेख प्रकाशित करने से पहले 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 नहीं किया जा सकता और वह
listBlobsoutput में भी शामिल नहीं होता - record creation सफल होने और उस record द्वारा blob को reference किए जाने पर server blob को publicly accessible स्थिति में बदल देता है
HTML blob upload और public करना
- authentication token,
com.atproto.server.createSessionXRPC 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.imageschemaimage/*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 है, और
findBlobRefsrecursive रूप सेLexValueको खोजकर$type: blobreferences ढूँढता है - PDS को समय के साथ नए lexicon support करने होते हैं, इसलिए उसे ऐसे lexicon भी process करने चाहिए जिन्हें वह नहीं जानता
com.danielmangum.hack.websitetype का record बनाकर जब HTML blob को reference किया गया, तो PDS ने record को store कर लिया- response में
validationStatus: unknownशामिल था - PDS
com.danielmangum.hack.*lexicon को नहीं जानता था, इसलिए validation नहीं कर सका, लेकिन record storage की अनुमति दी गई
- response में
- इसके बाद
listBlobsकी संख्या392हो गई, जिससे पुष्टि हुई कि blob स्थायी रूप से store हो गया getBlobको authentication token के बिना भी call किया जा सकता है, क्योंकि records के साथ काम करने वाली unauthenticated entities को भी blobs प्राप्त करने में सक्षम होना चाहिएbsky.socialकेgetBlobcall ने 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 है
getBlobendpoint पर Content Security Policy लागू करना लगभग अनिवार्य है- blob store को सीधे browser और web agents को उपलब्ध कराने का तरीका व्यावहारिक रूप से supported नहीं है; application को स्वतंत्र CDN, proxy, web service आदि से होकर जाना चाहिए
- Bluesky PDS के
getBlobhandler में recommended security headers लागू हैंx-content-type-options: nosniffcontent-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 के तरीके की जानकारी होनी चाहिए
getBlobdirect 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.posttype valid embeds की सूची को union के रूप में define करता है- AT Protocol lexicon में union को यदि स्पष्ट रूप से
closedन किया जाए, तो वह default रूप से open होता है- future schema revision में type जोड़े जा सकते हैं, इसलिए implementations को validation के समय उदार होना चाहिए
closedflag होने पर type set स्थिर हो जाता है
- Bluesky पोस्ट का embed union
closedके रूप में चिह्नित नहीं है - इसलिए सूचीबद्ध न किए गए embed
$typeके साथ भी पोस्ट बनाया जा सकता है - उदाहरण में
app.bsky.feed.postrecord के अंदरcom.danielmangum.hack.sitesembed डाला गया, और उसके भीतर HTML blob को reference किया गया- response का
validationStatusvalidथा - Bluesky application में उस embed को चुपचाप नज़रअंदाज़ कर दिया गया
- record में content और reference स्थायी रूप से store रहते हैं, इसलिए दूसरी applications इस embed को render कर सकती हैं
- response का
- ऐसे lexicon गुणों का उपयोग मौजूदा use cases के ऊपर छोटे extensions जोड़ने के लिए किया जा सकता है, और उदाहरण के तौर पर पोस्ट के भीतर छोटे code snippets को WebAssembly sandbox में चलाने जैसी संभावना सामने आती है
1 टिप्पणियां
Hacker News की राय
Daniel ने टीम से सीधे संपर्क किया, इसके लिए आभार, और blob hosting ऐसा क्षेत्र है जिसे दुरुपयोग के रास्तों को बेहतर समझते हुए लगातार समायोजित करना ही पड़ेगा
अभी के लिए इस तरह के उपयोग को वास्तव में काम करते देखना दिलचस्प है, और PDS को इस तरह डिज़ाइन किया गया है कि जैसे webserver वेबसाइट होस्ट करता है, वैसे यह database host बन सके
पहले उसके साथ प्रयोग करना मज़ेदार था, और यह नहीं पता था कि वह Bluesky में आ गया है, जो काफ़ी रोचक है
Bsky पहले से यूज़र domain को redirect.bsky.com पर ALIAS के रूप में जोड़ने का समर्थन करता है: https://bsky.app/profile/jacob.gold/post/3kh6rnpdzmp2v
यह किस 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 लगती हैलेख के अंत में 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 के ज़रिए
यह भी स्पष्ट नहीं है कि Bluesky ने blob storage उपयोग के लिए guidelines का कभी ज़िक्र किया है या नहीं; DOOM files छोटे होने से अच्छा उदाहरण हैं, लेकिन यह भी जिज्ञासा है कि कहीं इसका दुरुपयोग बड़े server space को externalize करने के लिए तो नहीं हो सकता
मैंने यह खास दौर खुद नहीं देखा, लेकिन BlueSky users को इस तरह तकनीकी गहराई में उतरते देखना उस समय की याद दिलाता है जब लोग MySpace पर पहली बार HTML सीख रहे थे
social media बाज़ार पहले से कहीं ज़्यादा भरा हुआ है, लेकिन यह सोचने लायक है कि क्या BlueSky से प्रोग्रामर्स की नई पीढ़ी निकल सकती है
Bluesky अभी सिर्फ़ पहला चरण देता है, और उसके बाद का कदम काफ़ी बड़ा छलांग जैसा लगता है
अगर बात 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 के रूप में बेचने के लिए उपयुक्त लगती है
इसे कहीं और भी host किया जा सकता है, इसलिए Bluesky app से आगे बढ़कर इंटरैक्ट किया जा सकता है, यह बात सही लगती है
अगर आप इंटरनेट पर लोगों को कुछ अपलोड करने की सुविधा देते हैं, तो आखिरकार कोई न कोई उस पर मनमानी फ़ाइल होस्टिंग करने की कोशिश करेगा — लगता है इस घटना का कोई नाम होना चाहिए
जब यह unlimited था, तब Gmail आदि पर filesystems का backup लेने की कोशिश करने वाले कई open source projects आए थे, और Drive आने के बाद यह और बढ़ गया
free services को पहले से मानकर चलना चाहिए कि ऐसी समस्या आएगी, और default limits रखनी चाहिए
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 मिले — यही इसका तरीका है
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 बनाते ही कोई न कोई उसे बुरे मकसद के लिए इस्तेमाल करने की कोशिश करेगा — यह लगभग computing का नियम लगता है
Matrix attachments में भी यही समस्या थी
*.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 के रूप में उपयुक्त हो सकता है
लेकिन जहाँ तक मुझे पता है, AT Protocol अभी private या limited-public posts को support नहीं करता, और Strava जैसे उपयोग में यह feature काफ़ी अहम लगता है