From ae0b110e444b26740a32083b273b07db4e05d13d Mon Sep 17 00:00:00 2001 From: Xinhua Gu Date: Mon, 16 Feb 2026 18:32:34 +0100 Subject: [PATCH] fix(security): set 0o600 on remaining session file write paths MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Follow-up to #18066 — three session file write sites were missed: - auto-reply/reply/session.ts: forked session transcript header - pi-embedded-runner/session-manager-init.ts: session file reset - gateway/server-methods/sessions.ts: compacted transcript rewrite All now use mode 0o600 consistent with transcript.ts and chat.ts. --- src/agents/pi-embedded-runner/session-manager-init.ts | 2 +- src/auto-reply/reply/session.ts | 5 ++++- src/gateway/server-methods/sessions.ts | 5 ++++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/agents/pi-embedded-runner/session-manager-init.ts b/src/agents/pi-embedded-runner/session-manager-init.ts index 95c699947..ef7957183 100644 --- a/src/agents/pi-embedded-runner/session-manager-init.ts +++ b/src/agents/pi-embedded-runner/session-manager-init.ts @@ -43,7 +43,7 @@ export async function prepareSessionManagerForRun(params: { if (params.hadSessionFile && header && !hasAssistant) { // Reset file so the first assistant flush includes header+user+assistant in order. - await fs.writeFile(params.sessionFile, "", "utf-8"); + await fs.writeFile(params.sessionFile, "", { encoding: "utf-8", mode: 0o600 }); sm.fileEntries = [header]; sm.byId?.clear?.(); sm.labelsById?.clear?.(); diff --git a/src/auto-reply/reply/session.ts b/src/auto-reply/reply/session.ts index b73de9991..0a0594ddd 100644 --- a/src/auto-reply/reply/session.ts +++ b/src/auto-reply/reply/session.ts @@ -89,7 +89,10 @@ function forkSessionFromParent(params: { cwd: manager.getCwd(), parentSession: parentSessionFile, }; - fs.writeFileSync(sessionFile, `${JSON.stringify(header)}\n`, "utf-8"); + fs.writeFileSync(sessionFile, `${JSON.stringify(header)}\n`, { + encoding: "utf-8", + mode: 0o600, + }); return { sessionId, sessionFile }; } catch { return null; diff --git a/src/gateway/server-methods/sessions.ts b/src/gateway/server-methods/sessions.ts index eadbdef2b..91cdf7704 100644 --- a/src/gateway/server-methods/sessions.ts +++ b/src/gateway/server-methods/sessions.ts @@ -471,7 +471,10 @@ export const sessionsHandlers: GatewayRequestHandlers = { const archived = archiveFileOnDisk(filePath, "bak"); const keptLines = lines.slice(-maxLines); - fs.writeFileSync(filePath, `${keptLines.join("\n")}\n`, "utf-8"); + fs.writeFileSync(filePath, `${keptLines.join("\n")}\n`, { + encoding: "utf-8", + mode: 0o600, + }); await updateSessionStore(storePath, (store) => { const entryKey = compactTarget.primaryKey;