Miasma Targets Repository-Local Trust in Claude Code, Gemini CLI, Cursor, and VS Code
On June 5, 2026, a previously compromised contributor account pushed commit 5f456b8 to Azure/durabletask. The commit added four repository-local trigger files and a 4.6 MB obfuscated .github/setup.js credential harvester. Opening the project could launch that payload through Claude Code or Gemini CLI SessionStart hooks, a Cursor always-applied rule, or a VS Code folder-open task. GitHub later disabled 73 repositories across four Microsoft organizations in a 105-second automated sweep; that number describes containment scope, not proof that all 73 repositories contained the malicious commit.
Threat Analysis
- The commit disguised configuration-only changes as a source-code update. It was backdated, carried
[skip ci], and added five files while changing no application source. Repository admission that ignores editor and agent configuration leaves this path unreviewed. - Four distinct trigger routes converged on one payload.
.claude/settings.jsonand.gemini/settings.jsonused SessionStart hooks;.cursor/rules/setup.mdcused an always-applied instruction telling Cursor to run the script;.vscode/tasks.jsonusedrunOn: folderOpenwithout any AI involvement. - The payload lived in a trusted-looking repository path. Every trigger pointed to the obfuscated
.github/setup.js. Once launched, it ran with the developer process's local access and harvested credentials. - The reported 73 repositories must be interpreted narrowly. StepSecurity verified that GitHub disabled them in two automated waves. Its report confirms the malicious commit in Azure/durabletask, but does not prove that the payload propagated into every disabled repository.
Applicable AIDEFEND Defenses (5)
.github/setup.js bytes. Reject policy-defined dangerous constructs and fail closed when the 4.6 MB obfuscated artifact cannot be analyzed; static analysis alone still cannot prove a heavily obfuscated harvester safe.What Defenders Should Do Now
- Search clones and endpoint telemetry for commit
5f456b8and the five paths.claude/settings.json,.gemini/settings.json,.cursor/rules/setup.mdc,.vscode/tasks.json, and.github/setup.js. - Quarantine repositories containing the disclosed files until their exact contents and commit provenance are reviewed.
- Disable automatic repository-local hooks and folder-open tasks by default; require an explicit, reviewable decision before first execution.
- Open untrusted projects in credential-free disposable workspaces, not in a developer session that carries cloud, Git, package-registry, or Kubernetes secrets.
- If
.github/setup.jsmay have run, investigate the endpoint and rotate accessible credentials. Do not treat a disabled repository alone as proof of payload execution.
Conclusion
Miasma moved supply-chain execution from package installation to project open. Repository-local agent configuration must be reviewed and signed before Claude Code, Gemini CLI, or Cursor starts; the separate VS Code folder-open route needs conventional IDE trust controls. At their shared payload boundary, exact-artifact static analysis and a project-level microVM or OS sandbox can keep .github/setup.js away from ambient developer credentials. The 73-repository takedown shows the operational blast radius of containment, not a verified infection count.