Skip to content

Hydra full-branch review findings — PR #29 backlog #32

Description

@rubenvdlinde

Hydra full-branch review findings — PR #29

Structured backlog from a HYDRA_REVIEW_SCOPE=full dogfood run on 2026-05-02. Each item links to file:line and the rule that flagged it. Tick the box when fixed.

Why these landed as TODOs and not as auto-fixes: the HYDRA_REVIEW_SCOPE=full prompt I wrote in hydra#210 starts with the literal text FULL-BRANCH AUDIT MODE. Clyde's CLAUDE.md has a separate AUDIT_MODE=full mode where fix authority is explicitly disabled — he read "AUDIT MODE" in my prompt and switched into report-only behavior. Tracking the rename (and a related fix-PR-on-PR design proposal) in hydra#212.


Security findings — Clyde Barcode

unfixed: 15 (CRITICAL: 0, WARNING: 13, SUGGESTION: 2) · fixes_applied: 0

🟡 WARNING

  • apps(): #[NoAdminRequired] contradicts admin-gated body

    • File: lib/Controller/ApiController.php:59
    • Rule: gate-9 / ADR-005 / OWASP A01:2021
    • Note: Full-audit mode — fix authority disabled. Remediation: remove #[NoAdminRequired] from all 13 admin-only methods (lines 59, 69, 81, 94, 111, 146, 164, 199, 221, 263, 300, 327, 361). Body guard remains as defence-in-depth.
  • updateChannel(): #[NoAdminRequired] contradicts admin-gated body

  • sources(): #[NoAdminRequired] contradicts admin-gated body

  • getBinding(): #[NoAdminRequired] contradicts admin-gated body

  • bindSource(): #[NoAdminRequired] contradicts admin-gated body

  • appVersions(): #[NoAdminRequired] contradicts admin-gated body

  • installVersion(): #[NoAdminRequired] contradicts admin-gated body — installs code to filesystem

    • File: lib/Controller/ApiController.php:164
    • Rule: gate-9 / ADR-005 / OWASP A01:2021
    • Note: See line 59 entry. This method writes PHP code to disk; the annotation mismatch is highest-consequence here.
  • listPats(): #[NoAdminRequired] contradicts admin-gated body

  • createPat(): #[NoAdminRequired] contradicts admin-gated body

  • patchPat(): #[NoAdminRequired] contradicts admin-gated body

  • deletePat(): #[NoAdminRequired] contradicts admin-gated body

  • discover(): #[NoAdminRequired] contradicts admin-gated body

  • patDeeplink(): #[NoAdminRequired] contradicts admin-gated body

🟢 SUGGESTION

  • SHA-256 integrity check is optional — install proceeds without verification

    • File: lib/Service/ExternalReleaseInstallerService.php:123
    • Rule: OWASP A08:2021
    • Note: When no .sha256 asset exists, integrityWarning is set and install continues. For a filesystem-writing code installer this is a posture gap. Recommend requiring checksums for GitHub release sources or surfacing a more prominent warning in the UI.
  • authenticatedDownload() missing allow_local_address: false

ℹ️ Informational (inherited debt — non-blocking)

  • 34 vulnerabilities in @nextcloud/vue ecosystem transitive dependencies (-)

Code-review findings — Juan Claude van Damme

Reviewer run still in progress as of issue creation — will append findings in a comment when complete.


Run metadata

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions