2 คะแนน โดย GN⁺ 2024-09-20 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

แนะนำฟีเจอร์คลาวด์ของ Arc

  • ต้องมีบัญชีเพื่อใช้งาน Arc
  • ใช้ Firebase สำหรับการยืนยันตัวตน
  • มีฟีเจอร์คล้ายไวท์บอร์ดชื่อ 'Easels'
  • แม้จะคลิกปุ่มแชร์ ก็ไม่เห็นคำขอใน mitmproxy

การแฮ็กแอป Firebase ที่พัฒนาด้วย Objective-C

  • ใช้ Firestore จึงเขียนเพียงกฎความปลอดภัยของฐานข้อมูลโดยไม่ต้องทำแบ็กเอนด์เอง
  • Firestore ไม่ทำตามการตั้งค่าซิสเต็มพร็อกซีใน Swift SDK
  • เขียนสคริปต์ Frida เพื่อดัมพ์การเรียกที่เกี่ยวข้อง
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 เก็บค่าตั้งต้นของผู้ใช้ อ็อบเจ็กต์ผู้ใช้ คำแนะนำ และ Boost ไว้ใน Firestore

Arc Boost คืออะไร

  • Arc Boost เป็นวิธีที่ผู้ใช้ใช้ปรับแต่งเว็บไซต์ได้
  • บล็อกองค์ประกอบ เปลี่ยนฟอนต์ เปลี่ยนสี และใช้ CSS กับ JS แบบกำหนดเองได้
  • สามารถสร้าง Boost และอัปเดตโดยใช้ ID ของผู้ใช้อื่นได้

การได้มาซึ่ง ID ของผู้ใช้อื่น

  • คำแนะนำผู้ใช้: สามารถรับ ID ผู้ใช้ได้จากตารางคำแนะนำ
  • Boost แบบสาธารณะ: สแนปช็อตของ Boost มี ID ผู้ใช้ของผู้สร้างรวมอยู่ด้วย
  • Easels ของผู้ใช้: แชร์ Easel เพื่อให้ได้ ID ผู้ใช้

เชนการโจมตีขั้นสุดท้าย

  • ได้รับ ID ผู้ใช้ของเหยื่อ
  • สร้าง Boost อันตรายและบันทึกไว้ในบัญชีของตนเอง
  • อัปเดตฟิลด์ creatorID ของ Boost เป็น ID ของเป้าหมาย
  • เมื่อเหยื่อเข้าเว็บไซต์เป้าหมาย ก็จะติดการโจมตี

RCE บนหน้าที่มีสิทธิพิเศษ

  • Boost ทำงานได้บนโปรโตคอลอื่นด้วย
  • สามารถยกระดับสิทธิ์บนหน้า chrome://settings ได้

ปัญหาความเป็นส่วนตัว

  • ข้อมูลเกี่ยวกับเว็บไซต์ที่เข้าเยี่ยมชมถูกส่งไปยังเซิร์ฟเวอร์
  • ขัดกับนโยบายความเป็นส่วนตัวของ Arc

สรุปโดย GN⁺

  • บทความนี้วิเคราะห์ฟีเจอร์คลาวด์และช่องโหว่ด้านความปลอดภัยของ Arc
  • กล่าวถึงปัญหาความปลอดภัยของแบ็กเอนด์ที่ใช้ Firestore
  • อธิบายการปรับแต่งสำหรับผู้ใช้ผ่าน Arc Boost และช่องโหว่ด้านความปลอดภัย
  • นำเสนอวิธีได้มาซึ่ง ID ของผู้ใช้อื่นเพื่อรัน Boost อันตราย
  • ตั้งข้อกังวลเกี่ยวกับปัญหาความเป็นส่วนตัวและความเป็นไปได้ในการยกระดับสิทธิ์

1 ความคิดเห็น

 
GN⁺ 2024-09-20
ความเห็นจาก Hacker News
  • ช่องโหว่ด้านความปลอดภัยของเบราว์เซอร์ Arc อยู่ในระดับที่ให้อภัยไม่ได้ และด้วยเหตุนี้จึงจะไม่ใช้ Arc อีกต่อไป
  • แมวพิกเซลอาร์ตที่วิ่งมาตอนคลิกแต่ละครั้งนั้นสนุกดี และเตือนให้เห็นว่าอินเทอร์เน็ตยังเป็นพื้นที่ที่สนุกได้
  • ควรเพิ่มคำว่า Arc ลงในชื่อโพสต์เพื่อเตือนผู้ที่ใช้เบราว์เซอร์ Arc
  • Arc บังคับให้มีบัญชี และส่งชื่อโฮสต์ของทุกหน้าที่ผู้ใช้เข้าชมพร้อมกับ ID ผู้ใช้ไปยัง Google Firebase นั่นหมายความว่า Arc เป็นเว็บเบราว์เซอร์ที่ละเมิดความเป็นส่วนตัวมากที่สุดตัวหนึ่งที่กำลังใช้อยู่ตอนนี้
  • การตั้งค่าเริ่มต้นของกฎความปลอดภัย Firebase นั้นแปลก และนักพัฒนาที่มีประสบการณ์จะไม่ปล่อยให้ไคลเอนต์ส่ง ID ผู้ใช้ของตัวเองไปยังเส้นทาง API ที่มีการป้องกัน
  • OP กำลังพูดถึงเบราว์เซอร์ Arc และไม่ควรสับสนกับภาษา Arc หรือโปรเจ็กต์อื่น
  • ดูเหมือนว่าเบราว์เซอร์ Arc จะอยู่ได้ไม่นาน และ Chrome คือเบราว์เซอร์ที่ปลอดภัยที่สุด ควรระมัดระวังในการเลือกใช้ซอฟต์แวร์ใหม่
  • เงินรางวัล $2000 เป็นจำนวนที่น่าดูถูกเมื่อเทียบกับช่องโหว่ขนาดใหญ่เช่นนี้
  • มีคนสงสัยว่า 'arc' ที่กล่าวถึงในบล็อกโพสต์คืออะไร ดูเหมือนว่าจะหมายถึงเบราว์เซอร์ Arc
  • บทความนี้อ่านยากเพราะใช้ตัวพิมพ์ใหญ่ไม่ถูกต้อง