Prototype Pollution là một lỗ hổng bảo mật trong JavaScript, cho phép kẻ tấn công chèn hoặc ghi đè các thuộc tính tùy ý lên prototype của các object toàn cục (ví dụ: Object.prototype).
Do cơ chế kế thừa (prototype chain) của JavaScript, các thuộc tính bị “ô nhiễm” này có thể ảnh hưởng đến toàn bộ object được tạo ra sau đó trong ứng dụng.
Nói cách khác, chỉ cần kiểm soát được prototype, attacker có thể gián tiếp kiểm soát hành vi của rất nhiều object khác mà lẽ ra không thể truy cập trực tiếp.
🔍 Prototype Chain và vì sao nó nguy hiểm?
Trong JavaScript, khi truy cập một thuộc tính của object: obj.property
Nếu property không tồn tại trong obj, JavaScript sẽ tìm ngược lên prototype (obj.__proto__, rồi Object.prototype, …).
👉 Nếu attacker có thể thêm thuộc tính vào Object.prototype, thì mọi object trong ứng dụng đều có thể “vô tình” sử dụng thuộc tính đó.
Ví dụ nguy hiểm: Object.prototype.isAdmin = true;
Khi đó: const user = {}; if (user.isAdmin) { // quyền admin bị bypass }
⚙️ Polluting a Config Object via Prototype Pollution
Prototype pollution thường xảy ra khi ứng dụng:
- Merge object không an toàn (Object.assign, lodash.merge, deepMerge…)
- Parse JSON hoặc input từ user mà không lọc các key đặc biệt như:
- __proto__
- prototype
- constructor
Sau khi merge: if (config.debug) { // debug mode bị bật trên toàn hệ thống }
➡️ Dù attacker không truy cập trực tiếp được config, nhưng bằng prototype pollution, họ đã ghi đè hành vi của ứng dụng.
🔗 Vì sao Prototype Pollution thường được chain với lỗ hổng khác?
Prototype pollution hiếm khi khai thác được ngay lập tức, nhưng nó rất nguy hiểm vì có thể kết hợp (chain) với các lỗ hổng khác: 🌐 Client-side JavaScript
- Dẫn đến DOM-based XSS
- Ví dụ: ghi đè innerHTML, onerror, src, href…
- Có thể gây Logic bypass
- Nguy hiểm hơn: Remote Code Execution (RCE) trong một số framework hoặc thư viện
👉 Chỉ cần ứng dụng xử lý thuộc tính bị attacker kiểm soát theo cách không an toàn, prototype pollution sẽ trở thành bàn đạp cho tấn công nghiêm trọng hơn.
🛡️ Cách phòng chống Prototype Pollution
Một số biện pháp quan trọng:
- ❌ Không merge object từ user input một cách mù quáng
- 🚫 Filter hoặc block các key nguy hiểm: __proto__, constructor, prototype
- ✅ Sử dụng Object.create(null) cho object không cần prototype
- 📦 Cập nhật thư viện (lodash, express, etc.) lên phiên bản đã fix
- 🔍 Thực hiện security review với các chức năng xử lý JSON / config
🧠 Kết luận
Prototype Pollution không phải lúc nào cũng gây tác hại ngay, nhưng nó là một lỗ hổng nền tảng cực kỳ nguy hiểm.
Khi kết hợp với DOM XSS, logic flaw hoặc insecure deserialization, hậu quả có thể từ chiếm quyền người dùng cho tới RCE trên server.
👉 Với các ứng dụng JavaScript hiện đại (frontend & backend), việc hiểu và phòng chống Prototype Pollution là bắt buộc đối với developer và pentester.