2 puan yazan GN⁺ 2024-09-20 | 1 yorum | WhatsApp'ta paylaş

Arc'ın bulut özelliklerine giriş

  • Arc'ı kullanmak için bir hesap gerekiyor
  • Kimlik doğrulama için Firebase kullanılıyor
  • Easels adlı, beyaz tahta benzeri bir özellik var
  • Paylaş düğmesine tıklansa bile isteğin mitmproxy'de görünmediği fark ediliyor

Objective-C tabanlı Firebase uygulamasını hacklemek

  • Arka uç yazmadan, yalnızca veritabanı güvenlik kuralları yazarak Firestore kullanılıyor
  • Firestore, Swift SDK'da sistem proxy ayarlarını izlemiyor
  • İlgili çağrıları dökmek için bir Frida betiği yazılıyor
var documentWithPath = ObjC.classes.FIRCollectionReference["- documentWithPath:"];
var queryWhereFieldIsEqualTo = ObjC.classes.FIRQuery["- queryWhereField:isEqualTo:"];
var collectionWithPath = ObjC.classes.FIRFirestore["- collectionWithPath:"];

function getFullPath(obj) {
  if (obj.path && typeof obj.path === "function") {
    return obj.path().toString();
  }
  return obj.toString();
}

var queryStack = [];

function logQuery(query) {
  var queryString = `firebase.${query.type}("${query.path}")`;
  query.whereClauses.forEach((clause) => {
    queryString += `.where("${clause.fieldName}", "==", "${clause.value}")`;
  });
  console.log(queryString);
}

Interceptor.attach(documentWithPath.implementation, {
  onEnter: function (args) {
    var parent = ObjC.Object(args[0]);
    var docPath = ObjC.Object(args[2]).toString();
    var fullPath = getFullPath(parent) + "/" + docPath;
    var query = { type: "doc", path: fullPath, whereClauses: [] };
    queryStack.push(query);
    logQuery(query);
  },
});

Interceptor.attach(collectionWithPath.implementation, {
  onEnter: function (args) {
    var collectionPath = ObjC.Object(args[2]).toString();
    var query = { type: "collection", path: collectionPath, whereClauses: [] };
    queryStack.push(query);
  },
});

Interceptor.attach(queryWhereFieldIsEqualTo.implementation, {
  onEnter: function (args) {
    var fieldName = ObjC.Object(args[2]).toString();
    var value = ObjC.Object(args[3]).toString();

    if (queryStack.length > 0) {
      var currentQuery = queryStack[queryStack.length - 1];
      currentQuery.whereClauses.push({ fieldName: fieldName, value: value });
    }
  },
  onLeave: function (retval) {},
});

var executionMethods = [
  "- getDocuments",
  "- addSnapshotListener:",
  "- getDocument",
  "- addDocumentSnapshotListener:",
  "- getDocumentsWithCompletion:",
  "- getDocumentWithCompletion:",
];

executionMethods.forEach(function (methodName) {
  if (ObjC.classes.FIRQuery[methodName]) {
    Interceptor.attach(ObjC.classes.FIRQuery[methodName].implementation, {
      onEnter: function (args) {
        if (queryStack.length > 0) {
          var query = queryStack.pop();
          logQuery(query);
        }
      },
    });
  }
});

function formatFirestoreData(data) {
  if (data.isKindOfClass_(ObjC.classes.NSDictionary)) {
    let result = {};
    data.enumerateKeysAndObjectsUsingBlock_(
      ObjC.implement(function (key, value) {
        result[key.toString()] = value.toString();
      })
    );
    return JSON.stringify(result);
  }
  return data.toString();
}

var documentMethods = [
  { name: "- updateData:completion:", type: "update" },
  { name: "- updateData:", type: "update" },
  { name: "- setData:completion:", type: "set" },
  { name: "- setData:", type: "set" },
];

documentMethods.forEach(function (method) {
  if (ObjC.classes.FIRDocumentReference[method.name]) {
    Interceptor.attach(
      ObjC.classes.FIRDocumentReference[method.name].implementation,
      {
        onEnter: function (args) {
          var docRef = ObjC.Object(args[0]);
          var data = ObjC.Object(args[2]);
          var fullPath = getFullPath(docRef);
          var formattedData = formatFirestoreData(data);
          console.log(
            `firebase.doc("${fullPath}").${method.type}(${formattedData})`
          );
        },
      }
    );
  } else {
    console.log("Warning: " + method.name + " not found");
  }
});
  • Arc, kullanıcı varsayılanlarını, kullanıcı nesnelerini, önerileri ve Boost'ları Firestore'da saklıyor

Arc Boost nedir

  • Arc Boost, kullanıcıların web sitelerini özelleştirmesinin bir yolu
  • Öğe engelleme, yazı tipi değiştirme, renk değiştirme ve özel CSS ile JS kullanımı mümkün
  • Bir Boost oluşturup başka bir kullanıcının ID'siyle güncellemek mümkün

Başka kullanıcıların ID'sini elde etme

  • Kullanıcı önerileri: Öneri tablosundan kullanıcı ID'si alınabiliyor
  • Herkese açık Boost'lar: Boost anlık görüntüsünde oluşturan kişinin kullanıcı ID'si yer alıyor
  • Kullanıcı Easel'leri: Bir Easel paylaşarak kullanıcı ID'si elde edilebiliyor

Nihai saldırı zinciri

  • Kurbanın kullanıcı ID'si elde ediliyor
  • Kötü amaçlı bir Boost oluşturulup kendi hesaba kaydediliyor
  • Boost'un creatorID alanı hedefin ID'siyle güncelleniyor
  • Kurban hedef web sitesini ziyaret ettiğinde enfekte oluyor

Ayrıcalıklı sayfalarda RCE

  • Boost'lar diğer protokollerde de çalışıyor
  • chrome://settings sayfasında ayrıcalık yükseltme mümkün

Gizlilik sorunları

  • Ziyaret edilen sitelerle ilgili veriler sunucuya gönderiliyor
  • Bu durum Arc'ın gizlilik politikasına aykırı

GN⁺ özeti

  • Arc'ın bulut özelliklerini ve güvenlik açıklarını analiz eden bir yazı
  • Firestore kullanan arka uç güvenliği sorunlarını ele alıyor
  • Arc Boost ile kullanıcı özelleştirmesini ve buna eşlik eden güvenlik açıklarını açıklıyor
  • Başka kullanıcıların ID'sini elde ederek kötü amaçlı Boost çalıştırma yöntemini gösteriyor
  • Gizlilik sorunları ve ayrıcalık yükseltme ihtimali konusunda endişe dile getiriyor

1 yorum

 
GN⁺ 2024-09-20
Hacker News görüşleri
  • Arc tarayıcısındaki güvenlik açığı affedilemez düzeyde ve bu yüzden Arc’ı bir daha kullanmayacağım
  • Her tıklamada koşup gelen piksel sanatlı kedi eğlenceli ve internetin keyifli bir yer olabileceğini hatırlatıyor
  • Arc tarayıcısını kullananları uyarmak için gönderi başlığına Arc eklenmeli
  • Arc hesap istiyor ve kullanıcının ziyaret ettiği her sayfanın ana makine adını ve kullanıcı kimliğini Google’ın Firebase’ine gönderiyor. Bu da Arc’ın şu anda kullanılan en mahremiyet karşıtı web tarayıcısı olduğu anlamına geliyor
  • Firebase güvenlik kurallarının varsayılan ayarı tuhaf ve deneyimli geliştiriciler istemcinin kendi kullanıcı kimliğini korumalı API yoluna iletmesine izin vermez
  • OP, Arc tarayıcısından bahsediyor; Arc dili ya da başka projelerle karıştırılmamalı
  • Arc tarayıcısının uzun ömürlü olmayacağı anlaşılıyor ve en güvenli tarayıcı Chrome. Yeni yazılım seçerken dikkatli olmak gerekiyor
  • 2000 dolarlık ödül, açığın büyüklüğüne kıyasla aşağılayıcı derecede düşük
  • Blog gönderisinde geçen 'arc'ın ne olduğunu merak edenler var. Görünüşe göre Arc tarayıcısı
  • Büyük harfler düzgün kullanılmadığı için okunması zor bir yazı