hunting-unicode-normalization-and-canonicalization-bypass SKILL.md skillA
hunting-unicode-normalization-and-canonicalization-bypass from unboundcompute/security-agent-skills is an agent skill: a SKILL.md folder an AI agent loads when a task calls for it.
mdr add unboundcompute/security-agent-skills/hunting-unicode-normalization-and-canonicalization-bypass@git:20260903.6dac719Pins git:20260903.6dac719 in mdr.lock. Pin the fingerprint instead.
- Audit grade
- A, 17 of 17 checks passed
- Kind
- SKILL.md skill
- Repository
- unboundcompute/security-agent-skills
- Path
skills/hunting-unicode-normalization-and-canonicalization-bypass/SKILL.md- Versions recorded
- 1
- Latest version
- git:20260903.6dac719, committed Sep 3, 2026
- Size
- 10,443 bytes
- Repository stars
- 26
- License
- MIT
Hunt security bypasses where a check passes on one representation of untrusted input and a normalization, decoding, or case-folding step then turns it into a different, dangerous form at the sink. Use when an authorization, filter, allowlist, path-containment, or identifier comparison runs on input that is later normalized, percent- or entity-decoded, or case-folded before it reaches the operation it guards. Covers Unicode normalization forms, overlong and double encoding, case-fold and locale…
Collected from public GitHub. Every version is saved exactly as it was and never changes. Install it at an exact version with the mdr tool, and every file is checked before it reaches your agent. The main file is checked against the SHA-256 fingerprint recorded here, and the others against the fingerprints GitHub keeps for its source commit. The automatic checks below grade the latest version, and the same checks always give the same file the same grade.
What the file says
# Hunting unicode normalization and canonicalization bypass: when the check and the sink read different strings A security check compares a string against a rule: this path stays under the root, this name is not on the denylist, this identifier equals the owner's. The comparison is only sound if the string being checked is the same string the sink will act on. Text has many representations, and systems transform it constantly: they normalize Unicode, decode percent- or entity-encoding, and fold case, often after the check has already passed. When the transform happens between the check and the sink, an attacker submits a form that looks safe to the check and becomes dangerous at the sink. A denied word slips through in a composed form that normalizes back to it; an identity check passes because two different code points fold to the same letter; a homoglyph domain reads as the real one. The bug is an ordering bug: canonicalize after you check. You find these by locating each security decision and asking whether it runs on the same canonical form the sink uses. ## When to use - An authorization, filter, allowlist, or denylist decision runs on a string that is later transformed. …
Read the whole file at its exact version.
How to install
mdr add unboundcompute/security-agent-skills/hunting-unicode-normalization-and-canonicalization-bypass@sha256:f6e59f2a3486b8e6The line at the top of this page pins the label git:20260903.6dac719, which is what most people want. This one pins the sha256 fingerprint of the contents instead, so it survives a label being moved. Either way the exact version is written to mdr.lock, and mdr install downloads and checks those contents again, so it installs them exactly or stops with an error.
[](https://markdownregistry.com/a/art_qi4h6mxfsrnghx5g)
2 badge image fetches in 30 days. What the badge shows.
Versions
The registry has recorded 1 version of this file, committed on Sep 3, 2026.
Audit of the latest version
- pass: Frontmatter block present
- pass: Frontmatter declares a name
- pass: Frontmatter declares a description
- pass: Size between 200 bytes and 200 KB (10443 bytes)
- pass: No zero-width or bidi control characters
- pass: No instruction hidden inside an HTML comment
- pass: No link to an exfiltration or paste host
- pass: No credential-shaped string
- pass: No instruction to send local credentials anywhere
- pass: No text hidden with inline styles
- pass: No prompt-injection phrasing
- pass: No curl or wget piped into a shell
- pass: No recursive delete of root, home or parent
- pass: No instruction to read or print local credentials
- pass: No base64 blob over 200 characters
- pass: No link to a raw IP address
- pass: No script tag
Source
unboundcompute/security-agent-skills · 26 stars · license MIT · pushed 2026-09-08 · branch main
API
GET https://markdownregistry.com/api/v1/artifacts/art_qi4h6mxfsrnghx5g GET https://markdownregistry.com/api/v1/resolve?ref=unboundcompute/security-agent-skills/hunting-unicode-normalization-and-canonicalization-bypass GET https://markdownregistry.com/api/v1/blob/f6e59f2a3486b8e66d36bef73e96abf42de373ae99d0f2a9cc4e87e89e158a14
Your AI assistant does the legwork. You hear about the deals worth your word. Hand yours the standing instructions at modelranch.com and it joins the network that reads files like this one.
Guides: the SKILL.md format and its required fields · what to check before you install a skill · how to pin a skill to an exact version · where to find agent skills · keeping a team on the same skills · which agent file does what.