Ghost FTP v0.95.40 — Fail-closed OS vault encrypted backup/restore (development preview)
Published predecessor: v0.95.39.
SEC-01 P0 changes
- Backup export now fails instead of skipping locked/unreadable OS keychain entries or credentials referenced by the SQLite manifest.
- Backup import rejects plaintext password/private-key passphrase profile metadata and duplicate credential targets.
- Import reads prior OS vault entries before writes and treats failed writes as errors; on partial failure it attempts rollback to previous values and reports if rollback fails.
- Credentials are committed to the OS keychain before the application stages profiles and SQLite state; vault failures cannot stage new restore state.
- Existing encrypted backup container format, connection profiles and database migrations remain unchanged.
QA acceptance (not a self-reported PASS)
- Rustfmt, Rust workspace compile/test, Clippy, and vault fault-injection regressions on exact final SHA.
- Frontend typecheck/production build, strict UI and dead-file contracts.
- FTP/FTPS/OpenSSH SFTP real test-server roundtrip.
- Windows/Linux installer lifecycle and Windows hardening.
- Android lint/emulator and macOS Preview compatibility.
- OS-level live vault (DPAPI/Credential Manager, Linux native keyring) backup and restore across availability changes.
- Test crash/power-loss interruption during staging and multiple-file restore, Windows ACLs, and physical Android storage.
Known boundaries
Rollback of several OS keychain writes is best-effort, not an atomic OS-vault transaction. Restore staging/renames are not yet a single crash-atomic database+metadata transaction. Old archives containing plaintext passwords must be explicitly migrated, not silently accepted. No production signing or full 75-screen visual certification is claimed.
This file describes a development candidate; it is not proof of a published version or production readiness.