docs/specs/fapp-security.md: - Full threat model for patient protection - 3-level verification roadmap (transparency → endorsements → registry) - UI warning mockups - Technical implementation plan - Honest assessment of limitations SlotAnnounce changes: - Added profile_url field for therapist verification - New with_profile() constructor - profile_url included in signature docs/specs/fapp-protocol.md: - Added Security & Anti-Fraud section - Link to full security spec
7.3 KiB
FAPP Security Model — Protecting Patients from Fraud
Threat Model
Who are we protecting?
Patients seeking psychotherapy are in a vulnerable state. They may be:
- Desperate after months of searching
- Unfamiliar with the healthcare system
- Willing to pay out-of-pocket if GKV slots are scarce
- Trusting of anyone who appears professional
What are the threats?
| Threat | Description | Severity |
|---|---|---|
| Fake Therapist | Attacker poses as licensed therapist, collects patient data | CRITICAL |
| Phishing | Fake slots lead to malicious contact forms | HIGH |
| Financial Fraud | "Therapist" demands upfront payment | HIGH |
| Data Harvesting | Collect patient health queries for profiling | MEDIUM |
| Spam Flooding | Overwhelm mesh with fake announces | MEDIUM |
| Impersonation | Clone a real therapist's identity | CRITICAL |
Current Protections (v1)
| Protection | Mechanism | Weakness |
|---|---|---|
| Approbation Hash | SHA-256 of credential number | Cannot be verified — attacker can invent hash |
| Ed25519 Signature | Proves control of mesh key | Doesn't prove real-world identity |
| Sequence Dedup | Prevents replay | Doesn't prevent new fake announces |
| Rate Limiting | Max announces/hour | Attacker can use multiple keys |
Honest assessment: Current protections prevent spam but do not prevent fraud.
Proposed Security Enhancements
Level 1: Transparency (Low Trust, No Verification)
Concept: Make it easy for patients to verify therapists themselves.
-
Therapist Profile URL
- SlotAnnounce includes optional
profile_url: String - Points to therapist's website, Jameda profile, or KV listing
- Patient can cross-check before booking
- SlotAnnounce includes optional
-
Approbation Display
- Show first 4 digits of Approbation hash in UI
- Patient can ask therapist to confirm during Erstgespräch
- Social verification, not cryptographic
-
Warning Labels
- UI shows "Unverified Therapist" prominently
- Patient must acknowledge risk before reserving
Implementation: ~2 days, no infrastructure changes.
Level 2: Web-of-Trust (Medium Trust)
Concept: Trusted nodes vouch for therapists.
-
Endorsement Messages
- Trusted relays (e.g., run by patient advocacy groups) sign endorsements
TherapistEndorsement { therapist_address, endorser_signature, reason }- Patients can filter by "endorsed by [Patientenberatung]"
-
Reputation Scores
- After appointments, patients can rate (anonymously)
- Aggregate scores propagate through mesh
- New therapists start with "No ratings yet"
-
Blocklists
- Community-maintained blocklists of known fraudsters
- Relay nodes can subscribe and filter
Implementation: ~2 weeks, requires gossip protocol for endorsements.
Level 3: Registry Integration (High Trust)
Concept: Verify against official sources.
-
KV-Registry Lookup
- Germany: KBV Arztsuche API (https://www.kbv.de/html/arztsuche.php)
- Therapist provides Lebenslange Arztnummer (LANR) or BSNR
- Gateway node queries registry, signs attestation
-
eHBA Integration (long-term)
- Electronic Health Professional Card
- Therapist proves identity via qualified electronic signature
- Strongest guarantee, but requires card reader
-
Chamber Verification
- Psychotherapeutenkammer publishes member lists
- Automated scraping + attestation (legally gray)
Implementation: 1-2 months, requires trusted gateway infrastructure.
Recommended Roadmap
Phase 1: Ship with Warnings (Now)
┌─────────────────────────────────────────────────┐
│ ⚠️ UNVERIFIED THERAPIST │
│ │
│ This therapist has not been verified. │
│ Before booking: │
│ • Check their website or Jameda profile │
│ • Verify Approbation during first contact │
│ • Never pay upfront without meeting │
│ │
│ [I understand the risks] [Cancel] │
└─────────────────────────────────────────────────┘
- Add
profile_urlfield to SlotAnnounce - Prominent warnings in UI
- Educational content about verification
Phase 2: Endorsements (Q2 2026)
- Partner with 2-3 patient advocacy groups
- They run relay nodes with endorsement capability
- "Endorsed by Unabhängige Patientenberatung" badge
Phase 3: Registry (Q4 2026)
- Build KBV gateway (if API access granted)
- Or: manual verification service (humans check credentials)
- Verified badge with expiry
Technical Implementation
SlotAnnounce v2
pub struct SlotAnnounce {
// ... existing fields ...
/// Optional URL to therapist's public profile (Jameda, website, KV listing).
pub profile_url: Option<String>,
/// Optional LANR (Lebenslange Arztnummer) for registry lookup.
pub lanr: Option<String>,
/// Verification level (0 = none, 1 = endorsed, 2 = registry-verified).
pub verification_level: u8,
/// Endorsement signatures from trusted nodes.
pub endorsements: Vec<Endorsement>,
}
pub struct Endorsement {
/// Address of the endorsing node.
pub endorser_address: [u8; 16],
/// Ed25519 signature over (therapist_address, timestamp).
pub signature: [u8; 64],
/// Unix timestamp of endorsement.
pub timestamp: u64,
/// Human-readable reason.
pub reason: String,
}
Patient-Side Verification Flow
1. Patient receives SlotAnnounce
2. UI shows verification_level:
- 0: "⚠️ Unverified" (red)
- 1: "✓ Endorsed by [name]" (yellow)
- 2: "✓✓ Registry Verified" (green)
3. Patient can click to see:
- Profile URL
- Endorsement details
- Verification expiry
4. Before SlotReserve, patient confirms risk acknowledgment
What We Cannot Prevent
Even with Level 3 verification:
- Licensed but Unethical Therapist — Credential is real, behavior is not
- Session Quality — Verification proves license, not competence
- Availability Lies — Therapist might not actually have slots
- Price Gouging — "Selbstzahler" with inflated rates
These require reputation systems and patient reviews — can't be solved cryptographically.
Comparison to Existing Systems
| System | Verification | Privacy | Decentralized |
|---|---|---|---|
| Doctolib | KV registry | Low (tracks searches) | No |
| Jameda | None (self-reported) | Low | No |
| KBV Arztsuche | Official | Medium | No |
| FAPP v1 | None | High | Yes |
| FAPP + Level 2 | Endorsements | High | Yes |
| FAPP + Level 3 | Registry | High | Mostly |
Conclusion
FAPP's strength is patient privacy. We should not sacrifice that for centralized verification.
Recommended approach:
- Ship with strong warnings and profile URLs (transparency)
- Build endorsement network (web-of-trust)
- Add optional registry verification for therapists who want it
- Let patients choose their trust level
The mesh provides the infrastructure. Trust is a social problem that requires social solutions.