Situs web yang di-hosting di Bluesky
(danielmangum.com)- Daniel Mangum menunjukkan bahwa dengan memanfaatkan unggahan blob dan struktur referensi record di AT Protocol, file
text/htmlyang diunggah ke Bluesky PDS dapat disajikan seperti halaman web yang dibuka di browser - Mekanisme intinya adalah blob yang diunggah tidak langsung menjadi publik; PDS baru mengubahnya menjadi dapat diakses publik ketika ada record yang mereferensikan blob tersebut
- Embed gambar Bluesky biasa hanya mengizinkan MIME type
image/*, tetapi record dari lexicon yang tidak dikenal atau embed kustom berbasis open union dapat menyimpan referensi blobtext/html getBlobdapat diakses tanpa autentikasi, dan permintaan kebsky.socialdialihkan ke PDS sebenarnya, yaituporcini.us-east.host.bsky.network, yang mengembalikan HTML- Bluesky menerapkan header CSP dan
nosniffpadagetBlobserta membatasi unggahan blob default hingga 5MB, tetapi layanan operator PDS tetap menanggung beban hosting file arbitrer serta biaya penyimpanan dan transfer
Cara mengunggah situs web dengan blob AT Protocol
- Kasus ini didasarkan pada cara kerja AT Protocol dan API PDS, bukan pada fitur umum aplikasi Bluesky
- Bluesky menyediakan PDS entryway untuk mengakses PDS pengguna, serta mengekspos beberapa instance PDS melalui domain
bsky.social - Instance PDS individual juga dapat diakses langsung, dan situs web contoh terbuka dari endpoint
com.atproto.sync.getBlobdiporcini.us-east.host.bsky.network - Sebelum publikasi tulisan, penulis telah berkomunikasi dengan tim Bluesky; perilaku ini bukan cara penggunaan aplikasi yang dimaksudkan, tetapi merupakan perilaku yang sudah diketahui dan bukan prosedur pengungkapan kerentanan
Alasan records dan blobs dipisahkan
- Dalam AT Protocol, data aplikasi secara garis besar dibagi menjadi records dan blobs
- records adalah entitas inti yang dibuat pengguna, dan dapat memiliki struktur serta metadata
- blobs adalah data tidak terstruktur yang lebih besar seperti gambar, dan biasanya baru terekspos ketika direferensikan oleh record
- Saat membuat postingan berisi gambar di Bluesky, bagi pengguna hal itu terlihat seperti satu tindakan, tetapi pada tingkat API unggahan blob dan pembuatan record dipisahkan
- Menurut spesifikasi blob, blob harus terlebih dahulu diunggah ke PDS sebelum direferensikan oleh record
- Karena pada saat unggahan server tidak tahu blob akan dipakai di Lexicon mana, pada unggahan awal server hanya menerapkan batasan blob umum, lalu menerapkan batasan berbasis Lexicon saat record dibuat
- Blob yang berhasil diunggah masuk ke penyimpanan sementara; dalam keadaan ini blob tidak dapat diunduh atau didistribusikan, dan juga tidak muncul dalam keluaran
listBlobs - Setelah pembuatan record berhasil dan record tersebut mereferensikan blob, server mengubah blob menjadi dapat diakses publik
Mengunggah blob HTML dan mengubahnya menjadi publik
- Token autentikasi diperoleh dengan menukarkan kredensial pengguna melalui metode XRPC
com.atproto.server.createSession - Dalam contoh, jumlah blob yang sudah ada diperiksa dengan
com.atproto.sync.listBlobs, dan jumlah sebelum unggahan adalah391 - Isi situs web adalah file
index.htmlsederhana, yang diunggah dengancom.atproto.repo.uploadBlobContent-Typeadalahtext/html- Metadata blob yang dikembalikan mencakup CID
bafkreic5fmelmhqoqxfjz2siw5ey43ixwlzg5gvv2pkkz7o25ikepv4zeq,mimeType: text/html,size: 268
- Segera setelah unggahan, blob tersebut tidak dapat diambil dengan
com.atproto.sync.getBlob, dan jumlahlistBlobsjuga tetap391 - Jika mereferensikan blob HTML sebagai image embed di postingan Bluesky, skema
app.bsky.embed.imagegagal karena mensyaratkan MIME typeimage/*- Jika
text/htmldibiarkan apa adanya, muncul errorWrong type of file. It is text/html but it must match image/*. - Jika
mimeTypediubah menjadiimage/jpeg, muncul error bahwa MIME type blob yang tersimpan berbeda dari MIME type referensi
- Jika
Membuat blob publik dengan record lexicon yang tidak dikenal
- Tipe blob bukan khusus Bluesky, melainkan bagian dari model data AT Protocol
- Implementasi Bluesky PDS bersifat open source, dan
findBlobRefsmenelusuriLexValuesecara rekursif untuk menemukan referensi$type: blob - Karena PDS harus mendukung lexicon baru seiring waktu, ia harus dapat memproses lexicon yang tidak dikenalnya
- Ketika record bertipe
com.danielmangum.hack.websitedibuat dan mereferensikan blob HTML, PDS menyimpan record tersebut- Responsnya mencakup
validationStatus: unknown - PDS tidak mengetahui lexicon
com.danielmangum.hack.*sehingga tidak dapat memvalidasinya, tetapi penyimpanan record tetap diizinkan
- Responsnya mencakup
- Setelah itu jumlah
listBlobsnaik menjadi392, mengonfirmasi bahwa blob disimpan secara persisten getBlobdapat dipanggil tanpa token autentikasi, karena pihak tanpa autentikasi yang harus memproses blobs bersama records juga perlu dapat mengambil blob- Panggilan
getBlobkebsky.socialmengembalikan URL PDS sebenarnya melalui redirect 302, dan jika redirect diikuti dengan-L, konten HTML dikembalikan apa adanya
Header keamanan, CDN, dan beban akses langsung
- Security Considerations dalam spesifikasi blob AT Protocol membahas risiko keamanan konten saat file unggahan pengguna arbitrer disajikan dari server web
- Contoh utamanya adalah masalah XSS, yaitu skrip atau konten SVG yang berjalan pada origin yang sama
- Penerapan Content Security Policy pada endpoint
getBlobpada praktiknya wajib - Cara menyediakan penyimpanan blob secara langsung ke browser dan web agent pada dasarnya tidak didukung; aplikasi harus melewati CDN, proxy, layanan web independen, dan sejenisnya
- Handler
getBlobdi Bluesky PDS menerapkan header keamanan yang direkomendasikanx-content-type-options: nosniffcontent-security-policy: default-src 'none'; sandbox
- Batas unggahan blob default adalah 5MB
- Blob gambar umum pada aplikasi Bluesky tidak disajikan langsung dari PDS, melainkan melalui URL CDN di
cdn.bsky.app- Ada URL thumbnail feed dan URL ukuran penuh secara terpisah
- Record postingan berisi CID gambar, dan aplikasi harus mengetahui cara penyajian melalui CDN
- Akses langsung
getBlobtetap dipertahankan dalam isu GitHub karena pelabelan gambar, ekspor konten pengguna, dan kasus penggunaan masa depan- Diskusi yang sama juga mencakup kemungkinan pengguna melakukan hotlink konten atau memakai Bluesky seperti hosting gratis
- Implementasi awal tidak memiliki header keamanan, lalu header tersebut ditambahkan kemudian
- Platform sosial tradisional membatasi jenis konten yang valid sehingga dapat membatasi blob secara lebih ketat pada saat unggahan, tetapi ekstensibilitas Bluesky dan AT Protocol menuntut penanganan yang lebih kompleks
Memasukkan embed kustom ke postingan dengan open union
- Tipe
app.bsky.feed.postmendefinisikan daftar embed yang valid sebagai union - Dalam lexicon AT Protocol, union secara default bersifat open kecuali secara eksplisit diberi
closed- Karena tipe dapat ditambahkan dalam revisi skema di masa depan, implementasi harus longgar saat melakukan validasi
- Jika ada flag
closed, himpunan tipenya menjadi tetap
- Union embed pada postingan Bluesky tidak ditandai sebagai
closed - Karena itu, postingan dapat dibuat dengan
$typeembed yang tidak tercantum - Dalam contoh, embed
com.danielmangum.hack.sitesdimasukkan ke dalam recordapp.bsky.feed.post, dan blob HTML direferensikan dari sanavalidationStatuspada respons adalahvalid- Di aplikasi Bluesky, embed tersebut diabaikan secara senyap
- Karena konten dan referensinya disimpan secara persisten dalam record, aplikasi lain dapat me-render embed ini
- Karakteristik lexicon seperti ini dapat dimanfaatkan untuk menambahkan ekstensi kecil di atas kasus penggunaan yang sudah ada; sebagai contoh, disebutkan kemungkinan menjalankan potongan kode kecil di dalam postingan pada sandbox WebAssembly
1 komentar
Komentar Hacker News
Saya menghargai Daniel yang menghubungi tim secara langsung, dan hosting blob adalah area yang mau tak mau akan terus disesuaikan sambil mereka makin memahami jalur penyalahgunaannya.
Untuk saat ini, menarik melihat pemanfaatan seperti ini benar-benar berjalan, dan PDS memang dirancang agar menjadi host basis data, seperti web server meng-host situs web.
Dulu menyenangkan untuk diutak-atik, dan saya tidak tahu bahwa mereka pindah ke Bluesky; cukup menarik.
Bsky sudah mendukung cara menautkan domain pengguna sebagai ALIAS ke redirect.bsky.com: https://bsky.app/profile/jacob.gold/post/3kh6rnpdzmp2v
Karena penasaran dalam konteks keamanan apa ini dijalankan, saya memeriksa URL blob PDS dengan
curl, dan header responsnya mencakupaccess-control-allow-origin: *,content-security-policy: default-src 'none'; sandbox,x-content-type-options: nosniff, dan lain-lain.access-control-allow-origin: *menarik karena berarti JavaScript halaman web dari domain mana pun bisa mengakses konten ini denganfetch(), sementaradefault-src 'none'; sandboxadalah konfigurasi yang sangat ketat dan bagus karena mencegah pemuatan skrip atau gambar tambahan serta memblokir eksekusi JavaScript: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Co...ratelimit-limit: 3000mungkin tampaknya merupakan batas berbasis IP.Usulan penggunaan WebAssembly di akhir tulisan adalah arah yang tepat, dan masalah klik tautan bisa dibatasi dengan memasukkan kode yang tidak tepercaya ke dalam iframe lalu, dari parent, menggunakan
child-srcuntuk hanya mengizinkan domain tertentu ataudata:.https://github.com/w3c/webappsec/issues/656#issuecomment-246...
https://www.w3.org/TR/CSP3/#exfiltration
default-srctetap diperlukan saat memakaisandbox, atau itu hanya konfigurasi yang redundan.Saya cukup antusias dengan kemungkinan memakai Bluesky sebagai penyimpanan data blob.
Bersama seorang teman, saya pernah membayangkan menyimpan DOOM WAD di Bluesky dan membagikan “map pack” seperti postingan; lalu jika mengikuti akun, daftar, atau starter pack, klien seperti GZDoom bisa dimodifikasi agar dapat mencari dan melihat WAD yang diunggah akun-akun tersebut.
Mirip Steam Workshop, tetapi melalui Bluesky.
Saya juga tidak tahu apakah Bluesky pernah menyebut panduan penggunaan untuk penyimpanan blob, dan meski file DOOM kecil sehingga menjadi contoh yang bagus, saya penasaran apakah ini bisa disalahgunakan untuk mengeksternalisasi ruang server berskala besar.
Saya tidak mengalami era khusus ini, tetapi melihat pengguna BlueSky terjun ke perairan teknis yang dalam mengingatkan saya pada masa orang pertama kali belajar HTML di MySpace.
Pasar media sosial sekarang jauh lebih jenuh daripada dulu, tetapi saya penasaran apakah dari BlueSky bisa muncul generasi baru programmer.
Bluesky hanya menyediakan tahap pertama, dan setelah itu tampaknya ada lompatan yang cukup besar.
Dengan HTTP/HTML, bahkan orang yang hanya tahu Python dasar atau bahasa pemrograman lain bisa ditunjukkan cara membuat server dari nol dalam 14 menit.
Saya melihat perlunya protokol komunikasi beralamat hash agar raksasa teknologi tidak bisa mengeksploitasi komunitas, tetapi saya tidak yakin apakah AT Protocol sudah menyasar tujuan dengan cukup tepat untuk memicu revolusi seperti HTTP.
Salah satu poin pentingnya adalah PDS yang dibahas di sini bukan produk Bluesky itu sendiri, melainkan bagian dari Personal Data Server, sehingga pada akhirnya bisa terlihat seperti penyimpanan data gratis tanpa batas.
Layanan berlangganan yang kadang-kadang disebut tim Bluesky tampaknya bisa terkait dengan hal ini, dan hosting yang menyediakan lebih banyak ruang, bandwidth, serta video berkualitas tinggi di PDS tampaknya cocok dijual sebagai tier premium.
Karena mungkin bisa di-host di tempat lain juga, pernyataan bahwa ia dapat berinteraksi melampaui aplikasi Bluesky tampaknya benar.
Tampaknya perlu ada nama untuk fenomena ketika sesuatu dibuat bisa dipublikasikan di internet, pada akhirnya akan ada orang yang mencoba hosting berkas arbitrer di atasnya
Pada masa masih tanpa batas, muncul beberapa proyek open source yang mencoba mencadangkan filesystem ke Gmail dan sejenisnya, dan setelah Drive hadir masalahnya makin parah
Layanan gratis harus memasang batas dasar dengan mengantisipasi masalah seperti ini
https://en.wikipedia.org/wiki/Inner-platform_effect
Kalau topik seperti ini menarik, atfile juga layak dilihat: https://github.com/electricduck/atfile
Cukup keren, dan kita bisa langsung melihat issue GitHub menarik yang ditautkan di bagian bawah tulisan
Tokoh terkenal Bluesky, pfrazee, juga muncul: https://github.com/bluesky-social/atproto/issues/523
Saya punya harapan besar pada AT, dan meski ada banyak orang pintar yang telah melakukan hal hebat di Fediverse, paradigma ini terlihat lebih berkelanjutan dan realistis
Pada dasarnya disediakan secara tersentralisasi, tetapi memberi dukungan desentralisasi sungguhan saat dibutuhkan atau untuk pengguna tingkat lanjut
Perlu ada cara menghasilkan imbal hasil investasi dari mirroring firehose; misalnya alternatif Discord tempat sebagian pengguna membayar biaya hosting video yang lebih panjang, struktur ala Patreon di mana relay mengelola kunci akses dan dekripsi lalu mengambil komisi, atau marketplace sosial seperti Bandcamp juga tampak mungkin
Bagaimanapun, ini platform terbuka, jadi tidak ada alasan hal itu tidak bisa dilakukan sekarang
https://www.blockchaincapital.com/blog/bluesky-13m-users-and...
https://bsky.social/about/blog/09-11-2024-video
Rasanya metode ini bisa disalahgunakan untuk phishing atau distribusi malware
Kalau membuat situs hosting, hampir seperti hukum komputasi bahwa seseorang akan mencoba memakainya untuk tujuan jahat
Masalah yang sama juga ada pada lampiran Matrix
*.bsky.networksepertinya akan mulai diblokir oleh Google Safe Browsing, Palo Alto, Bluecoat, dan lainnyaIni adalah server Bluesky milik penulis, yaitu tautan langsung ke PDS, jadi tentu saja berada di bawah kendali penulis
Melihat perubahan API Strava baru-baru ini, saya jadi teringat betapa terbatasnya akses ke data yang tersimpan di platform mereka
Sebagai layanan dominan di bidang fitness, mereka juga bisa secara bertahap menaruh fitur di balik paywall langganan
Meski ada kekhawatiran privasi atau keselamatan, saya penasaran apakah AT Protocol bisa cocok sebagai platform penyimpanan file GPX atau FIT
Namun setahu saya AT Protocol belum mendukung postingan privat atau dengan visibilitas terbatas, dan menurut saya fitur ini cukup inti untuk penggunaan ala Strava