Six permission bypasses in Mistral Vibe

Six vulnerabilities published on the same day against Mistral’s coding agent, all in the same authorisation layer. The command the agent inspects before deciding is not the command the shell runs.

TLP:CLEAR   PAP:CLEAR   Unlimited disclosure, no restriction on use.
Published
11 September 2026
Subject
Mistral Vibe, six CVEs
Marking
TLP:CLEAR, PAP:CLEAR
Confidence
High
Sources
9

The facts

On 11 September 2026, HiddenLayer published, acting as a CNA (1), six CVEs (2) affecting Mistral Vibe, Mistral’s command-line coding agent. Four are scored 10.0 under CVSS (3) 4.0, one 9.3 and one 9.2. All six are credited to the same researcher, Esteban Tonglet, and target the same component: the module that decides whether a shell command may run without asking the user.

Mistral Vibe is distributed under the Apache 2.0 licence and installed from PyPI, through the vendor’s install script, uv or pip. It runs on the developer’s workstation with that account’s privileges, and it exposes a shell execution tool whose invocations are partly approved automatically.

The takeaway

None of these six vulnerabilities involves the language model. They are flaws in ordinary code within the authorisation layer wrapped around the model: string parsing, hand-maintained lists, path normalisation.

One flaw, six routes

The shared mechanism fits in one sentence. Vibe rebuilds a representation of the command from the syntax tree produced by tree-sitter-bash, then makes its authorisation decision from that representation. The shell, meanwhile, runs the original string. Every time the representation drops an element the shell keeps, the decision applies to something other than what is about to execute.

Five of the six flaws work that way. The sixth comes from a gap between two internal lists. The CWE (4) categories differ, the effect is the same: a command runs without the user being asked.

CVEEffectElement lost or uncheckedCVSS 4.0CWEIntroduced in
CVE-2026-87983Arbitrary readQuotation marks kept in the path, which stops being seen as absolute9.2CWE-222.6.0
CVE-2026-87984Arbitrary writeShell redirection target not extracted9.3CWE-221.3.4
CVE-2026-87985Code executionANSI-C quoted argument not collected, the -exec predicate of find disappears10.0CWE-1842.9.0
CVE-2026-87986Code executionSyntax the parser cannot read, placed under an error node10.0CWE-2281.3.4
CVE-2026-87987Code executionEnvironment variable assignments stripped before the check10.0CWE-152.6.0
CVE-2026-87988Arbitrary read and writeThirty-one auto-approved commands absent from the list subject to path validation10.0CWE-7322.15.0

Two illustrations

For CVE-2026-87983, the command cat "/etc/bashrc" is enough. The boundary check receives the token with its quotation marks. Since the first character is not a slash, the path is not treated as absolute, it is resolved relative to the current directory and appears to stay inside the workspace. Bash then strips the quotes and cat reads the real file. The same command without quotes does trigger the approval prompt.

For CVE-2026-87987, the attacker places environment variable assignments in front of an allowlisted command: GIT_CONFIG_COUNT=1 GIT_CONFIG_KEY_0=diff.external GIT_CONFIG_VALUE_0='...' git diff. The assignments are removed from the representation used for the decision, leaving only git diff, which is on the allowlist, the set of commands approved without prompting. Bash then launches Git with the full environment, Git loads the external diff program and runs it.

Point of caution

Classifying a command as read only does not even guarantee that it cannot write. In the list covered by CVE-2026-87988, sort through its output option, uniq through its second positional argument and less through its save option are all able to produce a file. The category describes the intended use, not what the binary can actually do.

That is the point that outlives this one product. An allowlist does not describe what a program can do, it describes what its author believes it does. As soon as two lists coexist, one to authorise and one to check, the gap between them becomes the attack surface.

Eight months of accumulation

The introduction versions stated by the CNA do not point to a one-off regression. Set against the release dates of those versions on PyPI, they span eight months of development.

  • Version 1.3.4, released on 8 January 2026: CVE-2026-87984 and CVE-2026-87986
  • Version 2.6.0, released on 23 March 2026: CVE-2026-87983 and CVE-2026-87987
  • Version 2.9.0, released on 28 April 2026: CVE-2026-87985
  • Version 2.15.0, released on 12 June 2026: CVE-2026-87988

Two of these flaws were therefore exploitable for eight months. The latest release on PyPI at the time of writing is 2.25.1, dated 9 September 2026, two days before the advisories. No fixed version has been announced, neither by the vendor nor in the advisories themselves.

The product checks PyPI once a day for a newer version and offers the update at the next launch. That mechanism will speed up deployment of the fix once it ships, but it does not replace an inventory: it does not tell the operator how many workstations carry the tool.

Source qualification

The advisories come from the CNA itself and link to specific lines in the vendor’s public repository. The level of evidence is high, with one reservation about the scoring.

ItemStatusComment
Mechanisms and affected codecorroboratedSix HiddenLayer advisories, with links into the public source code
Scores and CWE categoriescorroboratedValues agree between the vendor advisories and the CVEFeed records
Introduction versionssingle sourceStated by the CNA, not cross-checked. Their release dates are verified on PyPI
No fixed version availablecorroboratedNo PyPI release after 9 September 2026, no fix mentioned in the advisories
Network vector used in the scoresingle sourceSee the reservation below
Exploitation observeddiscardedNo reports at the time of writing
Coverage by secondary aggregatorsdiscardedCVE identifiers inconsistent with the original advisories
Reservation on the score

All six vectors use AV:N, meaning network exploitation, for a tool that runs on the developer’s own workstation. That reading holds if the attacker is understood to be the content ingested by the agent: a cloned repository, a page it browses, a ticket it reads. Two of the six advisories explicitly name indirect prompt injection as the route, which makes the reading coherent. A 10.0 reached that way is still not comparable to a 10.0 on an exposed service.

Assessment

Ease of exploitation
Ordinary shell syntax is enough in every case. No particular technique required.
High
Impact on the workstation
Read, write and execute with the privileges of the account running the agent.
High
Actual exposure
Depends on the estate. Recent tool, installed at the developer’s initiative, limited enterprise footprint.
Moderate
Likelihood of mass exploitation
Individual target, no exposed service, no exploit code published.
Low
Method note

This analysis is built on the six CNA advisories, the matching CVEFeed records, the product documentation and the release history published on PyPI. The source code was not reviewed line by line and no reproduction was attempted. The exposure and likelihood ratings are judgement, not measurement.

What to do

If Mistral Vibe is present on the estate

  • Inventory the installations. The agent is installed at the developer’s initiative and does not appear in the usual software inventory. The binary is called vibe and its configuration lives in ~/.vibe.
  • Rule out the profiles that approve automatically. All six bypasses target the auto-approval decision. The ask profile, which prompts for every tool execution, removes the point of that logic. The --auto-approve and --yolo options disable it entirely and should be banned.
  • Interpose an external check. The product’s hook mechanism allows a pre_tool hook that receives the tool arguments before the approval prompt and can deny execution. That check sees the complete command, unlike the internal layer.
  • Isolate through the system. A container, a dedicated user or a virtual machine, with no access to the user’s home directory or SSH (5) keys.
  • Remove from the workstation any cleartext secrets the process can reach: credential files, API (6) tokens, unencrypted private keys.
  • Track the release of a fixed version and apply it as soon as it ships.

What this case says about coding agents

The arrangement is the same at every vendor. A model proposes commands, an authorisation layer decides which ones run without prompting. That layer is ordinary code, built from string parsers and hand-maintained lists. Six bypasses published on the same day against a single product give the measure of how solid it is.

The practical consequence is simple. The trust boundary of a coding agent is not the list of its allowlisted commands, it is everything its process can reach. Isolation has to come from the system, through a container, a dedicated user or a restricted mount, not from the tool’s own internal logic.

That leaves the question of the route in. In two of the six advisories, the attacker is not the user but the content the agent reads: a cloned repository, a ticket, a web page. The authorisation layer is the only place where that untrusted input is arbitrated before it becomes a command. It is precisely the place where six flaws have just been published.

Glossary

  1. CNA (1): CVE Numbering Authority, an organisation authorised to assign CVE identifiers within its scope.
  2. CVE (2): Common Vulnerabilities and Exposures, the unique public identifier of a vulnerability.
  3. CVSS (3): Common Vulnerability Scoring System, the standard framework for rating the severity of a vulnerability.
  4. CWE (4): Common Weakness Enumeration, the classification of software weakness types.
  5. SSH (5): Secure Shell, an encrypted remote access protocol whose private keys live on the workstation.
  6. API (6): Application Programming Interface, the programmatic access point to a service, whose authentication tokens often live on the workstation.

Sources

  1. HiddenLayer, SAI security advisory for CVE-2026-87983, 11 September 2026. hiddenlayer.com
  2. HiddenLayer, SAI security advisory for CVE-2026-87984, 11 September 2026. hiddenlayer.com
  3. HiddenLayer, SAI security advisory for CVE-2026-87985, 11 September 2026. hiddenlayer.com
  4. HiddenLayer, SAI security advisory for CVE-2026-87986, 11 September 2026. hiddenlayer.com
  5. HiddenLayer, SAI security advisory for CVE-2026-87987, 11 September 2026. hiddenlayer.com
  6. HiddenLayer, SAI security advisory for CVE-2026-87988, 11 September 2026. hiddenlayer.com
  7. CVEFeed, records for CVE-2026-87983 through CVE-2026-87988, accessed 11 September 2026. cvefeed.io
  8. PyPI, mistral-vibe project, release history, accessed 11 September 2026. pypi.org
  9. Mistral AI, Mistral Vibe documentation, agent profiles, hooks and update settings, accessed 11 September 2026. github.com

Marked TLP:CLEAR, PAP:CLEAR. Unlimited disclosure, no restriction on use.

The analysis presented here reflects the author’s own views and rests on the public sources listed above.