Skip to content

Commit 5d37797

Browse files
committed
docs(threat-model): add insurance pool specific risk analysis
Resolves #562 Added comprehensive threat model section covering insurance pool-specific risks: - Premium Manipulation: Risk of admin-controlled premium rates without bounds - Claim Fraud & Moral Hazard: Potential for collusion between members and payers - Pool Drainage / Insolvency: Risk of insufficient reserves for claims Includes attack scenarios, current mitigations, residual risk assessment, and detailed recommendations for each threat (dynamic premium adjustment, claim prioritization, reserve requirements, stop-loss mechanisms, reinsurance options).
1 parent 84a1055 commit 5d37797

1 file changed

Lines changed: 116 additions & 0 deletions

File tree

docs/threat-model.md

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -531,6 +531,119 @@ Some token implementations allow partial transfers. If token transfers less than
531531

532532
---
533533

534+
### G. INSURANCE POOL SPECIFIC THREATS
535+
536+
#### G1. Premium Manipulation
537+
538+
**Description:**
539+
The insurance pool allows members to deposit premiums. If premium calculations are incorrect or the admin can manipulate premium rates, members may overpay or underfund the pool.
540+
541+
**Attack Scenario:**
542+
```
543+
1. Admin calls update_premium_rate() with inflated rate (e.g. 50% instead of 5%)
544+
2. Members attempting to enroll see high premium cost
545+
3. Members are priced out of insurance
546+
4. Pool remains underfunded or fills slowly
547+
5. When claims occur, pool cannot cover losses
548+
```
549+
550+
**Current Mitigation:**
551+
-**Configurable Parameters:** Premium rates are set via governance (admin-controlled)
552+
-**Public Events:** Premium rate changes emit events for monitoring
553+
-**Enrollment Validation:** Members must explicitly approve premium amounts
554+
555+
**Residual Risk:** ⚠️ **MEDIUM**
556+
- Admin can unilaterally set premium rates
557+
- No bounds checking on premium_rate_bps (could be set to 100%+ of pool coverage)
558+
- Members may not understand premium mechanics (off-chain communication required)
559+
- No automatic premium rate discovery mechanism (rates are hardcoded by admin)
560+
561+
**Recommendation:**
562+
- Add parameter bounds: `premium_rate_bps` should be capped at reasonable % (e.g., <= 1000 bps or 10%)
563+
- Document premium model and member communication (expected rates, annual yield)
564+
- Consider gradual premium increases (no step changes > 100 bps per update)
565+
- Monitor enrollment trends for drop-offs after rate increases
566+
567+
#### G2. Claim Fraud & Moral Hazard
568+
569+
**Description:**
570+
Members can submit claims on defaults. Without proper verification, a member could coordinate with a payer to fraudulently claim insurance (moral hazard attack).
571+
572+
**Attack Scenario:**
573+
```
574+
1. Member A and Payer B collude
575+
2. Member A submits invoice to Payer B (high amount, reasonable terms)
576+
3. Member A and Payer B stage a default (Payer B intentionally doesn't pay)
577+
4. Member A claims insurance for full invoice amount
578+
5. Pool pays out fraudulent claim
579+
6. Payer B and Member A split the payout off-chain
580+
```
581+
582+
**Current Mitigation:**
583+
-**Enrollment Verification:** Pool can verify member address and require KYC (off-chain)
584+
-**Invoice History:** Claims are tied to actual invoice_liquidity defaults (immutable on-chain)
585+
-**Admin Review:** Admin can investigate claims and contest fraud
586+
-**Payer Reputation:** Payers with low default history are less incentivized to stage defaults
587+
588+
**Residual Risk:** ⚠️ **HIGH**
589+
- No cryptographic proof of member legitimacy or payer creditworthiness
590+
- Admin review is manual and subjective
591+
- Repeated small defaults by same payer pair may not be detected
592+
- Pool does not validate that invoice terms are "reasonable" (collusion incentives opaque)
593+
594+
**Recommendation:**
595+
- **Implement Claims Adjudication:** Require admin or DAO multi-sig approval for large claims (> threshold)
596+
- **Fraud Detection:** Monitor for patterns:
597+
- Same member + same payer submitting multiple defaults in short window
598+
- Member submitting claims shortly after enrollment
599+
- Payer default rate >> average default rate in system
600+
- **Claim Dispute Window:** Allow community to dispute claims for X days before payout
601+
- **Proof of Loss:** Require evidence (invoice, evidence of payment attempt) off-chain
602+
- **KYC for High-Value Claims:** Require identity verification for claims > pool balance threshold
603+
604+
#### G3. Pool Drainage / Insolvency Risk
605+
606+
**Description:**
607+
The pool accepts claims up to enrolled capacity. If claim frequency exceeds projections, the pool may become insolvent and unable to cover all claims.
608+
609+
**Attack Scenario:**
610+
```
611+
1. Pool enrolls $10M in coverage with $1M premiums
612+
2. Unexpectedly high default rate in ILN network (10% vs expected 2%)
613+
3. Members submit $2M in claims in one week
614+
4. Pool only has $1M in premiums + interest ($100k) = $1.1M available
615+
5. Pool is insolvent; claims are partially paid or stuck in queue
616+
6. Later claims are rejected due to insufficient funds
617+
```
618+
619+
**Current Mitigation:**
620+
-**Capacity Tracking:** Pool tracks total coverage committed and premium collected
621+
-**Funding Mechanism:** Premiums accumulate in pool for payout reserves
622+
-**Admin Oversight:** Admin can pause claims or enroll new members if capacity is exceeded
623+
-**Transparent Reserves:** On-chain balance is queryable (members can check solvency)
624+
625+
**Residual Risk:** ⚠️ **HIGH**
626+
- No automatic trigger to halt enrollment if claims exceed safe reserves
627+
- Premium rates may be too low to cover expected default rates
628+
- Pool has no reinsurance mechanism (no capital backstop)
629+
- Economic incentives misaligned: member wants low premiums, pool needs high premiums for safety
630+
- No automatic claim rejection or payout reduction if pool depletes
631+
632+
**Recommendation:**
633+
- **Dynamic Premium Adjustment:** Link premium_rate_bps to pool utilization ratio:
634+
- If utilization > 80%, increase premiums 10-20% automatically
635+
- If utilization < 20%, decrease premiums to attract members
636+
- **Claim Prioritization:** Implement priority queue:
637+
- Small claims (<$10k) processed immediately
638+
- Large claims (>$100k) queued and processed over time
639+
- First-in-first-out or pro-rata payout if insolvent
640+
- **Insurance Reserve Requirement:** Admin must maintain minimum reserve (e.g., 50% of enrolled coverage)
641+
- **Stop-Loss Mechanism:** Auto-pause enrollment if reserves fall below threshold
642+
- **Reinsurance or Backstop:** Establish partnership with external insurer or maintain DAO treasury reserve
643+
- **Clear Communication:** Publish pool solvency ratio to members, warn if approaching danger zone
644+
645+
---
646+
534647
## Summary of Mitigations & Residual Risks
535648

536649
| Threat | Severity | Mitigation | Residual Risk |
@@ -548,6 +661,9 @@ Some token implementations allow partial transfers. If token transfers less than
548661
| **Token Transfer Failure** | MEDIUM | Atomic transactions | LOW (Soroban guarantees) |
549662
| **Token Allowance Missing** | LOW | Documentation, error handling | LOW (UX issue, not security) |
550663
| **Partial Token Transfer** | MEDIUM | Token specification, admin control | LOW-MEDIUM (requires rogue token) |
664+
| **Premium Manipulation** | MEDIUM | Configurable rates, public events | MEDIUM (no bounds checking) |
665+
| **Claim Fraud & Moral Hazard** | HIGH | Enrollment KYC, invoice immutability, admin review | HIGH (manual verification required) |
666+
| **Pool Drainage / Insolvency** | HIGH | Capacity tracking, transparent reserves | HIGH (no automatic safeguards) |
551667

552668
---
553669

0 commit comments

Comments
 (0)