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.

ソース情報

リポジトリ
nodejs/node
ソースの最終更新活動
2026年10月4日 21:04
検出された SKILL.md の言語
英語
スター
122,328
フォーク
38,780

インストール方法

デフォルトでは、最初にソースを確認する Prompt が選択されています。直接コマンドに切り替えるか、ローカルコピーをダウンロードすることもできます。

ソースファイルを確認

インストールを決める前に、SKILL.md と SkillsMP に表示されている付属ファイルをお読みください。

SKILL.md を表示中

SKILL.md
ソースの指示 · 読み取り専用プレビュー
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.
GitHubで見る