Symfony Security Review
symfony/symfony
Review a change (a PR, the current branch diff, or a set of files) or audit a component or the whole tree for missing or incorrect security hardening.
Review a change (a PR, the current branch diff, or a set of files) or audit a Symfony UX package or the whole src/ tree for missing or incorrect security hardening.
$ npx skills add symfony/ux --skill symfony-security-review -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install symfony/ux symfony-security-review --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/symfony/ux.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/symfony-security-review .claude/skills/symfony-security-review && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "symfony-security-review" agent skill from https://github.com/symfony/ux/tree/3.x/.agents/skills/symfony-security-review into .claude/skills/symfony-security-review/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "symfony-security-review", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/symfony/ux/tree/3.x/.agents/skills/symfony-security-reviewType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add symfony/ux --skill symfony-security-review -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install symfony/ux symfony-security-review --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/symfony/ux.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/symfony-security-review .agents/skills/symfony-security-review && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "symfony-security-review" agent skill from https://github.com/symfony/ux/tree/3.x/.agents/skills/symfony-security-review into .agents/skills/symfony-security-review/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "symfony-security-review", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add symfony/ux --skill symfony-security-review -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install symfony/ux symfony-security-review --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/symfony/ux.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/symfony-security-review .cursor/skills/symfony-security-review && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "symfony-security-review" agent skill from https://github.com/symfony/ux/tree/3.x/.agents/skills/symfony-security-review into .cursor/skills/symfony-security-review/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "symfony-security-review", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/symfony/ux.git --path .agents/skills/symfony-security-review--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add symfony/ux --skill symfony-security-review -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install symfony/ux symfony-security-review --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/symfony/ux.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/symfony-security-review .gemini/skills/symfony-security-review && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "symfony-security-review" agent skill from https://github.com/symfony/ux/tree/3.x/.agents/skills/symfony-security-review into .gemini/skills/symfony-security-review/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "symfony-security-review", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install symfony/ux symfony-security-reviewInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add symfony/ux --skill symfony-security-review -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/symfony/ux.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/symfony-security-review .github/skills/symfony-security-review && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "symfony-security-review" agent skill from https://github.com/symfony/ux/tree/3.x/.agents/skills/symfony-security-review into .github/skills/symfony-security-review/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "symfony-security-review", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add symfony/ux --skill symfony-security-review -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install symfony/ux symfony-security-review --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/symfony/ux.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/symfony-security-review .opencode/skills/symfony-security-review && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "symfony-security-review" agent skill from https://github.com/symfony/ux/tree/3.x/.agents/skills/symfony-security-review into .opencode/skills/symfony-security-review/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "symfony-security-review", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
symfony-security-reviewReview a change (a PR, the current branch diff, or a set of files) or audit a Symfony UX package or the whole src/ tree for missing or incorrect security hardening.
Symfony Security Review is an agent skill from symfony/ux. Review a change (a PR, the current branch diff, or a set of files) or audit a Symfony UX package or the whole src/ tree for missing or incorrect security hardening. Reasons about trust boundaries from first principles, then checks the code against the hardening families catalogued from ux's past security fixes. Use when asked for a security review or a security audit of ux code, whether a change weakens a security control, or to hunt a vulnerability class across the packages.
Its SKILL.md is about 2.9k tokens, which your agent loads only when the skill is triggered. The skill folder holds 1 other file (for example `hardening-families.md`).
It sits in Security, covering Security review. It works with Symfony. The repository describes itself as: Symfony UX initiative: a JavaScript ecosystem for Symfony. The licence is MIT.
6 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 93cda70. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
gitghpnpmcomposerphpFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
github.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Symfony Security Review loads about 2.9k tokens when it runs. Until then it costs about 127 tokens; SKILL.md has 1,544 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from symfony/ux at commit 93cda70, republished under its MIT licence (© symfony). 1,544 words, ~2,916 tokens.
.claude/skills/symfony-security-review/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Finds hardening that is missing or wrong, grounded in code. It runs in two modes:
src/LiveComponent) or the whole src/ tree, for one or all families.Both modes run two passes: first reason about the change's trust boundaries from first principles (to catch novel issues), then check it against the hardening families catalogued in hardening-families.md. Each family comes from a real ux fix; the catalogue is a checklist of known classes, not the search space.
security-triage makes the disclosure call.Whenever this skill says "Wait for confirmation", treat anything other than an explicit affirmative as no: stop and ask the user how they want to proceed.
When auditing the whole src/ tree or a large package, fan Step 1 and Step 4 out to subagents: one per family, or one per package, each returning findings that point at a concrete file and line (no speculative findings leaking in through parallelism). Keep the rest in the main loop: aggregation, de-duplication, the completeness check, and the report are synthesis and must see every finding at once. For a single PR or a small diff, run every step inline; subagents are pure overhead there.
Review a change. Check the PR out locally so the whole package is readable, and diff against its real base:
# A public PR
git worktree add --detach .claude/worktrees/pr<n>
cd .claude/worktrees/pr<n> && gh pr checkout <n>
gh pr view <n> --json baseRefName --jq .baseRefName
git diff upstream/<base>...HEAD --stat
# The current branch against its base (2.x or 3.x)
git diff upstream/<base>...HEAD --statAudit a target. Take a package path or the whole src/ tree. There is no diff; the "changed files" are the target files.
In both modes, build the file list from src/<Package>/src/ (PHP), src/<Package>/assets/src/ (TypeScript), src/<Package>/config/ and src/<Package>/templates/. Drop tests/, assets/test/ and the built assets/dist/: hardening lives in the implementation, and dist/ is generated from assets/src/.
State the resolved mode and scope back to the user in one line before continuing.
This pass finds what the catalogue does not list. Do it before mapping to families, and do not let the anchors narrow it. For each file in scope, reason as an attacker, independent of any known family:
props, updated, propsFromParent, children, action arguments, _batch actions), the Autocomplete query and extra_options, AJAX responses a Stimulus controller renders, Iconify API responses and local SVG files, a third-party Toolkit kit (--kit=https://github.com/...: its manifest and files), values an app passes into component attributes, request headers.innerHTML, a Twig function declared is_safe, DQL/SQL, the filesystem, a sub-request, object construction from a client value, a comparison of a secret)?Record every input-to-sink path with a non-trivial worst case as a candidate finding, whether or not it matches a catalogued family. An unguarded path from untrusted input to a dangerous sink is a finding even if no anchor names it. This step uses no greps by design; it is meant to see sinks the dictionary misses.
Now apply the catalogue as a checklist, to confirm no known class slipped past Step 1. Treat each anchor's listed APIs as seed examples of an abstract role (a checksum over client data, a client value interpolated into HTML, a list that fans out into sub-requests, a path built from a manifest); extend to anything in scope that plays that role, including code the grep does not name.
For each file in scope, decide which families it touches using the anchors in hardening-families.md. Run the anchors against the scope, not the whole tree, when reviewing a change:
# Example: which families does this branch touch?
git diff upstream/<base>...HEAD --name-only | grep -vE '/tests/|/assets/test/|/assets/dist/' > /tmp/scope.txt
grep -lE 'hash_hmac|hash_equals|is_safe|innerHTML|new \$|LIKE|Path::|copy-files|_batch|X-Requested-With' $(cat /tmp/scope.txt) 2>/dev/nullCarry forward both Step 1's boundary findings and the families with a sink in scope; they proceed to Step 4. List them.
ux has no automated hardening gate for its PHP or TypeScript code, so every family goes through Step 4. Two checks exist around it:
.github/workflows/zizmor.yaml) and covers GitHub Actions workflows (family W1).src/Turbo (phpstan.dist.neon), with no security-specific rule.For each in-scope family, apply its invariant from hardening-families.md. The catalogue gives, per family: the anchor, the invariant, the fix it comes from, and the decision boundary.
Work the sinks, not the families in the abstract: for every sink site the anchor found, answer the family's check question. If the answer is "no guard / wrong guard", it is a candidate finding; confirm it is not excluded by the decision boundary before reporting.
Output a table, highest severity first:
| Location | Family | Severity | Invariant at risk | Suggested hardening | Regression test |
|---|---|---|---|---|---|
src/LiveComponent/src/Util/ChildComponentPartialRenderer.php:NN | L5 live-markup | Medium | client tag interpolated into HTML | validate against VALID_TAG | malicious-tag case in InterceptChildComponentRenderSubscriberTest |
Severity rubric:
When a finding moves on to security-triage, the level becomes the proposed GHSA severity (Critical and High both propose high).
For each real finding, state whether a regression test is required at the boundary, in the shape ux already uses: a malicious input that must be rejected (the tests/Fixtures/kits/malicious kit for the Toolkit installer, the malicious child tags in InterceptChildComponentRenderSubscriberTest).
Completeness check (before you finalise). State explicitly: is there an untrusted input, a sink, a checksum, an HTML output, or a trust boundary in scope that matched no anchor and was not already raised in Step 1? If so, reason about it from scratch before reporting. A clean family sweep is not a clean review.
The table holds findings from both passes: the Step 1 boundary pass (Family column = the vulnerability class, or novel) and the Step 4 family review.
Separate confirmed findings from needs-human-judgement ones. Do not inflate.
security-triage first and stays private: no public issue, PR, commit, or pushed branch before the coordinated release (origin is a public fork too). Wait for confirmation.cd src/<Package> && composer update && php vendor/bin/phpunit. For a TypeScript fix, also pnpm run test:unit and pnpm run build in src/<Package>/assets, and commit dist/.Co-Authored-By, no Claude/Anthropic credit. Comments sparingly, and do not reference issue numbers in code or tests.git push; print the command for the user.writable: true LiveProp is client-controlled by design; options_as_html: true renders raw HTML on purpose; an autocompleter with the default security: false is public by documentation; the Icons sanitizer keeps <style> on purpose. The catalogue lists these; respect them or you will cry wolf.VALID_TAG regex are curated sets; a review only confirms them, it cannot prove the next missing entry. Flag gaps for a data-provider test.MAX_ACTIONS_PER_BATCH exists in BatchActionController and in assets/src/Component/index.ts; changing one side alone either breaks the client or reopens the cap.! because \ produced invalid SQL on PostgreSQL (#3685). A fix that escapes correctly on one database and breaks another is not done.© symfony, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file in .agents/skills/symfony-security-review of symfony/ux.
Open the folder on GitHubat commit 93cda70
Symfony Security Review next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Symfony Security Review this skillsymfony/ux | 1.1k | — | ~2.9k | Automated safety check: Pass | MIT | |
| Symfony Security Reviewsymfony/symfony | 31k | — | ~2.9k | Automated safety check: Pass | MIT | |
| Deepsec Documentation Guidevercel-labs/deepsec | 8.1k | — | ~956 | Automated safety check: Pass | Apache-2.0 | |
| Kubernetes Network Security Auditkubeshark/kubeshark | 12k | — | ~7.3k | Automated safety check: Notes | Apache-2.0 | |
| Native Dependency Updatemono/SkiaSharp | 5.6k | — | ~4.1k | Automated safety check: Pass | MIT | |
| Semgrep Security Scantrailofbits/skills | 7.5k | — | ~3.7k | Automated safety check: Notes | CC-BY-SA-4.0 |
symfony/symfony
Review a change (a PR, the current branch diff, or a set of files) or audit a component or the whole tree for missing or incorrect security hardening.
vercel-labs/deepsec
Points the agent at deepsec's own docs to answer questions about initializing, configuring, resuming, scanning with and extending the vulnerability scanner.
kubeshark/kubeshark
Hunts for compromised workloads and malicious traffic in a Kubernetes cluster by sweeping network data through Kubeshark MCP, mapped to MITRE ATT&CK.
mono/SkiaSharp
Update native dependencies (libpng, libexpat, zlib, libwebp, harfbuzz, freetype, libjpeg-turbo, etc.) in SkiaSharp's Skia fork.
trailofbits/skills
Detects languages, proposes rulesets for approval, then runs the approved Semgrep scan across a codebase and merges the output into one SARIF file.
Fangcun-AI/SkillWard
Security-audit a third-party skill bundle (folder with SKILL.md, or .zip / .tar.gz archive) before installing it, using the SkillWard cloud scanner.
symfony/ux
Cascade-merge the maintained Symfony UX branches from oldest to newest (2.x - 3.x), resolve conflicts, run the affected packages' tests and prepare the push.
symfony/ux
Principles for rigorously reviewing a Symfony UX pull request and making it merge-ready.
symfony/ux
Triage a security finding in a Symfony UX package into a disposition: a private CVE (coordinated disclosure through the Symfony security process), a public hardening PR (fix in the open, no CVE), or…
symfony/ux
Generate, modify, or review Symfony UX Toolkit kit recipes (shadcn, flowbite-4, bootstrap, common).
Works with
Categories
Review a change (a PR, the current branch diff, or a set of files) or audit a Symfony UX package or the whole src/ tree for missing or incorrect security hardening. Symfony Security Review is an agent skill from symfony/ux. Review a change (a PR, the current branch diff, or a set of files) or audit a Symfony UX package or the whole src/ tree for missing or incorrect security hardening.
Symfony Security Review fits situations like: asked for a security review; A security audit of ux code; whether a change weakens a security control; hunt a vulnerability class across the packages.
Run `npx skills add symfony/ux --skill symfony-security-review -a claude-code`. Or copy the skill folder (.agents/skills/symfony-security-review in symfony/ux) into .claude/skills/symfony-security-review in your project. Claude Code loads it when a task matches its description.
Run `npx skills add symfony/ux --skill symfony-security-review -a codex`. Or copy the skill folder (.agents/skills/symfony-security-review in symfony/ux) into .agents/skills/symfony-security-review in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add symfony/ux --skill symfony-security-review -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/symfony-security-review, .gemini/skills/symfony-security-review, .github/skills/symfony-security-review and .opencode/skills/symfony-security-review in your project.
Going by SKILL.md and its folder, Symfony Security Review needs the command-line tools its instructions call (git, gh, pnpm, composer and php).
SKILL.md names 1 domain. In commands or code: github.com; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Symfony Security Review is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.9k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Symfony Security Review: Symfony Security Review (symfony/symfony, 31k stars), Deepsec Documentation Guide (vercel-labs/deepsec, 8.1k stars), Kubernetes Network Security Audit (kubeshark/kubeshark, 12k stars) and Native Dependency Update (mono/SkiaSharp, 5.6k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
symfony (a GitHub organization) maintains it in symfony/ux, which has 1,080 GitHub stars. The repository holds 5 skills in this directory. The repository was last updated on October 11, 2026.
Source: symfony/ux on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.