แนะนำฟีเจอร์คลาวด์ของ 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 ความคิดเห็น
ความเห็นจาก Hacker News