risk: report embedded backup WebDAV credential
Assistant: codex Assistant-Model: gpt-5.6-sol Assistant-Session: 01a02669-87ee-7a31-b111-edc95a16e0fa
This commit is contained in:
parent
623f7ccb2e
commit
cad7adf851
2 changed files with 65 additions and 4 deletions
|
|
@ -1,20 +1,21 @@
|
||||||
# Register
|
# Register
|
||||||
|
|
||||||
Generated by `tools/register_index.py` from `findings/`. Do not edit by hand. Last built 2026-08-21.
|
Generated by `tools/register_index.py` from `findings/`. Do not edit by hand. Last built 2026-08-23.
|
||||||
|
|
||||||
7 live of 9 findings; 3 notes below the floor.
|
8 live of 10 findings; 3 notes below the floor.
|
||||||
|
|
||||||
## Findings
|
## Findings
|
||||||
|
|
||||||
| ID | Finding | System | Severity | Disclosure | Escalation | Fix owner | Status | Cadence | Next check |
|
| ID | Finding | System | Severity | Disclosure | Escalation | Fix owner | Status | Cadence | Next check |
|
||||||
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
|
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
|
||||||
|
| [RISK-F-0010](findings/RISK-F-0010-embedded-backup-webdav-credential.md) | Forgejo backup source embeds a WebDAV credential default | railiance-platform | unset | unset | unset | railiance-platform | open | instant (0) | — |
|
||||||
| [RISK-F-0009](findings/RISK-F-0009-openbao-deny-set-covers-a-third-of-high-risk-lanes.md) | agent-high-risk-boundary denies 6 of 17 high-risk lanes; the direct bao path is unprotected for the rest | railiance-platform | **high** | embargoed | none | railiance-platform | open | instant (0) | **due** |
|
| [RISK-F-0009](findings/RISK-F-0009-openbao-deny-set-covers-a-third-of-high-risk-lanes.md) | agent-high-risk-boundary denies 6 of 17 high-risk lanes; the direct bao path is unprotected for the rest | railiance-platform | **high** | embargoed | none | railiance-platform | open | instant (0) | **due** |
|
||||||
| [RISK-F-0008](findings/RISK-F-0008-audit-retention-legal-basis-assumed.md) | The legal basis for retaining audit facts against an erasure request has been assumed, never established | audit-core | medium | public | **answered** (t2, answered) | risk-nexus | accepted | instant (0) | **due** |
|
| [RISK-F-0008](findings/RISK-F-0008-audit-retention-legal-basis-assumed.md) | The legal basis for retaining audit facts against an erasure request has been assumed, never established | audit-core | medium | public | **answered** (t2, answered) | risk-nexus | accepted | instant (0) | **due** |
|
||||||
| [RISK-F-0007](findings/RISK-F-0007-unverified-tenant-boundary.md) | No consumer's tenant boundary is verified anywhere | estate | **high** | embargoed | **answered** (t4, assigned) | per-consumer, on request | accepted | 1h (1) | 2026-08-21 08:32Z |
|
| [RISK-F-0007](findings/RISK-F-0007-unverified-tenant-boundary.md) | No consumer's tenant boundary is verified anywhere | estate | **high** | embargoed | **answered** (t4, assigned) | per-consumer, on request | accepted | 1h (1) | **due** |
|
||||||
| [RISK-F-0006](findings/RISK-F-0006-apps-pg-no-backup-configured.md) | apps-pg has no backup configured at all: R0 means no recovery | railiance-platform | **high** | public | **answered** (t3, answered) | railiance-platform | fixed | instant (0) | **due** |
|
| [RISK-F-0006](findings/RISK-F-0006-apps-pg-no-backup-configured.md) | apps-pg has no backup configured at all: R0 means no recovery | railiance-platform | **high** | public | **answered** (t3, answered) | railiance-platform | fixed | instant (0) | **due** |
|
||||||
| [RISK-F-0005](findings/RISK-F-0005-audit-core-unfiltered-read-path.md) | audit-core read path applies no tenant filter; the bound is deployment, not code | audit-core | medium | public | none | audit-core | mitigated | instant (0) | **due** |
|
| [RISK-F-0005](findings/RISK-F-0005-audit-core-unfiltered-read-path.md) | audit-core read path applies no tenant filter; the bound is deployment, not code | audit-core | medium | public | none | audit-core | mitigated | instant (0) | **due** |
|
||||||
| [RISK-F-0004](findings/RISK-F-0004-tenant-engine-unfiltered-event-read.md) | tenant-engine events() returns the entire event log unfiltered | tenant-engine | medium | embargoed | none | tenant-engine | open | instant (0) | **due** |
|
| [RISK-F-0004](findings/RISK-F-0004-tenant-engine-unfiltered-event-read.md) | tenant-engine events() returns the entire event log unfiltered | tenant-engine | medium | embargoed | none | tenant-engine | open | instant (0) | **due** |
|
||||||
| [RISK-F-0003](findings/RISK-F-0003-ops-warden-read-boundary-ungraded-lanes.md) | ops-warden agent read-boundary does not fire on ungraded catalog lanes | ops-warden | medium | embargoed | none | ops-warden | mitigated | 8h (2) | 2026-08-21 14:32Z |
|
| [RISK-F-0003](findings/RISK-F-0003-ops-warden-read-boundary-ungraded-lanes.md) | ops-warden agent read-boundary does not fire on ungraded catalog lanes | ops-warden | medium | embargoed | none | ops-warden | mitigated | 8h (2) | **due** |
|
||||||
| [RISK-F-0002](findings/RISK-F-0002-ops-warden-sign-ungated.md) | ops-warden signs SSH certificates with no authorization decision, and its unblock is now unsafe | ops-warden | medium | embargoed | **withdrawn** (t6, withdrawn-hazard-window-closed) | ops-warden | open | instant (0) | **due** |
|
| [RISK-F-0002](findings/RISK-F-0002-ops-warden-sign-ungated.md) | ops-warden signs SSH certificates with no authorization decision, and its unblock is now unsafe | ops-warden | medium | embargoed | **withdrawn** (t6, withdrawn-hazard-window-closed) | ops-warden | open | instant (0) | **due** |
|
||||||
| [RISK-F-0001](findings/RISK-F-0001-flex-auth-unauthenticated-check.md) | flex-auth /v1/check authenticates no caller | flex-auth | **high** | public | **withdrawn** (t1, withdrawn-before-sending) | flex-auth | fixed | instant (0) | **due** |
|
| [RISK-F-0001](findings/RISK-F-0001-flex-auth-unauthenticated-check.md) | flex-auth /v1/check authenticates no caller | flex-auth | **high** | public | **withdrawn** (t1, withdrawn-before-sending) | flex-auth | fixed | instant (0) | **due** |
|
||||||
|
|
||||||
|
|
|
||||||
60
findings/RISK-F-0010-embedded-backup-webdav-credential.md
Normal file
60
findings/RISK-F-0010-embedded-backup-webdav-credential.md
Normal file
|
|
@ -0,0 +1,60 @@
|
||||||
|
---
|
||||||
|
id: RISK-F-0010
|
||||||
|
type: finding
|
||||||
|
title: "Forgejo backup source embeds a WebDAV credential default"
|
||||||
|
status: open
|
||||||
|
reported_by: railiance-platform
|
||||||
|
reported_via: railiance-platform
|
||||||
|
date_reported: "2026-08-23"
|
||||||
|
system: railiance-platform
|
||||||
|
environment: production
|
||||||
|
fix_owner: railiance-platform
|
||||||
|
fix_tracking: unset
|
||||||
|
---
|
||||||
|
|
||||||
|
# RISK-F-0010 — Forgejo backup source embeds a WebDAV credential default
|
||||||
|
|
||||||
|
## What is true, as reported
|
||||||
|
|
||||||
|
`railiance-platform/tools/cmd/forgejo-backup` line 13 assigns a literal default
|
||||||
|
to `RAILIANCE_BACKUP_NC_TOKEN`. The credential value is deliberately omitted
|
||||||
|
from this finding, along with any fingerprint, length, or copy.
|
||||||
|
|
||||||
|
The literal is in repository history and can be recovered by anyone with access
|
||||||
|
to affected clones or history. It was also surfaced in captured agent command
|
||||||
|
output during an attended review on 2026-08-23, which expands the set of places
|
||||||
|
that must be treated as potentially exposed.
|
||||||
|
|
||||||
|
The value was not used in that operation and its current validity was not
|
||||||
|
tested. The configured Nextcloud endpoint was independently observed to be a
|
||||||
|
write-only file drop: metadata listing and reads were denied while the approved
|
||||||
|
OpenBao-sourced credential could upload ciphertext. Therefore, the established
|
||||||
|
risk is an embedded credential and possible unauthorized write or storage
|
||||||
|
injection if it remains live; read access to existing backups is not
|
||||||
|
established. The age recovery private key is separate and was not found in the
|
||||||
|
script.
|
||||||
|
|
||||||
|
## How it was found
|
||||||
|
|
||||||
|
Found by source inspection while selecting the approved encrypted off-host
|
||||||
|
snapshot lane for preparation-only scenario
|
||||||
|
`WARDEN-WP-0027-T02-DRILL-20260822-01`. No attempt was made to authenticate
|
||||||
|
with or probe the embedded value.
|
||||||
|
|
||||||
|
## Suggested direction
|
||||||
|
|
||||||
|
Suggestion, owned by `railiance-platform`:
|
||||||
|
|
||||||
|
1. Revoke and regenerate the Nextcloud file-drop credential at the provider.
|
||||||
|
2. Write the replacement only to the governed OpenBao lane
|
||||||
|
`platform/workloads/railiance/backup/offsite-lane` through a mode-0600 input
|
||||||
|
file, then securely remove the input.
|
||||||
|
3. Remove the source-code default so backup execution fails closed unless the
|
||||||
|
value arrives through OpenBao or an explicit sanctioned environment.
|
||||||
|
4. Review reachable Git history, CI and agent logs, and clones under the
|
||||||
|
applicable retention policy; do not reproduce the credential while doing so.
|
||||||
|
5. Verify a ciphertext upload and restore after rotation, then clear any
|
||||||
|
exposure taint only with evidence.
|
||||||
|
|
||||||
|
Risk Nexus owns severity, disclosure, escalation, and review cadence. This
|
||||||
|
report intentionally does not assign them.
|
||||||
Loading…
Add table
Add a link
Reference in a new issue