Repository navigation
Nen v0.18.1
v0.18.1 — 2026-09-30
Release unit for v0.18.0..v0.18.1, the hardening of the host script nen runner script renders:
- the delivery: #313, which closes #312 — Feitan's three security findings from Hatsu's review of
hatsu:jusshin. - #314, the release proposal.
The compatibility floor stays 0.18.
Fixed
- runner — Security (#312, #313). The rendered Windows script passed the service-account password and the registration token on
config.cmd's argv, a batch file cmd.exe re-parses:& | < > ^ %split the argument, expanded%PATHEXT%and ran|whoami, andHide-Secretmasked only the whole secret, so fragments were replayed into theregister-*.logthe caller reads; both secrets also sat on the process command line. Now both reach the runner through its own environment inputs,ACTIONS_RUNNER_INPUT_TOKENandACTIONS_RUNNER_INPUT_WINDOWSLOGONPASSWORD(actions/runnerCommandSettings.cs,ACTIONS_RUNNER_INPUT_<ARG>, secrets masked and the variables removed from the listener's environment), set just before the call and cleared in itsfinally;config.cmd's output is discarded and never replayed; a password that is empty, has leading or trailing whitespace, or carries& | < > ^ % " 'or a line break is refused before first use, at exit 1, naming the rule. On Linux and macOS the token takes the same environment path (a pipe read by the service user's shell on Linux, wheresudowould strip an inherited variable). - runner — Security (#312, #313). The runner root an unelevated session created inherited
Authenticated Users: ModifyfromC:\, so a pool's own service account could swap the.ps1before UAC, the zip after its one hash check, orconfig.cmdbefore it ran. The elevated script now locks the root down first, before the transcript,ghand any download — owner Administrators, inheritance removed,SYSTEMandAdministratorsfull control, the package directory admin-only, the elevated user read on_jusshin— re-hashes the archive immediately before everyExpand-Archive(and everytaron Linux and macOS), and empties a pendingRunner<N>folder before extraction. The service account keeps(RX)on the root and project folder only. - runner —
nen runner scriptrefuses an--outat or under the plan's runner root at exit 2, naming%LOCALAPPDATA% en\jusshin\(Windows) or~/.local/state/nen/jusshin/(Linux, macOS) instead; every host script writes the one summary line, and only that line, to_jusshin/register-<ts>.summary;--jsongains the additivescriptSha256andsummarykeys. Flags and exit codes are otherwise unchanged.
Breaking / consumer notes
This release declares no breaking consumer note, and under the rule #200 landed that is a decision rather than an absence: it is what leaves COMPATIBLE_MINOR_FLOOR at 0.18, and therefore what keeps every "0.18" pin already written valid against a v0.18.1 binary. The section is still here, and still carries exactly one bullet, because the release-time floor step requires the cut to STATE the outcome either way.
- No repin: the compatibility floor stays
0.18. A repository pinnedminimum: "0.18"needs no change to read this build.pinned_refSHOULD move tov0.18.1on a repository whose skills render the Windows host script: that is how a host picks up the secret-path and root-lockdown fixes above, and the--outrefusal is the one new exit-2 a caller can meet.