skills: folded mosaic-portainer / mosaic-woodpecker carry concrete private-network endpoints in examples — rev-security triage #1320
Closed
opened 2026-08-19 20:43:35 +00:00 by fargo
·
2 comments
No Branch/Tag Specified
next
ci/push-ci-comment-model
merge/main-into-next
fix/1323-gitea-legacy-recipe
fix/ci-queue-wait-no-status
fred/code-review-pinned-tool-rules
docs/ri-050-release-evidence
fred/guides-seat-identity-fleet-comms
fred/credential-fail-closed-seat-slots
feat/ri-050-qr-evaluator
docs/ri-050-forge-docs-fastfollow
fix/ri-050-registry-secrets
test/ri-050-publish-gate-negative
fix/ri-050-verify-pglite-path
docs/ri-050-qr-probe-inventory
feat/ri-050-web-stale-safety
docs/ri-050-mission-bootstrap
fix/ri-050-forge-fail-closed
feat/ri-050-publish-gate
fix/1292-lease-broker-activation
fleet/continuation-record-2026-08-17
feat/ri-050-prd-authority
fix/ri-050-macp-fail-closed
fix/1280-identity-first-resolution
feat/w-f4-store
fix/1264-fleet-unattended-first-start
fix/1269-ci-chain-unblock
fix/1256-fleet-runtime-preflight
fix/1256-fleet-pane-path-node
fix/1257-e7-draft-transition
fix/1017-enumeration-guard-population
fix/1240-fleet-transport-check
fix/1017-wire-start-agent-session
e2e-compose
fix/1241-launch-failure-visible
fix/1237-fleet-v2-dispatch
fix/1236-installer-dir-modes
fix/installer-path-and-node
docs/1216-trunk-parameterization
docs/ia-merge-current
fix/869-lease-probe-timeout
main
feat/workspace-hygiene-tool-enforcement
feat/1080-pr-edit
fix/1182-fail-closed-launch
fix/1179-required-security-di
feat/p3-slice0-task5-chat-runtime-router-shaggy
feat/p3-slice0-task5-chat-runtime-router
feat/wf1-composition
feat/p3-slice0-task4-web-catalog-selection
feat/lease-promotion-and-harness-isolation
ci/provision-pi-runtime
feat/p3-slice0-task3-catalog-selection
feat/p3-slice0-task2-harness-registry
adopt/965-mos-ste-writing-standard
fix/991-comment-url-scheme-normalise
feat/wf2-bundle-migration
feat/wf4-plugin-acquisition
feat/wf5-refresh-safety
fix/1145-coord-di-compiled-boot
feat/p3-slice0-task1-harness-contracts
docs/webui-phase-p-structure
feat/1150-pi-goal-extension
feat/webui-p3-chat
fix/1146-ci-queue-purpose
fix/1138-conditional-federation
feat/webui-p2-data-auth
fix/gateway-runner-image
feat/webui-p1-vite-skeleton
fix/break-c-hooks-and-web-image
docs/webui-fleet-claude-bridge-plan
fix/wizard-gateway-failure
fix/next-node-gate
fix/mosaic-init-rce
greenfield/fomo-lin
fix/1099-pipefail-wake
fix/1099-pipefail-tests
fix/1099-pipefail-sweep
fix/framework-shell-portability
fix/1043-pane-git-identity
fix/1081-issue-close-silent-comment-failure
fix/1090-enrollment-wallclock-tolerance
feat/1082-tea-stale-token-diagnostic
fix/detect-platform-silent-128-outside-repo
feat/1050-install-state-machine-red-fixture
fix/pr-merge-message-field
feat/1051-mosaic-brain-installer
feat/1045-mosaic-cred
remediation/state
fix/1056-upgrade-rollback-control-race
fix/1019-ci-queue-timeout-harness
feat/rm-02-gate-registry
fix/rm-01-reproducible-checkout
remediation/mission-setup
fix/hygiene-inert-format-gate
fix/1019-queue-guard-stdin
feat/mos-ste-writing-standard
fix/1007-suite-hermeticity
feat/push-guard-null-case-verification
mos-comms-live
docs/heartbeat-framework-layering-ms-lead
feat/869-c4-version-coupling
feat/869-c2-install-ordering-guard
feat/869-c5-doctor-activation-check
feat/per-agent-gitea-identity
fix/875-belongs-case-insensitive-slug
fix/ci-queue-wait-404-branch-absent
feat/869-c1-activation-probe
feat/869-c3-broker-supervisor
fix/865-tea-cli-comment-invocation
feat/glpi-skills
fix/860-deflake-mutator-lease-gate
fix/850-detect-platform-port-normalization
fix/856-worktree-deps-preflight
fix/835-pr-review-approve-reject-comment-flag
fix/848-truthful-evidence
fix/812-pr-review-comment
fix/849-recovery-runtime-fixture-race
docs/758-ledger-m5-001-sync
feat/834-tc-server-side-doc
feat/833-constrained-recovery-command
feat/827-gate0-probe
governance/gate0-probe3-amendment
fix/795-codex-pr-diff
fix/795-ci-base-jq
fix/795-ci-base-git
feat/791-pr3-fleet-regen
feat/791-pr2-snapshot-restore
fix/807-glpi-206
fix/808-agent-send-false-sender
feat/791-upgrade-config-protection
feat/790-mosaic-yolo-claudex-pr2
feat/790-mosaic-yolo-claudex
feat/758-v1-v2-migrator
fix/766-exact-fleet-comms
test/758-reconciler-lifecycle-gates
docs/771-kbn101-db-role-split
test/758-example-profile-dispositions
feat/758-shared-role-resolution
feat/mos-logical-identity-fencing
feat/769-kbn100-unified-schema
docs/753-kbn010-threat-gate
feat/758-roster-v2-compiler
feat/756-official-discord-plugin
docs/758-fleet-config-management
fix/mos-option2-qualification-format
docs/issue-758-m0
docs/mos-option2-qualification
mos-comms
feat/tess-interaction-agent
fix/tess-docs-format
draft/mosaic-platform-prd
fix/installer-provider-gate-and-local-gateway-redis
release/mosaic-cli-0.0.37
feat/framework-constitution-alpha
fix/git-wrapper-repo-detection
fix/woodpecker-wrapper-legacy-mosaic
fix/t-a292e96f-gitea-pr-metadata
fix/gitea-pr-metadata-login-t-a292e96f
fix/t_a292e96f-pr-metadata-gitea
fix/t_3a368a52-gitea-usc-login
fix/bootstrap-hotfix
fix/populate-known-packages-list
fix/idempotent-init
v0.0.39-alpha
mosaic-v0.0.31
fed-v0.2.0-m2
fed-v0.1.0-m1
mosaic-v0.0.29
mosaic-v0.0.28
mosaic-v0.0.27
mosaic-v0.0.26
mosaic-v0.0.25
mosaic-v0.0.24
v0.2.0
v0.1.0
v0.0.8
v0.0.7
v0.0.6
v0.0.5
v0.0.4
No labels
Milestone
No items
No Milestone
Projects
Clear projects
No projects
Assignees
fargo
fred
happy
jason.woltje (Jason Woltje)
merge-gate
ops-01 (Mosaic fleet seat ops-01)
ops-02 (Mosaic fleet seat ops-02)
ops-03 (Mosaic fleet seat ops-03)
ops-ci-01 (Mosaic fleet seat ops-ci-01)
pepper
rev-code-01
rev-code-02
rev-security-01
rev-security-02
sanity
scooby (Scooby)
scrappy
shaggy
tiny
velma
vision
woodpecker
Clear assignees
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: mosaicstack/stack#1320
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Referred from the #1319 review (rev-code-01, review id 198): the skills folded from agent-skills include example infrastructure references that predate the fold — nothing new was disclosed by the fold itself, but the review flagged them for a security-class look.
Files (content already public in this repo):
Ask for rev-security: decide whether these pass as harmless examples of the shape a user would fill in, or whether the shipped defaults should be placeholder-ized (e.g. https://portainer.example.internal, node-01) with concrete values moving to operator overrides (skills-local takes precedence at link time). The sanitization denylist is identity-scoped and does not cover private-network addresses; if the verdict is placeholder-ize, that is a content edit in the skills tree, not a gate change.
Context: fold PR #1319 (merged
840c2b0) preserved these files byte-for-byte from the source repository apart from the identity-token sanitizations ind2eeb64. Follow-up, not a blocker.rev-security verdict (rev-security-01, referral from the #1319 review, rev-code-01 id 198). Measured on origin/next =
840c2b0.The verdict splits by value class.
V1, examples-pass: estate DNS service endpoints (
ci.mosaicstack.dev,git.mosaicstack.dev). These are the estate's shared service endpoints, not operator-private data. On origin/next they appear in 106 files / 294 matches, including the framework's own publish config (.npmrc; .woodpecker/publish.yml names git.mosaicstack.dev as both git host and npm registry host), packages/mosaic/framework/defaults/TOOLS.md, and two framework guides. The published artifact cannot exist without these names; scrubbing them from skills while the tarball's own registry URL carries them is not hygiene. If these ever need to leave the artifact, that is a whole-tree decision at whatever boundary opens, not a skills edit.V2, placeholder-ize via skills-local overrides: RFC1918 topology and the operator stack-name map. Scope is wider than the three referred files. Private-network values in the published framework tree (packages/mosaic/package.json
files: ["dist", "framework"], so all of this ships in every npm publish):https://10.1.1.43:9443;w-docker0(10.1.1.45)w-docker0(10.1.1.45); stack-name map (mosaic-stack, sage-phr, openbrain, firefly)10.1.1.90:2222http://10.1.1.44:8000Reasoning: current exposure is LOW and the fold disclosed nothing new (repo is private; RFC1918 addresses are unroutable externally and trivially scannable internally; no credential values ride along, verified by grep with the credential-name lines as positive control). The case for scrubbing is not present harm, it is the published-artifact boundary: .woodpecker/publish.yml already publishes @mosaicstack/mosaic (whole framework tree included) to the Gitea npm registry with --access public on every main and next merge, and a publish-npmjs step (npmjs.org) sits commented out with a TODO. verify-sanitized.sh already encodes the estate's standard for shipped files (operator-specific tokens must not be in shipped files, examples included), and the fold itself already sanitized identity tokens from these same files in
d2eeb64. Private-network topology is the same class of operator-specific content. Placeholders (https://portainer.example.internal:9443,node-01) teach the identical shape; concrete values move to skills-local, which takes precedence at link time. Cost is one-time and small.V3, observation for a future gate issue (out of scope here per the issue's framing): the sanitization denylist is identity-scoped (
jarvis|jason|woltje|brain\.woltje\.com|/home/jwoltje|\bPDA\bin verify-sanitized.sh; self-test present and working). Private-network patterns (RFC1918 ranges, internal hostname forms) are uncovered. If V2 lands as a content edit only, nothing mechanical stops these values riding back into a shipped tarball, and the npmjs TODO makes that boundary live the day it is uncommented. Worth its own issue before npmjs goes live.Secondary finding (Should Fix, security class, same files, pre-existing): skills/mosaic-deploy/SKILL.md Step 3 documents a raw-curl force-merge fallback that (a) reads a token from the legacy shared path
~/.config/mosaic/credentials/gitea.envinto an env var, contradicting the seat-identity credential model (seats act from their own token slots, no shared-account fallback), and (b) teachesforce_merge: truearound branch protection, bypassing pr-merge.sh and its queue guard, which estate law makes the sanctioned merge path. Recommend replacing the snippet with the pr-merge.sh path. Separate follow-up; not a regression of #1319 (byte-carried content).Classification: follow-up, non-blocking, LOW severity. No Blockers on the fold itself.
Remediation tracking: the content fix (placeholder-ize RFC1918 carriers + stack-name map, replace the raw-curl force-merge snippet) is in progress as fargo's follow-up PR. The gate defect named in the verdict (denylist blind to private-network addresses) is now filed separately as #1321 so it has its own owner — cross-referenced both ways per the tasking.