Skip to content

πŸ›πŸ§‘β€πŸ’» - Bugbot mistakes a source bound nonpersonal UI shell for an authentication bypassΒ #847

Closed

Description

@efraespada

Is there an existing issue for this?

Which actions are affected?

Pull Request

Which platforms are affected?

Linux (hosted reviewer); macOS (consumer regression execution).

Description

Bugbot published a medium-severity security finding with 97% confidence against a deliberately nonpersonal, source-bound UI document and static assets. It treats absence of a Home Assistant directory lookup on these resources as an authentication bypass and predicts a broken UI for rejected identities. The documented contract and executable browser behavior contradict both conclusions.

Consumer: vypdev/domus#15
Reviewed head: 54159084e3fe8b9e3541830d05e1b24f07f14dac.
Finding: vypdev/domus#15 (comment)
Path: backend/src/domus/composition/ingress.py:117-118.
Identity: backend/src/domus/composition/ingress.py:117:native-ui-skips-ha-proof;
fingerprint fp-30e932d9; semantic key sf-8d206c57.

The actual native UI callback intentionally calls only request_actor(request). This enforces the trusted socket peer, exact Supervisor-supplied candidate, accepted Ingress prefix and session-cookie binding. It does not claim human proof. The fixed document and compiled assets contain no household facts, verified identity, installation identity, effective grant or authentication credential. The inert bootstrap has exactly version, deployment, application_base and a public style_nonce. Personal APIs independently require actual current identity proof before revealing data or issuing CSRF/commands. Standalone similarly serves this nonpersonal document before sign-in.

The distinction was published before the finding:

  • SDD Β§7, immutable head: β€œNonpersonal shell/assets remain behind source/binding guards; personal APIs require proof.”
  • Native API documentation.
  • Existing composed test: unavailable HA still permits the nonpersonal document/assets, while /api/v1/session is503; absent source binding rejects document/assets401.
  • Actual proof boundary: status/read/current enforce human proof and bounded leases; constructing the source-bound actor grants no authority.

Expected: evaluate the declared resource classification and downstream identity enforcement. A nonpersonal shell is not itself an authentication bypass. Report a finding if it discloses personal content/grants, bypasses source binding, permits a personal API without proof, or actually renders an unusable result.

Actual: the suggestion adds request_actor(request).status() to every document/asset request. It would make the existing intentional no-live-HA shell-loading contract fail, preventing the UI from presenting its safe authentication/unavailability guidance. The old root performed proof because it was a different personal preview endpoint; retaining every old behavior is not the new document contract.

Reproducing the issue

  1. Review the exact consumer head using the installed PR workflow.
  2. Observe the finding and proposed status() call above.
  3. On unchanged production code, run the existing native shell/source-binding test and the prepared narrow regressions.
  4. Three additional real composed ASGI/SQLite scenarios start from a configured household and then exercise an unknown subject, revoked subject and mismatched subject. The source-bound shell and assets200 do not invoke the HA directory or set cookies. The exact four-field bootstrap has no identity/grant. Session, authorization, household and CSRF endpoints all401; the sole household/member/receipt/audit/outbox counts remain unchanged.
  5. The additional built-product Chromium journey configures fictional data, makes the fictional HA reject identity, reloads the real native product, observes document/assets200 and session401, and asserts visible β€œVerify your access”/β€œReopen Domus”, no household name, no setup action, no page errors and unchanged SQLite counts.

Local results:

  • pytest tests/backend/test_ui_session.py --no-cov -q:6passed, including the3 new identity-denial cases.
  • Full real composed browser campaign:43passed without retries in23.5s, including the new identity-rejection journey. These use real product code/SQLite with fictional HA/Supervisor, not an owner's private data.
  • An initial browser fixture attempt used an intentionally unsupported unknown-subject control and failed its fixture assertion; after adding an explicit fictional HA rejection control, the final real product assertions pass. This is not claimed as a production defect/fix.
  • No runtime or immutable installed image source was changed for these regressions. New tests are being prepared on the same Action-managed consumer branch; their eventual full CI is independent. Published5415908 frontend already passes565cases/100% across15runtime modules,42product cases and18catalog journeys; backend2984cases/107modules also passes100%.

copilot Version

vypdev/copilot@v3 resolved to 3e7ceea08e6131360e026937d1c0cc1b120472e0. Reviewer/findings model gpt-6-luna; effort smart. No model, policy or Copilot resource was changed.

Relevant Log Output

Run https://github.com/vypdev/domus/actions/runs/41328800644
Job https://github.com/vypdev/domus/actions/runs/41328800644/job/124914313780

reviewId=vypdev:domus:pr-15:54159084e3fe
changedFiles=94 changedLines=11173
analysisPartitions=14 completedAnalysisPartitions=14
candidateFindings=1 publishedFindings=1
findingStates: open=1 fixed=2 reopened=0 verification-required=0 unknown=0
contextCoverageStatus=partial
human-conversation: fetched10 retained4 omitted6 truncated0 limitReached=true

Additional context and comments

Please investigate the semantic finding/evidence quality upstream. Distinguish static nonpersonal presentation from protected personal data and test the suggested change against the declared availability/authentication contract. Do not globally suppress authentication findings. The prior two genuine consumer defects were fixed normally and natively resolved.

The conversation context limitation is already tracked in #843. Its presence does not establish the cause of this false positive: we have not established an internal root cause. Consumer Copilot engine/generated files, settings, credentials, gateway and branch lifecycle remain unchanged. No owner screenshots, cookies, technical Core token or private Ingress URL are included.

Activity

  1. added
    bugSomething isn't working
    bugfixSomething isn't working
    priority: highCritical issue, needs immediate attention.
    on Nov 1, 2026
  2. added theissue type on Nov 1, 2026
  3. moved this to Todo in vypdevon Nov 1, 2026
  4. changed the title [-]Bugbot mistakes a source-bound nonpersonal UI shell for an authentication bypass[/-] [+]πŸ› - Bugbot mistakes a source bound nonpersonal UI shell for an authentication bypass[/+] on Nov 1, 2026
  5. vypbot commented on Nov 1, 2026

    @vypbot
    Contributor

    Hi! I’m @vypbot, the Copilot assistant for this repository.

    I can answer questions, explain the codebase, propose implementation and test plans, review issues and pull requests for potential bugs or security problems, and help authorized maintainers apply changes.

    Try /copilot help to see the available commands, or mention @vypbot with your question.

  6. efraespada commented on Nov 1, 2026

    @efraespada
    MemberAuthor

    The counterevidence is published in consumer commit 7e80b1aa7ccc42a233f69c010d9dfa29323bfd4e: three actual ASGI/SQLite denial cases and the rendered product identity-rejection journey. The complete hosted campaigns pass 2,987 backend cases and 565 Chromium unit/component cases at 100% production coverage, 43 composed browser cases and 18 separate catalog journeys. The subsequent ecdd85b commit only closes a test-owned read-only SQLite connection explicitly; its focused six-case suite passes with ResourceWarning treated as error. Production and immutable installed Edge.4 source remain unchanged.

    The native finding has now been resolved by vypbot as obsolete, with the original history and counterevidence reply retained. It was not manually resolved or suppressed. This native lifecycle result does not establish the internal cause of the original semantic false positive; please retain the upstream review-quality investigation. The unrelated progress-scope failure is separately recorded in #828. New exact-head full gates remain independent. No private owner data is part of these fictional-provider tests.

  7. moved this from Todo to In Progress in vypdevon Nov 3, 2026
  8. added
    branchedIndicates that a branch has been created for this issue.
    on Nov 3, 2026
  9. 2 remaining items

  10. vypbot commented on Nov 3, 2026

    @vypbot
    Contributor

    Implementation plan

    Current status: Ready to start. No action is required from maintainers before implementation.

    1. Define the review contract
      • Specify how reviewers distinguish source-bound, nonpersonal shell/assets from personal data and protected APIs.
      • Require findings to identify a concrete disclosure, source-binding bypass, missing identity proof, or unusable rendered result.
    2. Improve finding evidence checks
      • Update semantic review guidance or evaluation logic to consider resource classification and downstream identity enforcement before labeling missing proof an authentication bypass.
      • Do not globally suppress authentication findings; retain findings when protected data or actions are reachable without proof.
    3. Add focused regression cases
      • Cover the reported native shell behavior: document/assets remain available without live Home Assistant, while personal endpoints require proof.
      • Include rejected, revoked, and mismatched identities; assert no personal data, grants, cookies, or state changes are exposed.
    4. Validate the proposed fix against the product
      • Run the narrow backend and real-browser regressions against the unchanged consumer behavior.
      • Confirm the UI presents safe verification or availability guidance and that adding status() to shell requests would fail the declared contract.
    5. Document and review the outcome
      • Record the resource classification, proof boundary, and regression evidence in the relevant reviewer guidance or evaluation notes.
      • Verify the change preserves detection of genuine authentication bypasses and does not depend on conversation truncation as the assumed cause.

    Acceptance: The reported finding is not emitted for the source-bound nonpersonal shell when personal endpoints reject unverified identities, while a regression case that exposes personal data or permits a personal action without proof still produces an authentication finding.

    Need something else? Mention the bot with a question or use /copilot help.

  11. added
    size: XXLIndicates an extremely large task or issue that requires significant time and effort to complete.
    on Nov 3, 2026
  12. vypbot commented on Nov 3, 2026

    @vypbot
    Contributor

    Issue closed β€” historical progress

    Current status: closed as completed.

    The last estimate is retained below as history. Closure does not certify a new percentage, tests, or branch alignment.

    Action required: none for this closed issue. If work continues, reopen the issue; a fresh assessment can update this same card.

    Last assessment before closure (historical)

    Progress: 60% β€” in progress

    > Current status: [R1] Expected: evaluate the declared resource classification and downstream identity enforcement. A nonpersonal shell is not itself an authentication bypass. Report a finding if it discloses personal content/grants, bypasses source binding, permits a personal API without proof, or actually renders an unusable result. β€” The patches add guidance and regression cases for classifying source-bound nonpersonal resources, checking downstream identity enforcement, and preserving genuine findings. The supplied evidence does not establish that the reported false positive is avoided or protected-resource findings are retained in execution.
    [R2] Please investigate the semantic finding/evidence quality upstream. Distinguish static nonpersonal presentation from protected personal data and test the suggested change against the declared availability/authentication contract. Do not globally suppress authentication findings. The prior two genuine consumer defects were fixed normally and natively resolved. β€” The patches document the evidence-quality approach and add a bounded corpus and probe, but supplied reports are not independent execution evidence. The probe's behavior and semantic review outcomes remain unverified.

    Next: [R1] Expected: evaluate the declared resource classification and downstream identity enforcement. A nonpersonal shell is not itself an authentication bypass. Report a finding if it discloses personal content/grants, bypasses source binding, permits a personal API without proof, or actually renders an unusable result. β€” Verify reviewer behavior against the declared availability and authentication contract, including safe shell delivery and detection of protected disclosure or access without proof.
    [R2] Please investigate the semantic finding/evidence quality upstream. Distinguish static nonpersonal presentation from protected personal data and test the suggested change against the declared availability/authentication contract. Do not globally suppress authentication findings. The prior two genuine consumer defects were fixed normally and natively resolved. β€” Obtain independent evidence that the scoped cases distinguish static nonpersonal presentation from protected personal data, preserve genuine authentication findings, and avoid the reported false positive; the historical cause remains unknown.

  13. added a commit that references this issue on Nov 3, 2026
  14. vypbot commented on Nov 3, 2026

    @vypbot
    Contributor

    Issue closed: synchronization recommendation retired

    No branch synchronization is required for this closed issue.

    The previous recommendation is historical. Issue closure does not certify that the branches are synchronized.

  15. removed
    60%Progress: 60%
    in-progressStart work on an admitted issue.
    on Nov 3, 2026
  16. moved this from In Progress to Done in vypdevon Nov 3, 2026
  17. added
    100%Progress: 100%
    and removed
    state:workingWork can proceed on the verified branch or without a branch.
    on Nov 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

100%Progress: 100%branchedIndicates that a branch has been created for this issue.bugSomething isn't workingbugfixSomething isn't workingpriority: highCritical issue, needs immediate attention.size: XXLIndicates an extremely large task or issue that requires significant time and effort to complete.

Type

Projects

  • Status
    Done

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions