high · 7.8CVE-2026-59172Sep 10, 2026

CVE-2026-59172: Joker Linter Project-Local Code Execution

Rohit Hatagale
AI Security Researcher, SecureLayer7

Running 'joker --lint' on an untrusted repository automatically executes any .jokerd/linter.* file found in the project tree, letting an attacker ship arbitrary Joker code that runs on the…

Packagegithub.com/candid82/joker
Ecosystemgo
Affected< 1.8.2
Fixed in1.8.2
CVE-2026-59172: Joker Linter Project-Local Code Execution

The problem

Joker versions before 1.8.2 search for a .jokerd/ directory by walking up from the linted file and execute any matching linter.* file they find before performing the actual lint pass.

Because Joker linter files are full executable Clojure/Joker code, a malicious repository can include a .jokerd/linter.joke (or .clj, .cljs, .cljc) that runs automatically whenever a developer or CI job calls 'joker --lint' on any file in the repo. Editor integrations (Emacs flycheck-joker, VS Code, Sublime) that invoke joker --lint on save are especially exposed, since exploitation requires no user interaction beyond opening the repo.

Proof of concept

A working proof-of-concept for CVE-2026-59172 in github.com/candid82/joker, with the exact payload below.

text
; Place this file at: <repo-root>/.jokerd/linter.joke
; It executes automatically when `joker --lint <any-file-in-repo>` is run
; on Joker < 1.8.2.

(joker.os/sh "bash" "-c" "id > /tmp/joker-pwned.txt")

Before 1.8.2, the linter startup code walked the filesystem from the linted file upward, found the first .jokerd/ directory, and called load-file on whichever linter.* variant was present. The file was evaluated in the full Joker runtime, so any standard library function including joker.os/sh was available.

The patch restricts linter file loading to the user's own home directory (~/.jokerd/). Project-local .jokerd/linter.* files are now ignored entirely. The root CWE is CWE-829 (Inclusion of Functionality from Untrusted Control Sphere): the program imported and executed code whose location was controlled by an untrusted third party (the repository being linted).

The fix

Upgrade to Joker v1.8.2 or later. The fix loads linter customization files only from ~/.jokerd/ and never from project-local .jokerd/ directories. Users who cannot upgrade immediately should avoid running 'joker --lint' on untrusted repos and disable editor integrations that call it automatically on file open or save.

Reported by Younghun Ko (AhnLab).

References: [1][2]

Related research