3 puan yazan GN⁺ 2024-11-25 | 1 yorum | WhatsApp'ta paylaş
  • Daniel Mangum, AT Protocol’ün blob yükleme ve kayıt referansı yapısını kullanarak Bluesky PDS’ye yüklenen text/html dosyalarının tarayıcıda açılan bir web sayfası gibi sunulabildiğini gösterdi
  • Temel işleyiş şu: Yüklenen blob hemen herkese açık olmuyor; bir record’un blob’a referans vermesi gerekiyor ki PDS onu herkese açık erişilebilir duruma çevirsin
  • Standart Bluesky görsel embed’i yalnızca image/* MIME türlerine izin veriyor; ancak bilinmeyen bir lexicon’a ait record veya open union tabanlı özel embed, text/html blob referansını saklayabiliyor
  • getBlob kimlik doğrulama olmadan erişilebilir; bsky.social istekleri gerçek PDS olan porcini.us-east.host.bsky.network adresine yönlendirilerek HTML döndürüyor
  • Bluesky, getBlob için CSP başlığı ve nosniff uyguluyor ve varsayılan blob yüklemelerini 5 MB ile sınırlıyor; ancak PDS işletme hizmetleri için keyfi dosya barındırma ile depolama ve aktarım maliyeti yükü devam ediyor

AT Protocol blob’u ile web sitesi yükleme yöntemi

  • Bu örnek, Bluesky uygulamasının standart özelliklerinden ziyade AT Protocol ve PDS API’nin çalışma biçimine dayanıyor
  • Bluesky, kullanıcının PDS’sine erişen bir PDS entryway sunuyor ve birden fazla PDS örneğini bsky.social alan adı üzerinden dışa açıyor
  • Tekil PDS örneklerine doğrudan da erişilebiliyor; örnek web sitesi porcini.us-east.host.bsky.network üzerindeki com.atproto.sync.getBlob uç noktasında açılıyor
  • Yazı yayımlanmadan önce Bluesky ekibiyle iletişim kuruldu; bu davranış amaçlanan bir uygulama kullanım biçimi olmasa da bilinen bir davranış ve bir güvenlik açığı bildirim süreci değil

records ve blobs neden ayrılıyor?

  • AT Protocol’de uygulama verileri kabaca records ve blobs olarak ikiye ayrılıyor
    • records, kullanıcıların oluşturduğu temel varlıklardır; yapı ve meta veriler içerebilir
    • blobs, görseller gibi daha büyük, yapılandırılmamış verilerdir; genellikle görünür olmaları için bir record tarafından referans verilmesi gerekir
  • Bluesky’de görsel içeren bir gönderi oluşturmak kullanıcıya tek bir işlem gibi görünse de API düzeyinde blob yükleme ve record oluşturma ayrı işlemlerdir
  • blob specification’a göre blob, bir record tarafından referans verilmeden önce PDS’ye yüklenmelidir
  • Sunucu yükleme anında blob’un hangi Lexicon’da kullanılacağını bilemez; bu yüzden ilk yükleme sırasında yalnızca genel blob sınırlamalarını uygular, Lexicon tabanlı sınırlamaları ise record oluşturma anında uygular
  • Başarıyla yüklenen blob geçici depoya girer; bu durumdayken indirilemez veya dağıtılamaz ve listBlobs çıktısına da dahil edilmez
  • Record oluşturma başarılı olur ve ilgili record blob’a referans verirse sunucu blob’u herkese açık erişilebilir duruma geçirir

HTML blob yükleme ve herkese açık duruma geçirme

  • Kimlik doğrulama token’ı, kullanıcı kimlik bilgilerinin com.atproto.server.createSession XRPC yöntemiyle takas edilmesiyle alınır
  • Örnekte mevcut blob sayısı com.atproto.sync.listBlobs ile kontrol edildi; yükleme öncesi sayı 391 idi
  • Web sitesinin gövdesi basit bir index.html dosyasıdır ve com.atproto.repo.uploadBlob ile yüklenmiştir
    • Content-Type: text/html
    • Dönen blob meta verileri CID bafkreic5fmelmhqoqxfjz2siw5ey43ixwlzg5gvv2pkkz7o25ikepv4zeq, mimeType: text/html ve size: 268 içerir
  • Yüklemenin hemen ardından com.atproto.sync.getBlob ile alınmaya çalışıldığında erişilemedi; listBlobs sayısı da 391 olarak kaldı
  • HTML blob’u bir Bluesky gönderisinin görsel embed’i olarak referans vermek, app.bsky.embed.image şeması image/* MIME türü istediği için başarısız olur
    • text/html olduğu gibi bırakılırsa Wrong type of file. It is text/html but it must match image/*. hatası oluşur
    • mimeType image/jpeg olarak değiştirilirse depolanan blob MIME türü ile referanstaki MIME türünün farklı olduğuna dair hata oluşur

Bilinmeyen lexicon record’u ile blob’u herkese açmak

  • Blob türü Bluesky’ye özgü değildir; AT Protocol veri modelinin bir parçasıdır
  • Bluesky PDS implementasyonu açık kaynaklıdır ve findBlobRefs, LexValue içinde özyinelemeli arama yaparak $type: blob referanslarını bulur
  • PDS’nin zaman içinde yeni lexicon’ları desteklemesi gerektiğinden, bilmediği lexicon’ları da işleyebilmesi gerekir
  • com.danielmangum.hack.website türünde bir record oluşturulup HTML blob’a referans verildiğinde PDS record’u kaydetti
    • Yanıtta validationStatus: unknown yer aldı
    • PDS com.danielmangum.hack.* lexicon’unu bilmediği için doğrulama yapamadı, ancak record’un kaydedilmesine izin verildi
  • Sonrasında listBlobs sayısının 392ye yükselmesiyle blob’un kalıcı olarak saklandığı doğrulandı
  • getBlob kimlik doğrulama token’ı olmadan çağrılabilir; çünkü records ile birlikte blobs’u işlemesi gereken kimliği doğrulanmamış tarafların da blob’u alabilmesi gerekir
  • bsky.social üzerinden yapılan getBlob çağrısı, 302 yönlendirmesiyle gerçek PDS URL’sini döndürdü; -L ile yönlendirme takip edildiğinde HTML içeriği olduğu gibi döndü

Güvenlik başlıkları, CDN ve doğrudan erişimin yükü

  • AT Protocol blob spesifikasyonundaki Security Considerations, keyfi kullanıcı yüklemeli dosyaların web sunucusundan sunulmasıyla doğan içerik güvenliği risklerini ele alır
    • Tipik örnek, aynı origin üzerinde script veya SVG içeriğinin çalıştırılmasıyla oluşan XSS sorunudur
    • getBlob uç noktasında Content Security Policy uygulanması fiilen zorunludur
    • Blob deposunu tarayıcılara ve web ajanlarına doğrudan sunma yöntemi pratikte desteklenmez; uygulamalar bağımsız CDN, proxy, web servisi vb. üzerinden geçmelidir
  • Bluesky PDS’nin getBlob handler’ı önerilen güvenlik başlıklarını uygular
    • x-content-type-options: nosniff
    • content-security-policy: default-src 'none'; sandbox
  • Varsayılan blob yükleme sınırı 5 MB’tır
  • Bluesky uygulamasındaki standart görsel blob’ları PDS’den doğrudan sunulmaz; cdn.bsky.app üzerindeki CDN URL’leriyle sunulur
    • Feed küçük görsel URL’si ve tam boy URL ayrı ayrı bulunur
    • Gönderi record’u görsel CID’sini içerir ve uygulamanın CDN üzerinden sunma yöntemini bilmesi gerekir
  • getBlob doğrudan erişimi, GitHub issue’sunda görsel etiketleme, kullanıcı içeriği export’u ve gelecekteki kullanım durumları nedeniyle korunmuştur
    • Aynı tartışmada kullanıcıların içeriği hotlink etme veya Bluesky’yi ücretsiz barındırma gibi kullanma ihtimali de yer alır
    • İlk implementasyonda güvenlik başlıkları yoktu; daha sonra eklendi
  • Geleneksel sosyal platformlarda geçerli içerik türleri sınırlı olduğundan yükleme anında blob daha güçlü şekilde kısıtlanabilir; ancak Bluesky ve AT Protocol’ün genişletilebilirliği daha karmaşık işlem gerektirir

open union ile gönderiye özel embed eklemek

  • app.bsky.feed.post türü, geçerli embed listesini union olarak tanımlar
  • AT Protocol lexicon’unda union, açıkça closed değilse varsayılan olarak open olur
    • Gelecekteki şema revizyonlarında tür eklenebileceğinden implementasyonların doğrulama sırasında hoşgörülü olması gerekir
    • closed bayrağı varsa tür kümesi sabitlenir
  • Bluesky gönderisinin embed union’ı closed olarak işaretlenmiş değildir
  • Bu nedenle listelenmemiş bir embed $type ile de gönderi oluşturulabilir
  • Örnekte app.bsky.feed.post record’u içine com.danielmangum.hack.sites embed’i eklenmiş ve onun içinde HTML blob’a referans verilmiştir
    • Yanıttaki validationStatus: valid
    • Bluesky uygulamasında ilgili embed sessizce yok sayılır
    • İçerik ve referans record’da kalıcı olarak saklandığından başka uygulamalar bu embed’i render edebilir
  • Bu tür lexicon özellikleri, mevcut kullanım senaryolarının üzerine küçük uzantılar ekleme biçiminde değerlendirilebilir; örnek olasılık olarak gönderi içindeki küçük kod parçacıklarının WebAssembly sandbox’ında çalıştırılması verilmiştir

1 yorum

 
GN⁺ 2024-11-25
Hacker News yorumları
  • Daniel’ın ekibe doğrudan sormuş olması sevindiriciydi; blob barındırma, kötüye kullanım yolları daha iyi anlaşıldıkça sürekli ayarlanmak zorunda kalacak bir alan
    Şimdilik bu tür kullanımın gerçekten çalıştığını görmek eğlenceli; PDS de bir web sunucusunun web sitesi barındırması gibi veritabanı barındırıcısı olacak şekilde tasarlanmış bir yapı

    • Beaker Browser’ı yeniden canlandırma planı olup olmadığını merak ediyorum
      Eskiden kurcalaması keyifliydi; Bluesky’ye geçtiğini bilmiyordum, oldukça ilginç
    • İçerik bsky gibi belirli bir appview üzerinden geçmeden kullanıcının kendi alan adına bağlanırsa kötüye kullanım olasılığı azalmaz mı diye düşünüyorum
      Bsky, kullanıcı alan adlarını redirect.bsky.com’a ALIAS olarak bağlama yöntemini zaten destekliyor: https://bsky.app/profile/jacob.gold/post/3kh6rnpdzmp2v
    • Beaker, takip etmesi gerçekten harika bir projeydi; o deneyim Bluesky’de epey işe yarayacak gibi
    • Bu yöntem, telif hakkı, CSAM, porno gibi içerik moderasyonu çukurlarına doğrudan dalmak anlamına geliyor
  • Bunun hangi güvenlik bağlamında çalıştığını merak ettiğim için PDS blob URL’sini curl ile kontrol ettim; yanıt başlıklarında access-control-allow-origin: *, content-security-policy: default-src 'none'; sandbox, x-content-type-options: nosniff vb. vardı
    access-control-allow-origin: *, herhangi bir alan adındaki web sayfası JavaScript’inin bu içeriğe fetch() ile erişebileceği anlamına geldiği için ilginç; default-src 'none'; sandbox ise ek script veya görsel yüklenmesini engelleyen ve JavaScript çalıştırılmasını da durduran, çok kısıtlayıcı ve iyi bir ayar: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Co...
    ratelimit-limit: 3000 muhtemelen IP bazlı bir sınır gibi görünüyor

    • JavaScript’i tamamen engellemek ya da izin listesiyle sınırlamak, uygulamayı CSP ile tamamen kapatıp veri sızıntısını önlemenin neredeyse tek yolu; prefetch varsa bu bile yeterli olmayabilir
      Yazının sonunda WebAssembly kullanmayı önermesi doğru yönde; bağlantı tıklama sorunu ise güvenilmeyen kodu iframe’e koyup üst tarafta child-src ile yalnızca belirli alan adlarına veya data:ya izin vererek sınırlandırılabilir
      https://github.com/w3c/webappsec/issues/656#issuecomment-246...
      https://www.w3.org/TR/CSP3/#exfiltration
    • sandbox kullanıldığında da default-src gerekli mi, yoksa bu mükerrer ayar mı, merak ediyorum
  • Bluesky’yi blob veri deposu olarak kullanma olasılığı beni epey heyecanlandırıyor
    Bir arkadaşımla DOOM WAD’lerini Bluesky’de saklayıp gönderi gibi “harita paketleri” paylaşma yöntemini düşündük; hesapları, listeleri ve starter pack’leri takip edince GZDoom gibi istemcileri değiştirip bu hesapların yüklediği WAD’leri arayıp görüntüleyebilir hale getirmek mümkün olabilir
    Steam Workshop’a benzer, ama Bluesky üzerinden işleyen bir yöntem

    • Harika fikir; bunu kendin mi barındırmayı düşünüyorsun yoksa Bluesky sunucularına mı yükleyeceksin merak ettim
      Bluesky’nin blob deposu kullanım yönergelerinden söz edip etmediğini de bilmiyorum; DOOM dosyaları küçük olduğu için iyi bir örnek ama büyük sunucu alanını dışarıya yıkma şeklinde kötüye kullanılabilir mi, onu da merak ediyorum
    • Sonuçta Bluesky’yi rastgele veri için bir RSS feed’i gibi kullanmak olmuyor mu?
  • Bu belirli dönemi yaşamadım ama BlueSky kullanıcılarının teknik açıdan derin sulara atlaması, MySpace’te ilk kez HTML öğrenilen günleri hatırlatıyor
    Sosyal medya pazarı eskisine göre çok daha doygun, ama BlueSky’den yeni bir programcı nesli çıkıp çıkmayacağını merak ediyorum

    • MySpace ve eski forumlar, metni bir kutuya yazıp web sayfasında göründüğünü görmekten başlayarak görsel eklemeye, BBCode/işaretlemeye, HTML ve CSS’e, ardından tam script yazmaya uzanan bir soyutlama merdiveni sunuyordu
      Bluesky yalnızca ilk basamağı sunuyor; sonrasından itibaren ise oldukça büyük bir sıçrama gibi görünüyor
    • “14 dakikalık” deniyor ama yeni fikirler denemek için mutlaka okunması gerekecekmiş gibi duran yaklaşık bir düzine bağlantı görüyorum
      HTTP/HTML söz konusuysa, yalnızca temel Python veya başka bir programlama dili bilen birine bile 14 dakika içinde sıfırdan sunucu yapmayı gösterebilirsiniz
      Teknoloji devlerinin toplulukları sömürmesini engellemek için hash adreslemeli iletişim protokolü gerektiğini düşünüyorum; ama AT Protocol’ün HTTP gibi bir devrimi tetikleyecek kadar hedefini iyi tutturup tutturmadığından emin değilim
  • Burada ele alınan PDS’nin Bluesky ürününün kendisi değil, Personal Data Server’ın bir parçası olması; bunun da sonuçta sınırsız ücretsiz veri deposu gibi görünebilmesi, temel noktalardan biri
    Bluesky ekibinin zaman zaman bahsettiği abonelik hizmeti bununla bağlantılı olabilir gibi görünüyor; PDS’de daha fazla alan, bant genişliği ve yüksek kaliteli video sunmak gibi barındırma özellikleri premium katman olarak satmaya uygun duruyor

    • Doğru anladıysam bu PDS’yi Bluesky barındırıyordu
      Başka yerlerde de barındırılabilir olmalı; dolayısıyla Bluesky uygulamasının ötesinde etkileşim kurulabileceği sözü doğru görünüyor
  • İnternete bir şey yüklemeyi mümkün kıldığınızda, eninde sonunda birilerinin bunun üzerinde rastgele dosya barındırma denemesi olgusunun bir adı olması gerekiyor gibi görünüyor

    • Google hesaplarının ek ödeme yapılana kadar artık 15 GB sınırına sahip olmasının önemli nedeni de muhtemelen bu
      Sınırsız olduğu dönemlerde dosya sistemini Gmail vb. yerlere yedeklemeye çalışan birkaç açık kaynak proje ortaya çıkmıştı; Drive çıktıktan sonra bu daha da arttı
      Ücretsiz hizmetler böyle sorunların çıkacağını öngörüp varsayılan sınırlar koymalı
    • Zaten “parasitic computation” diye bir terim olduğuna göre buna “parasitic data storage” denebilir gibi
    • Johnson yasası: Bir şey ne kadar çok ilgi görürse, etki alanı da o kadar büyür
    • Inner Platform effecte yakın
      https://en.wikipedia.org/wiki/Inner-platform_effect
  • Bu tür konular ilginizi çekiyorsa atfile da bakmaya değer: https://github.com/electricduck/atfile

  • Oldukça havalı; yazının alt kısmında bağlantısı verilen ilginç GitHub issue’sunu hemen görebiliyorsunuz
    Bluesky’nin tanınmış isimlerinden pfrazee de görünüyor: https://github.com/bluesky-social/atproto/issues/523
    AT’den beklentim yüksek; Fediverse’te harika işler yapmış pek çok zeki insan da vardır elbette, ama bu paradigma daha sürdürülebilir ve pratik görünüyor
    Temelde merkezi olarak sunulup, gerektiğinde ya da ileri düzey kullanıcılara gerçek merkeziyetsizlik desteği verilmesi yaklaşımı

    • Sürdürülebilirlik açısından “Blockchain Capital’dan fon almak”tan daha iyi bir iş modeli umuyorum
      firehose aynalamadan yatırım getirisi elde etmenin bir yoluna ihtiyaç var; örneğin bazı kullanıcıların daha uzun video barındırma ücretini ödediği bir Discord alternatifi, relay’lerin erişim ve şifre çözme anahtarlarını yönetip komisyon aldığı Patreon benzeri bir yapı, Bandcamp tarzı bir sosyal pazar yeri mümkün görünüyor
      Sonuçta açık bir platform, şu anda da yapılmaması için bir neden yok
      https://www.blockchaincapital.com/blog/bluesky-13m-users-and...
      https://bsky.social/about/blog/09-11-2024-video
  • Bu yöntemin phishing veya kötü amaçlı yazılım dağıtımı için suistimal edileceği hissi uyandırmıyor mu?

    • Suistimal edilmeyen bir hosting sitesi var mı, emin değilim
      Bir hosting sitesi yaparsanız birilerinin onu kötü niyetli amaçlarla kullanmaya çalışması neredeyse bilişimin bir yasası gibi görünüyor
    • Gerçekten de öyle olacak
      Matrix ek dosyalarında da aynı sorun vardı
    • Yaklaşık 5 dakika sonra *.bsky.network Google Safe Browsing, Palo Alto, Bluecoat vb. tarafından engellenmeye başlar gibi
    • Emin değilim
      Bu, yazarın Bluesky sunucusuna, yani PDS’ye giden doğrudan bağlantı; dolayısıyla doğal olarak yazarın kontrolünde
  • Strava’nın son API değişikliklerini görünce, platformlarında saklanan verilere erişimin ne kadar kısıtlı olduğunu hatırladım
    Fitness alanındaki baskın hizmet oldukları için özellikleri kademeli olarak abonelik duvarının arkasına koyabilirler
    Gizlilik ya da güvenlik endişeleri olabilir, ama AT Protocol’ün GPX veya FIT dosyaları için bir depolama platformu olarak uygun olup olamayacağını merak ediyorum

    • Federe bir Strava alternatifi olsa güzel olurdu
      Ancak bildiğim kadarıyla AT Protocol henüz özel veya sınırlı erişimli gönderileri desteklemiyor; Strava kullanımında bunun oldukça temel bir özellik olduğunu düşünüyorum