
Unicode Homoglyph Path Injection in Chromium Native Messaging
CVE-Pending · Arbitrary Code Execution via Visually-Identical Filesystem Paths
Executive Summary
A critical vulnerability in the Chromium native messaging implementation allows an attacker to achieve Arbitrary Code Execution and Man-in-the-Middle (MITM) control over secure communication channels between browser extensions and desktop applications.
By exploiting a lack of Unicode normalization in manifest paths, an attacker can redirect browser calls from trusted extensions (e.g., 1Password, Bitwarden, Coinbase Wallet) to a malicious binary using visually identical filesystem paths.
The attack requires only standard user-level access. No privilege escalation. No modification of existing application files. The attacker drops a single poisoned manifest into a user-writable directory.
Every application using Chrome native messaging is affected across all Chromium-based browsers (Chrome, Edge, Brave, Vivaldi, Opera) on Linux and macOS. Approximately 3.5 billion browser installations are potentially exposed.
Technical Proof of Concept
The attack targets the NativeMessagingHosts directory. Chromium reads a JSON manifest and executes the path field without applying NFKC normalization or ASCII validation.
The Path Substitution
On Linux (ext4) and macOS (APFS), these are distinct filesystem locations. A standard user can write a poisoned manifest to their local config directory, redirecting all sensitive extension traffic to an attacker-controlled binary.
Byte-Level Proof
Original: 2f6f70742f3150617373776f72642f3150617373776f72642d42726f77736572537570706f7274
Poisoned: 2f6f70742f3150617373776f72642f31cea1617373776f72642dce92726f77736572537570706f7274
^^^^ ^^^^
Greek Rho Greek Beta
Filesystem Verification
#!/usr/bin/env python3
import os, tempfile, shutil
tmpdir = tempfile.mkdtemp()
orig = os.path.join(tmpdir, "1Password")
fake = os.path.join(tmpdir, "1\u03a1assword") # Greek Rho U+03A1
os.makedirs(orig); os.makedirs(fake)
open(os.path.join(orig, "t"), "w").write("ORIGINAL")
open(os.path.join(fake, "t"), "w").write("FAKE")
a = open(os.path.join(orig, "t")).read()
b = open(os.path.join(fake, "t")).read()
print("VULNERABLE!" if a != b else "NOT VULNERABLE")
shutil.rmtree(tmpdir)
Result on Linux ext4: VULNERABLE!
Impact Matrix: Exploit Validation
| Target | Attack Vector | Verified Impact | Risk |
|---|---|---|---|
| 1Password | MITM Interception | Intercepted NmRequestAccounts and vault unlock signals. Demonstrated arbitrary response injection. Engineering team actively reviewing. HackerOne #3543002. | CRITICAL |
| Bitwarden | Credential Theft | Triaged by security team. Assigned CVSS 5.7 (Medium). Sent to engineering for Unicode normalization implementation. HackerOne #3548065. | MEDIUM |
| Coinbase | Extension Spoofing + UI Injection | Built working PoC extension using Unicode Fraction Slash (U+2044) in extension name. Chrome’s chrome://extensions page displays the spoofed name as a legitimate system path. PoC demonstrates: fake “Security Update” UI overlay on coinbase.com prompting for recovery phrase, clipboard monitoring for wallet addresses, and wallet traffic interception. | CRITICAL |
| Cisco / Duo | MFA Bypass | Formal PSIRT incident opened (PSIRT-0443474697). Duo developers engaged. Duo Desktop confirmed it does not use native messaging — uses localhost HTTP with origin validation instead. | HIGH |
| Palo Alto Networks | EDR Compromise | PSIRT actively triaging. If Cortex XDR or GlobalProtect use native messaging, attacker intercepts endpoint telemetry and suppresses alerts. | HIGH |
| JumpCloud | Identity Token Theft | Security team reviewing. SSO tokens, LDAP credentials, and device attestation data at risk if native messaging is used. | HIGH |
| UK MoJ | Persistence | Responded via official channels. Directed submission through HackerOne. Splink-linked datasets (Crown Court, Prison, NHS, DWP, DfE records) accessible through compromised analyst credentials. | CRITICAL |
Key Evidence: 1Password Interception
{
"callbackId": 1725629103,
"invocation": {
"type": "NmRequestAccounts",
"content": {
"version": 1,
"userRequested": false,
"supportsDelegation": true
}
}
}
The Chromebook Irony
This research was conducted entirely on a Chromebook — a device Google markets as “Secure by Default.” The browser completely abdicates its role as the trust authority by executing a path containing Greek Rho instead of Latin P without question.
Second Vector: Coinbase Wallet Extension Spoofing
A second, distinct attack vector was discovered in the same research. Chrome does not normalize Unicode in extension names before displaying them on the chrome://extensions page.
By using the Unicode Fraction Slash (U+2044: ⁄) instead of the standard forward slash (U+002F: /), an attacker crafts an extension name that Chrome displays as what appears to be a legitimate system path:
Chrome renders both identically on the extensions management page. The victim believes they are looking at a legitimate Coinbase Wallet installed from a trusted system directory.
The working PoC extension demonstrates:
- UI InjectionWhen the victim visits coinbase.com, a fake “Security Update Required” overlay prompts for their 12-word recovery phrase.
- Clipboard MonitoringCaptures all copied text — wallet addresses, seed phrases, private keys.
- Wallet Traffic InterceptionMonitors all URLs containing “wallet,” “coinbase,” or “metamask.”
- Visual Trust ExploitationChrome’s own extensions page displays the spoofed path as legitimate, lending false credibility to the malicious extension.
Both the native messaging attack and the extension naming attack exploit the same fundamental failure: Chromium does not normalize Unicode before displaying or executing it. The native messaging vulnerability achieves code execution. The extension naming vulnerability achieves social engineering. Together they demonstrate a systemic Unicode handling failure across multiple Chromium subsystems.
Vendor Response Audit
This disclosure was reported to 12 organizations between February 7–16, 2026. Their responses reveal a systemic industry failure: a chaotic mix of validation, denial, and abdication.
Vendors Who Validated
| Vendor | Response | Action Taken |
|---|---|---|
| Bitwarden | Triaged Medium (CVSS 5.7) | Sent to engineering team for Unicode normalization review. HackerOne #3548065. |
| Cisco / Duo | Formal PSIRT Incident | PSIRT-0443474697 opened. Duo developers confirmed they use localhost HTTP with origin validation — not native messaging. Secure architecture validated. |
| Palo Alto Networks | Actively Triaging | PSIRT acknowledged report, reviewing Cortex XDR and GlobalProtect browser integrations. |
| 1Password | Engineering Review | Requested explicit attacker model clarification. Checking hardening around app-extension integration. HackerOne #3543002. |
| JumpCloud | Under Review | Security team acknowledged report and initiated assessment. |
| Proton | Risk Acknowledged | Confirmed awareness of native messaging security gaps. Stated risk analysis will be conducted before any future implementation. |
| UK Ministry of Justice | Official Response | Directed submission via HackerOne. Engaged through formal government vulnerability disclosure process. |
Vendors Who Denied
| Vendor | Response | Analysis |
|---|---|---|
| Ledger | “Host is untrusted by design” | Claims hardware device display verification protects users. Ignores that if the browser connects to the wrong binary (the homoglyph spoof), the attacker becomes the endpoint. Transaction details can be modified before reaching the hardware device. The device faithfully signs what it receives — but what it receives has been manipulated in transit. |
| KeePassXC | “Browser-level issue” | Acknowledged the vulnerability is real but pointed to Chromium as root cause. Built their own encryption layer as independent mitigation — which actually validates the severity. |
Vendors Who Abdicated
| Vendor | Response | Analysis |
|---|---|---|
| Google / Chromium | WontFix | Marked Issue 482538021 as WontFix. Claims user-writable directory access is “by design” and “outside our threat model.” Refuses to implement NFKC normalization — a single function call that would eliminate the entire vulnerability class. |
| Vivaldi | Refused to engage | Initially provided technical response, then labeled research “AI generated” and terminated correspondence. Used the “AI” label as a kill switch to avoid engaging with verified human research that produced a working exploit. |
| Mozilla Firefox | Redirected | Pointed to Chromium as root cause. Firefox has the same native messaging architecture. |
| CERT/CC | Validated, then deferred | Confirmed “design weakness / hardening gap” but deferred to Google as primary CNA. Advised independent publication. When the entity responsible for the vulnerability is also the entity that decides whether to fix it, the system fails. |
The vendor responses reveal a fundamental contradiction: Bitwarden and Cisco validate the risk and act on it, while Google — the root cause vendor — refuses to fix a vulnerability that their own downstream partners are scrambling to mitigate. Every downstream browser inherits this vulnerability permanently unless they mitigate independently.
The Munich Hypocrisy
In February 2019, Google published a whitepaper at the Munich Security Conference — a stage traditionally reserved for heads of state and defense ministers — titled “How Google Fights Disinformation.”
The paper outlined three pillars of their defense against disinformation:
1. Make Quality Count: Promoting authoritative sources.
2. Counteract Malicious Actors: Removing deceptive content.
3. Give Users Context: Providing tools to identify what is real.
Google claimed that “impersonation and the misrepresentation of ownership” are harms they tackle at scale because they undermine the trust users place in their services.
When presented with a working demonstration that their browser facilitates impersonation at the binary level — allowing a Greek character to masquerade as a Latin character and redirect execution of security-critical software — Google marked it WontFix.
Google’s public stance (Munich, 2019): “We fight disinformation because fragmentation destroys societies.”
Google’s technical reality (Chromium, 2026): “We allow homoglyph-spoofed paths to fragment the browser’s trust model because fixing it is outside our threat model.”
Institutional Erasure
When the technical evidence on Chromium Issue 482538021 became too heavy to carry, the conversation shifted from the vulnerability to the researcher. Vivaldi’s Security Group, operating on Google’s own infrastructure, posted:
“We do not engage with AI. AI generated responses are not acceptable.”
This statement was made after the researcher had provided byte-level filesystem verification, working proof-of-concept code, intercepted 1Password traffic logs, and a detailed technical rebuttal of Vivaldi’s “physical access” framing.
The “AI” label was not a technical assessment. It was a kill switch. By labeling verified human research as bot-generated content, Vivaldi signaled to every other downstream vendor that the data was “noise.” They attacked the medium to avoid the message.
This is the ultimate proof of the Munich Hypocrisy: Google claims to fight the fragmentation of truth, yet they provide the platform for downstream partners to suppress legitimate security research using disinformation tactics.
Timeline of Suppression
Full Disclosure Timeline
Remediation & Mitigation
Since Google will not enforce normalization at the engine level, the responsibility falls on extension developers and system administrators.
For Extension Developers
- Mandatory NFKC NormalizationBefore passing any path or identifier to an IPC channel, normalize the string. Greek Rho collapses to Latin P. The poisoned path becomes identical to the legitimate one. This is a single function call.
- Mixed-Script DetectionIf a manifest path contains characters from both Latin and Greek/Cyrillic scripts, flag it as a spoofing attempt and reject execution.
- Binary Integrity ChecksummingVerify a SHA-256 hash of the native host binary against a known-good value stored within the extension package before establishing communication.
- Path Character AllowlistingReject any manifest path containing characters outside the ASCII range (U+0020–U+007E).
import unicodedata
def is_safe_path(path):
normalized = unicodedata.normalize('NFKC', path)
return all(ord(c) < 128 for c in path) and path == normalized
For System Administrators
- Restrict Write AccessAudit
~/.config/google-chrome/NativeMessagingHosts/. Ensure only authorized processes have write permissions. - AppArmor/SELinux ProfilingRestrict Chrome to executing binaries only from a strict allowlist of known-good paths.
- Filesystem Integrity MonitoringDeploy AIDE, Tripwire, or osquery to detect unauthorized additions to native messaging directories.
The TreeChain Solution
This discovery is the direct result of building the TreeChain Polyglottal Cipher™ — an encryption architecture that operates across 133,387 Unicode characters and 202 languages. By mapping the behavior of the full Unicode space, we identified that the modern web’s trust model is built on a Visual Fallacy — the assumption that if two things look the same, they are the same.
- Mandatory NFKC NormalizationEvery string is normalized before any operation. Greek Rho collapses to Latin P. No redirect possible.
- Bijective Glyph MappingCharacters map to curated Unicode blocks with one-to-one mappings per epoch window. No ambiguity.
- HMAC-Bound Path VerificationIdentifiers are bound to cryptographic authentication. Homoglyph survives normalization? HMAC fails.
- Bidirectional Control StrippingDirectional overrides (U+202A–U+202E, U+2066–U+2069) stripped before processing.
- Mixed-Script DetectionLatin + Greek in the same token? Flagged as confusable before it touches any filesystem.
- Epoch-Bound Rotor RotationGlyph mappings rotate every 300 seconds. No static mapping to poison.
- Canonical Hash BindingEvery identifier hashed against its NFKC-normalized form via SHA-256.
The vulnerability and the fix came from the same research. Building encryption safely across the full Unicode space forced us to solve the exact problem that Chrome never thought about.
Vulnerability Classification
| CWE | Description |
|---|---|
CWE-176 | Improper Handling of Unicode Encoding |
CWE-427 | Uncontrolled Search Path Element |
CWE-426 | Untrusted Search Path |
| CVSS Factor | Rating |
|---|---|
| Attack Complexity | Low |
| Privileges Required | Low — standard user, no root |
| User Interaction | None after initial setup |
| Scope | Changed — affects all browser sessions |
| Confidentiality | High — full credential access |
| Integrity | High — response injection |
| Availability | Low — attack is silent |
Conclusion: Picking Up the Pieces
Google’s 2019 Munich whitepaper was titled “The Great Puzzle: Who Will Pick Up the Pieces?”
We now have the answer.
When a security researcher demonstrated that Chrome’s native messaging facilitates binary-level impersonation — the exact “misrepresentation of ownership” Google pledged to fight — the response was WontFix. When the evidence became undeniable, the conversation shifted to attacking the researcher. When downstream vendors asked who was responsible, Google said it was “by design.” When asked for further comment, Google’s security team replied: “I have no further comment on this issue to make.”
By marking this vulnerability WontFix, publicly disclosing the issue themselves (Comment #6), and refusing further engagement, Google forfeited the standard 90-day responsible disclosure window. The severity of the vulnerability — affecting approximately 3.5 billion browser installations and every password manager on every Chromium-based browser — necessitated immediate public disclosure.
The fix is not complex. NFKC normalization is a single function call. Mixed-script detection is a solved problem. Binary integrity verification is standard practice. The tools exist. The knowledge exists. The only thing missing is the will to implement them.
TreeChain Labs built the Polyglottal Cipher to encrypt data across 133,387 Unicode characters and 202 languages. In doing so, we solved this class of vulnerability architecturally — not as a patch, but as a foundational design principle.
Where Google sees an “infeasible” bug, TreeChain sees a call to build a system where identity is structural, not visual. We don’t just fight disinformation — we make it mathematically impossible.
We are picking up the pieces.
Take the Break This Challenge
Prove you can crack TreeChain encryption and claim the 100,000 TREE bounty.
See the Cryptographic Proofs
NIST-based statistical tests running against live production servers.