- PP-Finder của YesWeHack dùng AST + Node.js loader để phát hiện gadget prototype pollution trong codebase JavaScript.
- Đã giúp tìm lỗ hổng trong Express, Fastify, Vue.js, JSDOM và Axios — cài đặt 1 lệnh, chạy ngay trên dự án có sẵn.
TL;DR
PP-Finder là CLI + Node.js loader mã nguồn mở của YesWeHack, giúp bạn tìm gadget prototype pollution trong codebase JavaScript/TypeScript. Thay vì grep text, tool parse AST và inject hook runtime để log mọi lần code truy cập vào property không tồn tại — đó chính là dấu hiệu của một gadget có thể bị khai thác khi Object.prototype bị làm bẩn. Repo đã giúp phát hiện lỗ hổng thực tế trong Express, Fastify, Vue.js, JSDOM, Axios. Cài bằng npm install -g pp-finder, chạy một lệnh là có kết quả.
Gadget là gì và vì sao PP-Finder khác biệt?
Prototype pollution cần hai mảnh ghép để thành exploit: một input vector cho phép ghi vào Object.prototype (thường qua merge sâu, parse JSON, copy object), và một gadget — đoạn code runtime đọc property không định nghĩa, từ đó bị chi phối bởi prototype đã pollute. Vector thì các scanner thông thường bắt được; gadget thì không — nó ẩn sâu trong business logic.
PP-Finder tấn công đúng khoảng trống đó. Nó dùng TypeScript parser sinh AST cho từng file, rồi inject wrapper vào các điểm:
obj.foo— property accessobj[key]— element accessfor (k in obj)— for-in enumeration'x' in obj— in expression
Bất cứ khi nào runtime chạy qua một trong các điểm này và kết quả là undefined, tool log ngay với format:
[PP][type] "property" at file:line:columnVì sao nên quan tâm?
Prototype pollution không phải bug hiếm. YesWeHack liệt kê các exploit RCE/SSRF đã được verify trên những thư viện top trending của Node:
- Express — lợi dụng cache qua header
if-none-match, phát hiện pollution mà không crash server. - Fastify — thao túng
Content-Typebằng cách polluteapplication/jsonparameters. - Vue.js — RCE qua
ssrCssVars. - JSDOM — script execution.
- Axios — redirect qua Unix socket.
- Got — SSRF.
Tức là nếu app Node của bạn dùng ecosystem phổ biến, khả năng cao đã có gadget khai thác được — chỉ chờ một vector đúng là vỡ trận.
Thông số kỹ thuật
| Thuộc tính | Giá trị |
|---|---|
| Ngôn ngữ | TypeScript 90.6% / JS 5.7% |
| Yêu cầu runtime | Node.js ≥ 20.2.0 |
| Cơ chế | AST instrumentation qua Node --loader |
| Detection types | property / element / for-in / in-expression |
| License | MIT |
| Stars / Forks | 193 / 19 (tại thời điểm viết) |
| Test coverage | 16 test files cho AST visitors |
Env vars hữu ích: PPF_LOGONCE dedupe log trùng; PPF_WRAPPER_NAME đổi tên wrapper nếu conflict với instrumentation khác; PPF_COLOR toggle màu output.
Chạy thử trong 30 giây
Cài global:
npm install -g pp-finder
# hoặc
yarn global add pp-finderChạy qua CLI:
pp-finder run node ./index.jsHoặc dùng Node loader trực tiếp (ưu tiên khi muốn chạy test suite):
node --loader pp-finder ./index.js
node --loader pp-finder ./node_modules/.bin/jestMuốn bỏ qua phần init module ồn ào? Thả directive vào đúng chỗ bắt đầu quan tâm:
"pp-finder start";
// code cần instrument từ đâySo với các tool khác
| Tool | Hướng tiếp cận | Phù hợp khi |
|---|---|---|
| PP-Finder | AST + runtime hook (source-side) | Bạn có source code và test suite |
| Doyensec Gadgets Finder | Black-box JSON poisoning (Burp) | Pentest target không có source |
| Dasty (ACM 2024) | Dynamic taint analysis | Research scale, scan npm registry |
| GHunter | Runtime taint trên V8 | Soi runtime Node/Deno (đã tìm 56 + 67 gadget) |
| DOM Invader | Browser DevTools (PortSwigger) | Client-side PP |
Điểm mạnh của PP-Finder là friction thấp: không cần dựng taint engine, không cần symbolic solver. Điểm yếu: chỉ bắt gadget khi code thực sự chạy qua điểm đó, nên coverage phụ thuộc chất lượng test hoặc fuzz input.
Use cases thực tế
- Security audit nội bộ — chạy trong CI sau mỗi PR, fail build nếu xuất hiện gadget mới.
- Bug bounty — scan thư viện open-source để tìm chain exploit (đây cũng là cách YesWeHack tìm ra các vuln đã công bố).
- Triage CVE — khi có PP advisory mới, chạy PP-Finder trên
node_modulesđể nhanh chóng khoanh vùng bị ảnh hưởng. - Hardening — sau khi đã fix gadget, đưa
pp-findervào smoke test để tránh regress.
Limitations & pricing
- Free & mã nguồn mở (MIT) — không có tier paid.
- Cần Node ≥ 20.2.0 — dự án kẹt Node 18 phải upgrade trước khi thử.
- Không tự sinh payload exploit — tool chỉ báo gadget, việc chain từ HTTP input tới sink vẫn là công của pentester.
- False positives với optional field truy cập
undefinedhợp lệ — cần filter bằngPPF_LOGONCEhoặc transformer tuỳ chỉnh. - Có thể conflict với bundler custom hoặc loader khác (SWC-only, webpack phức tạp).
Bước tiếp theo
Cộng đồng research đang đẩy hướng source-to-sink reachability — kết hợp AST hook kiểu PP-Finder với symbolic execution để tự động xác minh gadget có thực sự đến được từ untrusted input không. Trong lúc chờ, PP-Finder vẫn là công cụ low-friction tốt nhất để developer tự soi code mình trước khi attacker làm.
Nếu bạn maintain một package Node thuộc top download, ít nhất hãy dành 5 phút chạy pp-finder qua test suite — kết quả có thể làm bạn bất ngờ.
Nguồn: yeswehack/pp-finder, YesWeHack Learn, Doyensec Blog, Dasty (arXiv).
