跳到正文
cccskills
免费在 GitHub 公开

security-hard-exclusions-and-precedents

Use when a candidate finding falls into a noisy category - the do-not-report list, the precedents that settle recurring edge cases, and the narrow exceptions where an excluded category still counts

中文简介正在准备中。当前显示原文说明。

集成工具Firebase
查看安装方法

包含的文件(1)

  • SKILL.md8.8 KB

SKILL.md(原文)

安装前可以查看交给 AI 代理的指令内容。

Hard Exclusions and Precedents

Overview

Some categories produce far more noise than signal in a diff review, or are handled by another process. They are excluded up front so you never spend a finding — or a developer's revision — on them. Precedents settle the cases that come up every week, so two reviews of the same pattern reach the same answer.

Core principle: an exclusion is not a judgement that the issue is harmless; it is a judgement that this review is the wrong place for it.

1. Never Report

Availability and load

  • Denial of service, resource exhaustion, memory or CPU blow-up, missing rate limiting, unbounded loops — except the narrow single-input cases in §4.
  • Regex injection and ReDoS.

Hardening without a vulnerability

  • Missing security headers, HSTS advice, TLS/HTTPS in local development, "should use a stronger setting" with no concrete attack.
  • Missing input validation on a field that has no security effect.
  • Missing audit logs; log spoofing / log injection.

Out of this review's scope

  • Outdated libraries in general — dependency risk is judged by supply-chain-and-dependency-review, version by version.
  • Memory-safety issues in memory-safe languages (Go, Java, Kotlin, C#, Rust safe code, Python, JS). Native code, unsafe blocks, cgo and FFI are in scope (native-memory-safety-and-ffi).
  • Anything only in test files, fixtures, examples or documentation (Markdown, comments).
  • Theoretical race conditions and timing issues without a demonstrated window and impact. A check-then-act race the attacker drives with two concurrent requests, for money, quota, a unique claim or a privilege, is not theoretical (business-logic-and-state-abuse §2).
  • Secrets stored on disk with otherwise appropriate protection (a mounted secret file, an OS keychain).
  • Pre-existing issues the diff did not introduce or enable.

Usually noise — only at very high confidence

  • Open redirect, tabnabbing, XS-Leaks, prototype pollution: report only with a concrete chain to real impact (token theft via redirect in an OAuth flow, pollution reaching an auth decision or a child_process option).

2. Precedents

SituationRuling
Logging a secret, token, password or session idVulnerability (CWE-532)
Logging a URLFine — unless the URL carries a token or credential in the query
UUIDv4 ids in URLsUnguessable; enumeration is not the attack — the missing ownership check is
Values from environment variables, CLI flags, server config filesTrusted input
ORM query builders, parameterised SQLSafe; raw/text()/string-built SQL is not
React, Vue, Angular, Svelte templatesSafe by default; only dangerouslySetInnerHTML, v-html, {@html}, bypassSecurityTrust*, direct DOM sinks count
Missing permission check in client-side JS/TS or a mobile UINot a finding — the server is the boundary; check the server
SSRF or path traversal in browser codeNot a finding — the browser is the attacker's own machine
SSRF where the attacker controls only the path, not host or schemeNot reported
Shell scripts and .ipynb notebooksInjection only with a specific untrusted-input path into them
GitHub Actions inputsOnly when an untrusted event (fork PR, issue, comment) can trigger them; workflow_dispatch inputs come from people with write access
Resource leaks (unclosed files, connections)Bugs, not vulnerabilities
Crashes, panics, 500sBugs, unless the error path itself leaks data or fails open
Hard-coded non-secret config (project ids, hostnames, public client ids)Fine
Dev fallback such as os.environ.get("SECRET_KEY", "dev")Fine — unless production demonstrably runs without the variable set
Publishable keys (Stripe pk_, Firebase web config, analytics write keys)Fine by design
Secret in a test fixtureExcluded when it is a dummy or a documented test key; a real production credential pasted into a test is still a live secret
"Internal" service, private network, "only other services call it"Not authentication. Judge by who can reach it; if that is decided outside the repository, it is a needs-validation note
JSON Schema, protobuf, zod, Pydantic or a typed DTO on the inputProves shape, not authority, provenance or safe values
A tenant_id / owner_id column on the recordNot isolation until a query, policy or key on this path enforces it
A secret reference (vault path, env var name, secret ARN, key id)Not a disclosed secret
Missing cookie flags, missing MFA prompt, missing least privilege, missing pinningHardening, unless a concrete path uses the gap
A user installing a plugin, extension or script into their own appNot a boundary
A file, token or config readable only by the same OS userNot a finding — the attacker is the victim
Different responses that reveal whether a public account existsNot a finding; an oracle on a protected predicate (another tenant's record, a hidden field's value) is
Access-Control-Allow-Origin: * together with credentialsBrowsers refuse it — the finding shape is a reflected or loosely matched origin with credentials
A system prompt or guardrail instructionNot a control; tool permissions, scoping and approval are

3. The Rule That Was Replaced

The upstream list excluded "user content in an AI system prompt". This agent does not keep that exclusion. Prompt injection IS a finding when the model that reads untrusted content also holds privileged tools, private data or an outbound channel: then the model is the attacker's instrument and the user or the organisation is the victim (llm-and-agent-security). Untrusted text reaching a model that can do nothing but answer the same user is still not a finding.

4. Where an Exclusion Stops

  • Test files excluded — but a diff that changes production behaviour behind a test-only flag reachable in production (if os.getenv("TEST_MODE") disabling auth) is production code.

  • Documentation excluded — but an agent instruction file (CLAUDE.md, AGENTS.md, .cursorrules, a prompt template) is configuration an LLM executes; a hidden instruction or a permission change there is in scope.

  • Hardening excluded — but removing an existing control (deleting CSRF middleware, setting verify=False, dropping HttpOnly) is a removed guard, judged by its concrete impact.

  • Availability excluded — but one bounded input (not sustained volume) is in scope when the effect is persistent, amplified onto everyone, or spends operator money without limit:

    • a poisoned cache entry, or a persisted record or message that crashes every reader or blocks a shared queue partition until someone removes it by hand — integrity loss as much as availability;
    • a decompression, archive or image bomb expanded before any size check, on a shared worker, by an unauthenticated or low-trust sender;
    • a panic outside the request goroutine (Go's net/http recovers only the handler's own) or an unhandled rejection that kills the shared process, reachable from one request;
    • an untrusted trigger — an issue, an inbound email, a webhook, a public form — that starts work looping or fanning out paid API or model calls with no per-request budget, cap or cancellation.

    Write the input-to-cost path: the input, the work it triggers, the missing bound, who else is affected, and how the system recovers. MEDIUM by default; HIGH when unauthenticated and persistent. A missing rate limit, a slow endpoint or "many requests could…" stays excluded.

Common Mistakes

  • Reporting "no rate limit on login" — excluded; brute force is handled outside this review.
  • Reporting pk_live_ or a Firebase web apiKey as a leaked secret.
  • Reporting a stack trace on a 500 as data exposure when it contains no secret, path or query.
  • Flagging {userInput} in JSX as XSS.
  • Dropping a prompt-injection finding because "user content in prompts is excluded" while the model can call run_shell.
  • Using the availability exception for anything that needs sustained volume to hurt.

Red Flags

  • A comment full of excluded categories padding one real finding — cut them.
  • An exclusion used to wave away a removed guard.
  • A "test" helper imported from production code paths.

评价

还没有评价。欢迎分享你的使用感受。

评论

无需登录即可发表。欢迎分享使用感受、提问,或说明在哪些环境下无法运行。

还没有评论。来写第一条吧。

提交后会立即公开。请勿填写邮箱、电话等个人信息。URL 最多 2 个。

0 / 1000 字

此表单受 reCAPTCHA 保护,适用 Google 的隐私权政策和服务条款。

同一仓库的技能

Use when writing acceptance criteria for a task - express each as an observable Given/When/Then that QA can execute, including negative cases

中文简介正在准备中。当前显示原文说明。

makifbaysal/tasktrooper1182026年10月21日 更新

Use when the diff adds or changes an endpoint, resolver, RPC, job or query that takes an object id, a role check, a request binding or a tenant filter - BOLA/IDOR, function-level authorization, mass assignment and tenant scoping

中文简介正在准备中。当前显示原文说明。

makifbaysal/tasktrooper1182026年10月21日 更新

Use on every UI change - semantic HTML, labels for controls, keyboard-navigable dialogs/menus, visible focus, and never color as the only signal

中文简介正在准备中。当前显示原文说明。

makifbaysal/tasktrooper1182026年10月21日 更新

Use when a task changes any screen, form, dialog, menu or control - Lighthouse/axe scan of the changed screens, a keyboard walk, and the thresholds that fail a task

中文简介正在准备中。当前显示原文说明。

makifbaysal/tasktrooper1182026年10月21日 更新

How to work a task returned with review, QA or UAT findings. Use when a task is in need_revision or PR review comments are in your context.

中文简介正在准备中。当前显示原文说明。

makifbaysal/tasktrooper1182026年10月21日 更新

Use when the repository keeps its alerting in code, or a person asks for alerts outside TaskTrooper - PrometheusRule YAML, a Cloud Monitoring alert policy in Terraform, a Datadog monitor, each routed to TaskTrooper's alert ingest URL so it opens an incident here

中文简介正在准备中。当前显示原文说明。

makifbaysal/tasktrooper1182026年10月21日 更新

查看 makifbaysal 的全部技能

报告此技能的问题