Skip to content

security: address oobee findings from 2026-09-14 scan - #861

Open
younglim wants to merge 1 commit into
masterfrom
security/oobee-findings-2026-09-14
Open

younglim wants to merge 1 commit into
masterfrom
security/oobee-findings-2026-09-14

Conversation

@younglim

Copy link
Copy Markdown
Collaborator

Summary

Addresses 8 asgard findings from the GovTechSG-oobee-scan-2026-09-14 review (3 high, 4 medium, 1 info).

ID Severity Fix
asgard-0001 high Route github.ref_name and step outputs through validated env: blocks in bump-package-version.yml (script-injection).
asgard-0002 high Windows veraPDF install now stages into a random subdir under $env:TEMP (not C:\Windows\Temp).
asgard-0003 high macOS veraPDF install uses mktemp -d (not /tmp/verapdf); xattr -rd com.apple.quarantine scoped to just the trees oobee installs.
asgard-0004 medium isInternalOrLoopbackUrl pre-nav filter + Response.serverAddr() post-nav DNS-rebinding check in crawlDomain; opt-in OOBEE_BLOCK_INTERNAL_TARGETS seed-URL gate.
asgard-0005 medium crawlSitemap mirrors runCustom: hasCredentials = \!\!authHeader || \!\!httpCredentials, so Bearer tokens keep TLS validation on when OOBEE_ALLOW_INSECURE_TLS is set.
asgard-0006 medium generateGenAiSuggestFix error path renders via textContent/replaceChildren instead of innerHTML.
asgard-0007 medium sendWcagBreakdownToSentry short-circuits when OOBEE_DISABLE_TELEMETRY is set.
asgard-0009 info Chrome installed via Google's signed apt repository (amd64 + arm64), with optional --build-arg GOOGLE_CHROME_SIGNING_KEY_SHA256 pin.

Not addressed (intentional):

  • asgard-0008 (default-on Google Form telemetry): product/consent design decision — deferred.
  • asgard-0010/11/12: already in the suppressed/unverified list.

Test plan

  • npm run build succeeds (tsc + copyfiles)
  • tsc --noEmit clean
  • bash -n on modified shell scripts
  • xmllint --noout on modified XML files
  • yaml.safe_load on modified workflow
  • End-to-end scan on a public site (crawlDomain pre/post-nav SSRF filter path)
  • End-to-end scan on a local dev URL with OOBEE_BLOCK_INTERNAL_TARGETS=1 to confirm gate behaviour
  • Docker build for amd64 and arm64 (signed apt repo swap)
  • Confirm veraPDF install still succeeds on macOS + Windows with the new random-dir staging

Jest suite is currently broken on master (missing ../utils.js, missing mustache, CJS lexer errors); unrelated to this PR.

🤖 Generated with Claude Code

Fixes 8 asgard findings from the GovTechSG-oobee-scan-2026-09-14 review:

- asgard-0001 (high): route github.ref_name and version outputs through
  validated env: blocks in bump-package-version.yml to close the GitHub
  Actions script-injection vector.
- asgard-0002 / asgard-0003 (high): stage the veraPDF izpack install into
  a per-user, non-predictable directory (Windows: random subdir under
  $env:TEMP; macOS: mktemp -d) instead of the shared C:\Windows\Temp
  and /tmp/verapdf paths. Rewrite verapdf-auto-install-{windows,macos}.xml
  at install time so the placeholder resolves to the private path. Scope
  the recursive `xattr -rd com.apple.quarantine` to just the trees oobee
  installed (nodejs-mac-*, jre, verapdf) rather than the whole cwd.
- asgard-0004 (medium): add isInternalOrLoopbackUrl and a
  Response.serverAddr() DNS-rebinding check to the crawlDomain
  pre/post-navigation hooks so untrusted discovered links can no longer
  steer the crawler at 169.254.169.254 / 127.0.0.1 / RFC1918. Also add
  an opt-in OOBEE_BLOCK_INTERNAL_TARGETS seed-URL gate for hosted
  deployments.
- asgard-0005 (medium): mirror runCustom's hasCredentials formula in
  crawlSitemap so Bearer / non-Basic Authorization headers keep TLS
  validation on when OOBEE_ALLOW_INSECURE_TLS is set.
- asgard-0006 (medium): render generateGenAiSuggestFix error messages
  via textContent instead of innerHTML so an attacker-influenced AI
  error field cannot execute script in the report DOM.
- asgard-0007 (medium): honour OOBEE_DISABLE_TELEMETRY in
  sendWcagBreakdownToSentry so the opt-out actually stops PII (email,
  name, entry URL) from reaching Sentry.
- asgard-0009 (info): install Chrome via Google's signed apt repository
  (with the linux_signing_key.pub optionally pinnable by SHA-256) for
  both amd64 and arm64, replacing the unverified google-chrome-stable_current .deb wget.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant