Files
bookhoard/SECURITY_SUMMARY.md
T
john-okeefe 420af7978a fix: critical security vulnerabilities
- Fix type assertion panics in auth.go (9 handlers)
  * GetProfile, UpdateProfile, UpdateTheme, UpdateUsername
  * UpdateEmail, UpdatePassword, DeleteAccount
  * UpdateScanSettings, GetScanSettings, Register admin check
  * Replace c.Get("user_id").(string) with MustGetAuthenticatedUser()

- Fix type assertion panic in library.go
  * GetUserVisibleLibraries now uses MustGetAuthenticatedUser()

- Add path traversal protection to AddLibraryFolder
  * Detect and block ".." in paths
  * Clean paths with filepath.Clean()
  * Verify path is a directory before adding

- Remove debug logging from Login handler
  * Removed all fmt.Printf statements
  * No more plaintext password logging

- Create safe context helper functions
  * internal/handlers/context.go added
  * GetAuthenticatedUser() for safe retrieval
  * MustGetAuthenticatedUser() for post-auth middleware

Security: Critical
Tests: All 62 integration tests pass
Breaking: None - backward compatible
2026-01-30 08:58:43 -05:00

4.2 KiB

API Security Hardening Summary

Status: Ready for Review

All integration tests currently pass . The API is functional but has security vulnerabilities that should be addressed.

What I Found

I conducted a comprehensive security audit of your API and created the following deliverables:

1. SECURITY_AUDIT.md - Detailed Findings

  • 13 critical vulnerabilities identified
  • 8 moderate vulnerabilities identified
  • Complete code examples of issues
  • Recommended fixes with code samples

2. internal/handlers/context.go - Safe Helper Functions

  • Created GetAuthenticatedUser() - safe type assertion helper
  • Created MustGetAuthenticatedUser() - for post-auth middleware
  • Prevents type assertion panics

Key Security Issues

🔴 CRITICAL - Type Assertion Panics

Impact: Server crash/Denial of Service Files: auth.go (10x), ebook.go (14x), library.go (1x)

Your middleware sets:

c.Set("user", database.Users{...})

But many handlers use:

userID := c.Get("user_id").(string) // ❌ WRONG - Can panic!

Should be:

user := c.Get("user").(database.Users) // ✅ CORRECT

🔴 CRITICAL - Path Traversal

Impact: Unauthorized file system access File: library.go:183

The AddLibraryFolder endpoint doesn't validate paths:

{"folder_path": "../../../etc/passwd"} // ❌ This works!

🟡 MODERATE - Debug Logging

Impact: Passwords logged in plaintext File: auth.go:289-290

fmt.Printf("password: %s\n", c.FormValue("password")) // ❌ Don't log passwords!

Why Tests Still Pass

The current code works because:

  1. The middleware correctly sets both user and user_id
  2. Integration tests use valid authentication
  3. No one is intentionally triggering panic scenarios

But production could fail if:

  • JWT tokens are malformed
  • Middleware configuration changes
  • Attackers send malformed requests
  • Race conditions in concurrent requests

Phase 1: Critical Fixes (Do Now)

  1. Use the new GetAuthenticatedUser() helper in auth.go
  2. Add path traversal protection to library.go
  3. Remove debug logging from auth.go
  4. Run tests after each fix

Phase 2: Context Type Standardization (Next Week)

  1. Update all ebook.go handlers to use helper
  2. Update library.go GetUserVisibleLibraries
  3. Remove all c.Get("user_id") references

Phase 3: Hardening (Future)

  1. Add HTML sanitization for user content
  2. Implement rate limiting on all endpoints
  3. Add security headers middleware
  4. Implement CSRF protection

Files Modified

✅ Created: SECURITY_AUDIT.md (comprehensive security report)
✅ Created: internal/handlers/context.go (safe helper functions)
⏸️  Ready: Fix implementation (requires systematic refactoring)

How to Proceed

Option A: Gradual Migration (Recommended)

# Fix one handler at a time, test after each change
git checkout -b security-fixes
# Apply fixes incrementally
# Run: go test -v ./cmd/server/tests -run TestIntegrationAPI
# Commit when tests pass

Option B: Batch Fix (Faster but Riskier)

# Use search/replace with careful validation
# Fix all auth.go handlers in one PR
# Fix all ebook.go handlers in second PR

Testing Strategy

Before applying any fix:

# Baseline test - should all pass
go test -v ./cmd/server/tests -run TestIntegrationAPI

# After each fix, verify:
1. Same tests still pass
2. No new compilation errors
3. No runtime panics

Security Checklist

  • Security audit completed
  • Helper functions created
  • Documentation written
  • Type assertion panics fixed
  • Path traversal protected
  • Debug logging removed
  • All handlers use safe helpers
  • Integration tests updated
  • Penetration testing conducted

References

  • SECURITY_AUDIT.md - Full technical details
  • API_TESTING_SUMMARY.md - Previous bug fix session
  • internal/handlers/context.go - Safe helper implementation

Next Step: Review SECURITY_AUDIT.md and decide on fix approach (gradual vs batch).

All integration tests currently pass - no functionality is broken. The issues are potential vulnerabilities that haven't been exploited yet, but should be fixed before production deployment.