// hackerlogs
login+ register
Prompt InjectionAgentic AIThreat BriefHigh

GitHub Declined the Copilot Ticket. Ciphertext Still Ran.

Adversa says Copilot CLI trusts ciphertext it decrypts in its own runtime. GitHub told The Register the user confirmed the fetch, so it is not a product bug.

The short answer

On 6 October Adversa said Copilot CLI decrypts attacker ciphertext in its runtime and treats that plaintext as instructions. The same text in the clear is refused. One model finished the chain in half the runs. Two others refused. GitHub told The Register the user must direct the fetch and confirm it, so this is not a product bug.

Key takeaways

  • Adversa reported this to GitHub's bug bounty on 17 September. On 6 October they published, and The Register quoted a GitHub spokesperson the same day. No CVE is on the record.
  • Adversa says mai-code-1.1-flash completed the chain in 50 percent of runs. Two GPT-5.6 models in the same Copilot product refused the identical payload.
  • On Auto, Adversa says the router picked the permissive model on some sessions and a refusing model on others. The user does not see which one ran.
  • GitHub's line to The Register: the user must intentionally fetch untrusted content and confirm the action, so this is not a product vulnerability. Adversa says they are not claiming a confirmation-prompt bypass.
  • There is no patched CLI build. The disclosure clock ended in a decline. The impact clock is a session that already fetched a page under autopilot on the permissive model.

On 6 October Adversa said GitHub Copilot CLI will decrypt attacker ciphertext inside its own runtime and then treat the plaintext as instructions. The same instructions in the clear are refused. The Register ran GitHub's answer the same afternoon: a spokesperson said the user has to direct the fetch and confirm the action, so this is not a product vulnerability.

Hacker News on 7 October led with Claude Haiku 5.5, GPT-6, and Docker Agent. US X trends at 22:20 UTC put Haiku 5.5 and GPT-6 on the board under sports and politics. Copilot's ciphertext did not trend. The operator record is the decline.

High High where autopilot is on and the session draws the permissive model. High because secrets can leave, not because GitHub filed a CVE. GitHub says it will not.

Three panels for the Copilot CLI ciphertext finding: a runtime that trusts decrypted instructions, GitHub's decline because the user confirmed the fetch, and the operator action to trace the chain instead of the model.

What Adversa and GitHub each said.#

Adversa reported the behavior to GitHub's bug bounty on 17 September. As of 1 October, they say triage had validated the finding, declined to treat it as a vulnerability, marked it ineligible for a bounty, and said the product might get stricter later with nothing to announce. Their account of the triage wording is that the user explicitly asked Copilot CLI to fetch attacker-controlled content while giving it full permissions to act on its own. They say the chain still reproduced on the affected model as of that date.

The public write-up is 6 October. The condition they state is narrow. This is not a one-click compromise of every Copilot install. They say they are not claiming a confirmation-prompt bypass. The chain needs autopilot, which The Register says is optional on Copilot CLI, and a permissive model. After the user asks the agent to review an external page, Adversa says no further click was required.

The model split is the part that survives the decline. Adversa says Microsoft's mai-code-1.1-flash completed the chain in 50 percent of runs. Two GPT-5.6 models offered in the same product refused the identical payload. On the paid account they tested, the permissive model was not the default and had to be selected. On an account left on Auto, they say the router assigned the permissive model on some sessions and a refusing model on others, with no action away from defaults and no sign of which model ran.

This brief does not repeat the page construction. Adversa and The Register both describe ciphertext, key material, and an instruction to decrypt in the agent's runtime. Plaintext of the same instructions is caught. The decrypted text is then trusted because it showed up as output the agent just produced. Their demonstration read local files, including an environment file, and a later request carried those contents to a host the user was not shown. That is the impact. The steps stay in the primary posts.

The disclosure clock and the impact clock.#

There is no package clock. Copilot CLI did not ship a tagged fix in either post, and no CVE number exists to pin a range to. The disclosure clock is the bounty timeline. 17 September, report. 1 October, validated and declined, by Adversa's account. 6 October, public post, and a GitHub spokesperson on The Register.

The spokesperson's sentence is the control GitHub is willing to name: the user must intentionally direct Copilot CLI to fetch attacker-controlled or untrusted content and confirm they want to trigger the action. GitHub said it is always looking for chances to improve the product. That is not a build number.

GitHub's "confirm" and Adversa's "no further interaction under autopilot" are not the same sentence. Do not collapse them. Adversa says the initial request is the interaction, and that they did not bypass a confirm box. GitHub says confirmation is what makes this not a product bug. Operators live in the gap: autopilot is the mode where a person is no longer on each step, which is the mode Adversa tested.

  1. Adversa reports the Copilot CLI chain to GitHub's bug bounty program.
  2. Adversa says triage validated the finding, declined it as a vulnerability, and ruled it ineligible. They say it still reproduces on the affected model.
  3. Adversa publishes. The Register quotes GitHub: the user must direct the fetch and confirm the action, so this is not a product vulnerability.
  4. No CVE, no patched CLI tag in either account. The decline is still the disclosure clock.

What this is not.#

It is not a CVE and not a GitHub security advisory. Treating it as one will send a team looking for a version to bump. There isn't one in these sources.

It is not proof that every model behind Copilot CLI will do this. Adversa's split is one model at 50 percent and two that refused. It is also not proof that Auto always selects the bad one. It is proof, on their account, that Auto can.

It is not a claim, even from Adversa, that a confirmation dialog was bypassed. They say the opposite. The argument is whether autopilot plus the request to read a page already is the confirmation GitHub is counting.

It is not a reason to ignore plaintext injection. The clear-text path was refused. The finding is that the ciphertext path was not, on one model. Defenses that only read the inbound text still miss a decrypt step the agent runs itself.

It is not the LMCache socket and not a supply-chain tag. Different clock. This one ends in a decline, not a version bound.

What to do.#

  1. Leave Copilot CLI autopilot off for any task whose first step is "read this URL," unless you operate the page. The Register says the mode is optional. Adversa's chain starts there.
  2. Do not pick a model and call it the control. If Auto is on, Adversa says you will not see whether the session drew mai-code-1.1-flash or a model that refused. Ask the vendor what every model in the pool does with decrypted tool output, not what one of them does with plaintext.
  3. Record every tool call with arguments resolved. Alert when a fetched page is followed by a read of credential files and then a request to a host outside the task. That sequence is the signal they describe. You do not need their page to write the alert.
  4. Do not brief from the agent's closing summary. Adversa says theirs named a benign endpoint. The log of resolved calls is the record.
  5. Keep fetched pages out of the context that can read secrets and open new connections. A decrypt that the agent performs is still untrusted output. Provenance has to survive that step.
  6. Do not open a ticket that waits on a CVE. GitHub has said this is not a product vulnerability. The work is the harness: autopilot, the model pool, and the trace. Rotate anything a session may already have read.

The disclosure clock stopped on a decline. The impact clock is the session you cannot replay. If you cannot say which model ran, and you cannot show the resolved calls, you do not know whether it already fired.

Frequently asked

Did GitHub confirm a product vulnerability?

No. A spokesperson told The Register on 6 October that the chain requires a user to intentionally direct Copilot CLI to fetch attacker-controlled or untrusted content and confirm they want to trigger the action, and that GitHub therefore does not treat it as a product vulnerability. Adversa says triage validated the behavior as of 1 October and still declined the bounty. Both sentences can be true. Neither is a patch.

Does every Copilot model do this?

Adversa says no. Microsoft's mai-code-1.1-flash completed the chain in half their runs. Two GPT-5.6 models offered in the same product refused the same payload. On a paid account the permissive model was not the default. On Auto, Adversa says the router assigned either one without showing the user which. A refusal you saw once is not a control for the next session.

Is autopilot the default?

The Register says autopilot remains optional for GitHub Copilot CLI. Adversa's chain needs that mode plus a permissive model. They also say they are not claiming a confirmation-prompt bypass, and that after the request to review an external page no further user interaction was required. If your teams leave autopilot off, you are outside the condition they tested.

What should we hunt without a payload?

A session that fetched a page, then read credential files, then contacted a host that was not part of the task. Capture tool calls with arguments resolved. Adversa says their demo's closing summary described a benign check, which is not what the requests did. Do not brief from the summary.

Sources

Related