2 poin oleh GN⁺ 2024-09-20 | 1 komentar | Bagikan ke WhatsApp

Pengenalan fitur cloud Arc

  • Untuk menggunakan Arc, diperlukan akun
  • Menggunakan Firebase untuk autentikasi
  • Ada fitur mirip papan tulis bernama 'Easels'
  • Bahkan saat tombol bagikan diklik, permintaan tidak muncul di mitmproxy

Meretas aplikasi Firebase berbasis Objective-C

  • Menggunakan Firestore sehingga backend ditulis tanpa membuat server sendiri, hanya dengan menulis aturan keamanan database
  • Firestore tidak mengikuti pengaturan proxy sistem di Swift SDK
  • Menulis skrip Frida untuk membuang panggilan terkait
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 menyimpan preferensi dasar pengguna, objek pengguna, rekomendasi, dan boost di Firestore

Apa itu Arc Boost

  • Arc Boost adalah cara bagi pengguna untuk mengustomisasi situs web
  • Bisa memblokir elemen, mengubah font, mengubah warna, dan menggunakan CSS serta JS kustom
  • Bisa membuat boost dan memperbaruinya dengan ID pengguna lain

Mendapatkan ID pengguna lain

  • Rekomendasi pengguna: ID pengguna bisa didapat dari tabel rekomendasi
  • Boost publik: snapshot boost memuat ID pengguna pembuatnya
  • Easel pengguna: bagikan easel untuk mendapatkan ID pengguna

Rantai serangan akhir

  • Mendapatkan ID pengguna korban
  • Membuat boost berbahaya dan menyimpannya di akun sendiri
  • Memperbarui field creatorID boost dengan ID target
  • Saat korban mengunjungi situs web target, korban akan terinfeksi

RCE di halaman berhak istimewa

  • Boost juga berjalan pada protokol lain
  • Dapat meningkatkan hak istimewa di halaman chrome://settings

Masalah privasi

  • Data tentang situs yang dikunjungi dikirim ke server
  • Bertentangan dengan kebijakan privasi Arc

Ringkasan GN⁺

  • Artikel ini menganalisis fitur cloud Arc dan kerentanan keamanannya
  • Membahas masalah keamanan backend yang memanfaatkan Firestore
  • Menjelaskan kustomisasi pengguna melalui Arc Boost dan celah keamanannya
  • Menunjukkan cara menjalankan boost berbahaya dengan memperoleh ID pengguna lain
  • Mengangkat kekhawatiran tentang masalah privasi dan kemungkinan eskalasi hak istimewa

1 komentar

 
GN⁺ 2024-09-20
Komentar Hacker News
  • Kerentanan keamanan pada browser Arc berada pada tingkat yang tidak bisa dimaafkan, dan karena itu saya tidak akan pernah menggunakan Arc lagi
  • Kucing pixel art yang muncul setiap kali diklik itu menyenangkan dan mengingatkan bahwa internet bisa menjadi tempat yang menyenangkan
  • Perlu menambahkan Arc pada judul postingan untuk memperingatkan orang-orang yang menggunakan browser Arc
  • Arc mewajibkan akun dan mengirim nama host dari setiap halaman yang dikunjungi pengguna serta ID pengguna ke Firebase milik Google. Ini berarti Arc adalah browser web yang paling tidak menjaga privasi di antara yang saat ini saya gunakan
  • Pengaturan default aturan keamanan Firebase aneh, dan pengembang yang berpengalaman tidak akan membiarkan klien mengirimkan ID penggunanya sendiri ke jalur API yang dilindungi
  • OP sedang membicarakan browser Arc, dan itu tidak boleh disalahartikan sebagai bahasa Arc atau proyek lain
  • Browser Arc tampaknya tidak akan bertahan lama, dan Chrome adalah browser yang paling aman. Kita harus berhati-hati saat memilih perangkat lunak baru
  • Hadiah $2000 adalah jumlah yang menghina dibandingkan dengan besarnya kerentanan tersebut
  • Ada orang yang bertanya-tanya apa yang dimaksud dengan 'arc' dalam postingan blog. Sepertinya itu browser Arc
  • Artikel ini sulit dibaca karena penggunaan huruf kapital tidak dilakukan dengan benar