3 poin oleh GN⁺ 2024-11-25 | 1 komentar | Bagikan ke WhatsApp
  • Daniel Mangum menunjukkan bahwa dengan memanfaatkan unggahan blob dan struktur referensi record di AT Protocol, file text/html yang 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 blob text/html
  • getBlob dapat diakses tanpa autentikasi, dan permintaan ke bsky.social dialihkan ke PDS sebenarnya, yaitu porcini.us-east.host.bsky.network, yang mengembalikan HTML
  • Bluesky menerapkan header CSP dan nosniff pada getBlob serta 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.getBlob di porcini.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 adalah 391
  • Isi situs web adalah file index.html sederhana, yang diunggah dengan com.atproto.repo.uploadBlob
    • Content-Type adalah text/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 jumlah listBlobs juga tetap 391
  • Jika mereferensikan blob HTML sebagai image embed di postingan Bluesky, skema app.bsky.embed.image gagal karena mensyaratkan MIME type image/*
    • Jika text/html dibiarkan apa adanya, muncul error Wrong type of file. It is text/html but it must match image/*.
    • Jika mimeType diubah menjadi image/jpeg, muncul error bahwa MIME type blob yang tersimpan berbeda dari MIME type referensi

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 findBlobRefs menelusuri LexValue secara 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.website dibuat 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
  • Setelah itu jumlah listBlobs naik menjadi 392, mengonfirmasi bahwa blob disimpan secara persisten
  • getBlob dapat dipanggil tanpa token autentikasi, karena pihak tanpa autentikasi yang harus memproses blobs bersama records juga perlu dapat mengambil blob
  • Panggilan getBlob ke bsky.social mengembalikan 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 getBlob pada 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 getBlob di Bluesky PDS menerapkan header keamanan yang direkomendasikan
    • x-content-type-options: nosniff
    • content-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 getBlob tetap 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.post mendefinisikan 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 $type embed yang tidak tercantum
  • Dalam contoh, embed com.danielmangum.hack.sites dimasukkan ke dalam record app.bsky.feed.post, dan blob HTML direferensikan dari sana
    • validationStatus pada respons adalah valid
    • 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

 
GN⁺ 2024-11-25
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.

    • Saya penasaran apakah ada rencana untuk menghidupkan kembali Beaker Browser.
      Dulu menyenangkan untuk diutak-atik, dan saya tidak tahu bahwa mereka pindah ke Bluesky; cukup menarik.
    • Saya rasa potensi penyalahgunaan bisa berkurang jika konten terhubung ke domain milik pengguna sendiri tanpa melewati appview tertentu seperti bsky.
      Bsky sudah mendukung cara menautkan domain pengguna sebagai ALIAS ke redirect.bsky.com: https://bsky.app/profile/jacob.gold/post/3kh6rnpdzmp2v
    • Beaker adalah proyek yang sangat keren untuk diikuti, dan pengalaman itu tampaknya akan cukup berguna di Bluesky.
    • Pendekatan ini berarti menerjang langsung ke lubang moderasi konten seperti hak cipta, CSAM, dan pornografi.
  • Karena penasaran dalam konteks keamanan apa ini dijalankan, saya memeriksa URL blob PDS dengan curl, dan header responsnya mencakup access-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 dengan fetch(), sementara default-src 'none'; sandbox adalah 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: 3000 mungkin tampaknya merupakan batas berbasis IP.

    • Memblokir JavaScript sepenuhnya atau membatasinya dengan allowlist hampir merupakan satu-satunya cara untuk benar-benar mengurung aplikasi dengan CSP dan mencegah eksfiltrasi data; kalau ada prefetch, itu pun mungkin belum cukup.
      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-src untuk hanya mengizinkan domain tertentu atau data:.
      https://github.com/w3c/webappsec/issues/656#issuecomment-246...
      https://www.w3.org/TR/CSP3/#exfiltration
    • Saya penasaran apakah default-src tetap diperlukan saat memakai sandbox, 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.

    • Ide yang keren, tetapi saya penasaran apakah Anda berniat meng-host-nya sendiri atau mengunggahnya ke server 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.
    • Pada akhirnya, bukankah ini sama saja memakai Bluesky seperti feed RSS untuk data arbitrer?
  • 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.

    • MySpace dan forum lama menyediakan tangga abstraksi yang dimulai dari tahap memasukkan teks ke dalam kotak lalu tampil di halaman web, berlanjut ke penambahan gambar, BBCode/markup, HTML dan CSS, hingga penulisan skrip penuh.
      Bluesky hanya menyediakan tahap pertama, dan setelah itu tampaknya ada lompatan yang cukup besar.
    • Meski disebut “14 menit”, saya melihat sekitar selusin tautan yang tampaknya wajib dibaca untuk mencoba ide baru.
      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.

    • Jika saya memahaminya dengan benar, PDS ini di-host oleh Bluesky.
      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

    • Itu mungkin juga alasan penting mengapa akun Google sekarang punya batas 15 GB sebelum harus membayar tambahan
      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
    • Karena sudah ada istilah “parasitic computation”, sepertinya ini bisa disebut “parasitic data storage
    • Hukum Johnson: semakin banyak perhatian yang didapat sesuatu, semakin besar pula jangkauan dampaknya
    • Mirip dengan Inner Platform effect
      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

    • Dari sisi keberlanjutan, saya berharap ada model bisnis yang lebih baik daripada “mendapat pendanaan dari Blockchain Capital”
      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

    • Memangnya ada situs hosting yang tidak disalahgunakan?
      Kalau membuat situs hosting, hampir seperti hukum komputasi bahwa seseorang akan mencoba memakainya untuk tujuan jahat
    • Kenyataannya memang akan begitu
      Masalah yang sama juga ada pada lampiran Matrix
    • Setelah sekitar 5 menit, *.bsky.network sepertinya akan mulai diblokir oleh Google Safe Browsing, Palo Alto, Bluecoat, dan lainnya
    • Saya kurang yakin
      Ini 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

    • Akan menyenangkan kalau ada pengganti Strava yang terfederasi
      Namun setahu saya AT Protocol belum mendukung postingan privat atau dengan visibilitas terbatas, dan menurut saya fitur ini cukup inti untuk penggunaan ala Strava