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 access
  • obj[key] — element access
  • for (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:column

Vì 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-Type bằng cách pollute application/json parameters.
  • 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ínhGiá trị
Ngôn ngữTypeScript 90.6% / JS 5.7%
Yêu cầu runtimeNode.js ≥ 20.2.0
Cơ chếAST instrumentation qua Node --loader
Detection typesproperty / element / for-in / in-expression
LicenseMIT
Stars / Forks193 / 19 (tại thời điểm viết)
Test coverage16 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-finder

Chạy qua CLI:

pp-finder run node ./index.js

Hoặ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/jest

Muố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ừ đây

So với các tool khác

ToolHướng tiếp cậnPhù hợp khi
PP-FinderAST + runtime hook (source-side)Bạn có source code và test suite
Doyensec Gadgets FinderBlack-box JSON poisoning (Burp)Pentest target không có source
Dasty (ACM 2024)Dynamic taint analysisResearch scale, scan npm registry
GHunterRuntime taint trên V8Soi runtime Node/Deno (đã tìm 56 + 67 gadget)
DOM InvaderBrowser 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-finder và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 undefined hợp lệ — cần filter bằng PPF_LOGONCE hoặ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).