fix(security): close final AppSec review gaps - #644
Conversation
|
All alerts resolved. Learn more about Socket for GitHub. This PR previously contained dependency changes with security issues that have been resolved, removed, or ignored. |
Final bundled-npm follow-upAuthoritative head: Independent review found four Moderate advisories hidden inside npm's bundled dependencies and a path-dependent closure hash caused by pnpm-generated
Validation on this head:
Socket's duplicate “obfuscated code” warnings were reviewed and are not suppressed: they refer to npm's official bundled/minified distribution, whose registry integrity and complete closure digest are pinned. |
Fail closed when legacy sealed controllers cannot preserve custom sensitive allowlisted variables across lifecycle relaunches. Replace the OpenRouter cross-pipe test sleep with a relay-state acknowledgement tracked in #647.
# Conflicts: # packages/runtime/test/pinned-submodules.test.ts # packages/runtime/test/runtime.test.ts
|
Final CI and current-main integration update:
|
|
Final release-lane blocker fix is at A current-main runtime-supporting failure exposed a real pre-spawn recovery-deadline race: the last bounded 429 relay could be discarded before replacement command construction discovered that no replacement child could start. The final error remained correct, but final caller stderr lost its request ID. This head retains one bounded prior relay until a replacement outcome is authoritative and releases it only when the replacement deadline wins before spawn. Validation: forced race 20/20; compound deadline regression 12/12; generated OpenRouter suite 11/11; runtime production/test TypeScript, ESLint, Prettier, build, and diff checks passed. The separate 100 ms synthetic idle-fixture startup race was stabilized without weakening its multi-attempt or final-429 assertions. Independent review found no actionable issue. Authoritative CI: https://github.com/monad-developers/ultrafuzz/actions/runs/32172764043. |
…ning (#892) Every event payload is redacted at append time, and since #622/#644 added the speculative high-entropy pass, that redaction flags the pipeline's own workflow run ids (ultrafuzz-ci-…-<hex16>) as secrets. The durable workflow-link-recorded event then stores workflow_run_id "<redacted>" while the workflow run link journal keeps the raw id, so verifyWorkflowRunLinkEvent's byte-compare fails and every CI eval submission is torn down as WORKFLOW_SUBMISSION_FAILED — all three smoke targets of benchmark run 32872423902 failed this way, and the same trap sits under the controller-generation event authentication and the recovery reconciliation in workflow-sync. Event payloads are structured identifier records, not prose: scan them positive-only, per the SecretScanMode contract's own guidance that the speculative heuristics cannot separate a credential from a long identifier. Exact forbidden values and every positively identified credential format (secretlint findings, supplemental vendor formats, BIP39 mnemonics, labeled private keys, URL and Bearer credentials) are still redacted from persisted events — five of the six lines in the at-rest fixture still redact — and prose artifacts such as attempt-ledger failure messages keep the full speculative scrub, as do the public artifact gates. The one behavior change, deliberately pinned in the updated test: an unlabeled opaque high-entropy string in an event payload message now persists. Closes #889 Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…ng (#901) compileSmithersWorkflow wrote smithers/input.json through redactSecretsInValue in "all" mode, and submitSmithersWorkflow passes those exact persisted bytes as the workflow runner's --input. The speculative high-entropy pass flags the eval lane's bounded run ids (ci-<run_id>-…-<hex16>), so the persisted input carried ultrafuzz_run_id "<redacted>" while the generated workflow pins z.literal(<run id>) — the runner's detached-launch preflight rejected every eval submission as INVALID_INPUT ("render frame: Input does not match schema", exit 4). All three smoke targets of benchmark run 32878286998 failed this way; reproduced and verified end-to-end locally against real smithers 0.34: the identical project submits with runId "repro-889" and fails with the bounded eval id, and passes both with this fix. Third instance of the #622/#644 speculative-redaction class after #883 and #889: the workflow input is a structured identifier document that the runner byte-validates against compiled literals. Scan it positive-only — exact vendor credential formats, mnemonics, labeled private keys, and URL/Bearer credentials are still redacted from the operator-supplied free text the document can carry; only the speculative heuristics stop corrupting identifiers. Closes #899 Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Summary
This addresses the remaining P1 feedback in PR #635 (
discussion_r3803978885) and PR #639 (discussion_r3803971550). It is the final follow-up for #527 and #628.Validation
pnpm typecheckpnpm lintpnpm format:checkpnpm docs:checkFinal feedback and CI stabilization
Fixes #647.
Greptile Summary
This follow-up closes the remaining cloud handoff, provider-scoped environment, lifecycle-classification, OpenRouter relay, and operator npm advisory gaps.
Confidence Score: 5/5
The PR appears safe to merge.
No blocking failure remains.
Important Files Changed
Flowchart
%%{init: {'theme': 'neutral'}}%% flowchart TD A[Compile workflow] --> B[Seal governance and task environment] B --> C{Governed source clean?} C -->|No| X[Reject Modal handoff] C -->|Yes| D[Initial or lifecycle launch] D --> E{Current credential classification matches seal?} E -->|No| Y[Fail closed and require a new run] E -->|Yes| F[Select task provider route] F --> G[Forward ordinary allowlisted inputs] F --> H[Forward only route-owned sensitive inputs] G --> I[Local model child or Modal task] H --> IReviews (10): Last reviewed commit: "fix(runtime): retain final OpenRouter ra..." | Re-trigger Greptile
Context used (3)