Skip to main content

v8-poc-classification

Checks if a POC provided by some JS and d8 flags is a vulnerability or just a regular bug.

Informations de source

Dépôt
nodejs/node
Dernière activité de la source
4 octobre 2026 à 21:04
Langue détectée de SKILL.md
anglais
Étoiles
122 328
Forks
38 780

Options d'installation

Le prompt qui vérifie d'abord la source est sélectionné par défaut. Vous pouvez passer à une commande directe ou télécharger une copie locale.

Vérifiez les fichiers source

Lisez SKILL.md et les fichiers associés affichés par SkillsMP avant de décider de l'installer.

Affichage de SKILL.md

SKILL.md
Instructions source · Aperçu en lecture seule
name
v8-poc-classification
description
Checks if a POC provided by some JS and d8 flags is a vulnerability or just a regular bug.
# Skill: V8 POC Classification Use this skill to determine if a reported Proof-of-Concept (POC) crash is a security vulnerability or a regular bug through empirical technical analysis. ## Core Mandates - **Scope Limitation:** This skill is strictly for **technical analysis and classification**. It does NOT include implementing a fix. - **Empirical Verification of ALL Claims:** Do not take ANY part of the reporter's classification or impact claims at face value. Every claim (e.g., "arbitrary memory write", "sandbox escape", "silent write") MUST be empirically verified. - **Verify with Debuggers:** A claim of memory corruption must be verified by observing the crash or memory state using debugging tools (GDB). - **Read vs. Write**: You MUST verify the faulting instruction type. - **Pointer Control**: Check if faulting addresses or register values are actually controlled by the attacker (e.g., contain values from the POC). - **Mandatory Non-ASan Verification:** For any potential security bug, you MUST verify reproduction on a standard **Release build without ASan/UBSan**. - **Autonomous Classification:** You are responsible for forming your own technical conclusion. If your analysis shows it is a `DCHECK` failure or relies on experimental flags, classify it as a **Bug**. ## Workflow ### 1. Initial Verification & Exhaustive Reproduction Confirm the bug exists as reported. - **Action**: Run `d8 <provided-flags> <poc.js>`. - **Escalation**: If it doesn't reproduce, try multiple revisions (Reporter's commit and Main) and build configurations (Debug, ASan, Release). - **Deep Dive**: Capture the initial backtrace and faulting instruction in GDB. - **Check for Explicit Aborts:** Look for evidence that execution was intentionally terminated by V8 (e.g., via `SBXCHECK`, `FATAL`, or traps). If so, this is typically **Intended Behavior** (see guidelines below). ### 2. Security Boundary Investigation (The Filter) Determine if the bug remains a vulnerability under production restrictions. - **Action**: Run with `provided_flags + --run-as-[sandbox]-security-poc`. - **Failure Loop (If reproduction stops)**: 1. **Analyze**: Identify which flag or syntax is restricted. Is it `--allow-natives-syntax`? Is it an experimental compiler flag? 2. **Heal**: Attempt to rewrite the POC to avoid the restriction. - *Example*: Replace `%OptimizeFunctionOnNextCall(f)` with a loop that triggers Tier-up: `for(let i=0; i<10000; i++) f();`. - *Example*: Replace `%ArrayBufferDetach(b)` with a standard way to detach/transfer if possible. 3. **Conclude**: If the logic *requires* a restricted feature (like `--fuzzing` or a non-shipping experimental flag) to trigger the memory corruption, the report is likely a **Bug**, not a vulnerability. ### 3. Impact Assessment & Minimization Technical proof of the vulnerability's severity. - **Minimization**: Strip the POC and flags to the absolute minimum required to trigger the crash under the security POC flags. - **Flag Bisection**: If reproduction requires catch-all flags like `--future`, you MUST identify the minimal set of flags responsible for the behavior. - **Identify Implications:** Search `src/flags/flag-definitions.h` for flags implied by the reported flags. - **Check Production Defaults:** Verify if the identified flags are enabled or disabled by default in production. - **Systematic Testing:** Test each implied flag individually (or in groups) with the POC to pinpoint the specific optimization or feature at fault. - **Impact Escalation**: If the bug exists but does NOT cause a crash (e.g., a "stale value" or "logical type confusion"), you MUST attempt to escalate it to a memory safety violation. Prove that the logical flaw can bypass V8's security boundaries. - **Techniques**: Type Confusion (misleading object layout), OOB Access (stale length), Pointer Overwrite (overwriting field/loop-carried pointer). - **Verification**: Run the *minimized* POC on a **Standard Release build (non-ASan)**. - If it stops crashing or is caught by a hardened check (`SBXCHECK`, `FATAL`), classify it as **Intended Behavior** or a **Bug**. - **Crashing POC for ClusterFuzz**: A crashing POC (segfault) is highly preferred for ClusterFuzz upload. Always try to provide a standalone `.js` file that crashes on a Release build. - **Deep Dive (GDB)**: - Verify **Attacker Control**: Do registers or memory at the crash site reflect values set in the POC (e.g., `0x41414141`)? - **Read vs. Write**: Explicitly identify the primitive. - **Scope Analysis**: For logical bugs, use tracing flags (e.g., `--trace-maglev-graph-building`) to confirm the discrepancy. - **Component Mapping**: Identify the specific V8 subsystem affected (e.g., Maglev, Turbofan, Ignition, WebAssembly) to support component classification. ### 4. Classification Guidelines The classification MUST be supported by empirical evidence from the local reproduction: - **Local Reproduction Findings**: - **Status**: Reproduced / Not Reproduced. - **Reproduction**: `d8 <flags> <poc.js>` (Exact command used locally). - **Result**: Summarize the result of running the command (output, crash, sandbox violation, harmless memory access). - **Build**: The build variant (e.g., x64.release, x64.debug, asan). Always include the V8 version from `src/utils/version.h` and the specific git hash using `git rev-parse HEAD` for technical accuracy. - **Verified Impact**: Summarize the **Verified Impact** (e.g., confirmed OOB write). If the bug is purely logical and caught by runtime protections (like `ref.cast` or bounds checks) without crashing, state this clearly. - **GDB Backtrace**: Include a snippet if it supports the classification. Summary of rules from [triaging.md](../../../docs/security/triaging.md) based on the threat model: #### Regular Bugs (No initial in-sandbox write) - **Type=Vulnerability**: Production code, enabled by default, survives the security POC flags (`--run-as-security-poc`). - **Type=Bug**: Requires experimental flags (not in `--future`), developer flags, or only triggers a `DCHECK` or reliable `CHECK` (safe termination). - **Intended Behavior**: Safe termination (e.g., via `SBXCHECK`, `FATAL`, or hardened libc++ checks). - **Indicators:** Look for traps like `int3` (x64), `brk #0` (arm64), or calls to the Abort builtin or the runtime function in the backtrace/disassembly. Also look for "Fatal error" or "Safely terminating process" in stderr, or calls to `v8::base::OS::Abort` in the backtrace. #### Sandbox Bypasses (Starts with in-sandbox write/corruption) - **Type=Vulnerability**: Demonstration of **write access** outside the sandbox (e.g., "V8 sandbox violation detected") using `--sandbox-testing`. - **Intended Behavior**: Read-only bypass, or safe termination ("Caught harmless memory access violation"). Includes linear OOB writes (e.g., `memset`, `memcpy`) hitting guard regions, or corrupting trusted objects with well-formed data of the same type. Also includes breaking internal invariants using testing-only natives (restricted by `IsEnabledForFuzzing`) if the impact is safely contained.
Voir sur GitHub