545 lines
17 KiB
Markdown
545 lines
17 KiB
Markdown
# Bug Bounty Platform
|
|
|
|
A production-ready, enterprise-grade bug bounty platform built with modern web technologies. This platform enables companies to run coordinated vulnerability disclosure programs, allowing security researchers to submit findings and receive rewards.
|
|
|
|
**Live Demo:** [bugbounty.carterperez-dev.com](https://bugbounty.carterperez-dev.com)
|
|
**API Documentation:** [bugbounty.carterperez-dev.com/api/docs](https://bugbounty.carterperez-dev.com/api/docs)
|
|
|
|
---
|
|
|
|
## Overview
|
|
|
|
This project demonstrates enterprise-level software architecture with:
|
|
- Async-first FastAPI backend with strict type safety
|
|
- Modern React frontend with TypeScript
|
|
- Production-ready security (JWT with refresh token rotation, Argon2id hashing)
|
|
- Advanced design patterns (Dependency Injection, Repository Pattern, Layered Architecture)
|
|
- Docker containerization with multi-stage builds
|
|
- Database migrations with Alembic
|
|
- Comprehensive testing and linting infrastructure
|
|
|
|
**Part of:** [Cybersecurity-Projects Repository](https://github.com/CarterPerez-dev/Cybersecurity-Projects) (60+ security-focused projects)
|
|
|
|
---
|
|
|
|
## Features
|
|
|
|
### Security Researcher Features
|
|
- User registration and authentication
|
|
- Browse public bug bounty programs
|
|
- Submit vulnerability reports with markdown support
|
|
- Track report status and receive updates
|
|
- Earn reputation and rewards
|
|
|
|
### Company Features
|
|
- Create and manage bug bounty programs
|
|
- Define program scope (assets, reward tiers, SLA)
|
|
- Triage incoming vulnerability reports
|
|
- Assess severity using CVSS scoring
|
|
- Award bounties to researchers
|
|
- Communicate via comments and attachments
|
|
|
|
### Platform Features
|
|
- Role-based access control (Researcher, Company, Admin)
|
|
- JWT authentication with refresh token rotation
|
|
- Token versioning for instant session invalidation
|
|
- Multi-device session management
|
|
- Rate limiting on all endpoints
|
|
- Comprehensive audit logging
|
|
- OpenAPI/Swagger documentation
|
|
|
|
---
|
|
|
|
## Tech Stack
|
|
|
|
### Backend
|
|
- **FastAPI** 0.123.0+ - Modern async Python web framework
|
|
- **Python** 3.12+ - Strict typing with mypy
|
|
- **PostgreSQL** 18 - Primary database with asyncpg driver
|
|
- **Redis** 7 - Caching and session storage
|
|
- **SQLAlchemy** 2.0+ - Async ORM
|
|
- **Alembic** - Database migrations
|
|
- **Pydantic** v2 - Data validation and settings
|
|
- **JWT** - Token-based authentication with rotation
|
|
- **Argon2id** - Password hashing via pwdlib
|
|
|
|
### Frontend
|
|
- **React** 19.2+ - UI library
|
|
- **TypeScript** 5.9 - Static typing
|
|
- **Vite** 7 - Build tool with Rolldown
|
|
- **React Router** 7.1 - File-based routing
|
|
- **TanStack Query** v5 - Server state management
|
|
- **Zustand** - Client state management
|
|
- **Axios** - HTTP client
|
|
- **SASS** - CSS preprocessing
|
|
|
|
### Infrastructure
|
|
- **Docker** + **Docker Compose** - Containerization
|
|
- **Nginx** - Reverse proxy and static file serving
|
|
- **Cloudflare Tunnel** - Zero-config deployment (optional)
|
|
- **Gunicorn** + **Uvicorn** - Production ASGI server
|
|
|
|
### Development Tools
|
|
- **Ruff** - Python linting and formatting
|
|
- **Biome** - JavaScript/TypeScript linting
|
|
- **MyPy** - Static type checking
|
|
- **Pytest** - Testing framework
|
|
- **Just** - Task runner (30+ commands)
|
|
- **Pre-commit hooks** - Automated quality checks
|
|
|
|
---
|
|
|
|
## Getting Started
|
|
|
|
You have two options:
|
|
|
|
### Option 1: Use the Live API (Easiest)
|
|
|
|
The platform is already deployed and running! You can:
|
|
- Use the web interface: [bugbounty.carterperez-dev.com](https://bugbounty.carterperez-dev.com)
|
|
- Access the API directly: [bugbounty.carterperez-dev.com/api/](https://bugbounty.carterperez-dev.com/api/)
|
|
- View API documentation: [bugbounty.carterperez-dev.com/api/docs](https://bugbounty.carterperez-dev.com/api/docs)
|
|
|
|
You can build your own client application using the deployed API endpoints. See the OpenAPI documentation for available endpoints and schemas.
|
|
|
|
### Option 2: Run It Yourself
|
|
|
|
If you want to run the entire platform locally or deploy your own instance:
|
|
|
|
#### Prerequisites
|
|
- [Docker](https://docs.docker.com/get-docker/) and [Docker Compose](https://docs.docker.com/compose/install/)
|
|
- [Just](https://github.com/casey/just) (task runner) - `cargo install just` or see [installation guide](https://github.com/casey/just#installation)
|
|
- Git
|
|
|
|
#### Quick Start
|
|
|
|
1. **Clone the repository:**
|
|
```bash
|
|
git clone https://github.com/CarterPerez-dev/Cybersecurity-Projects.git
|
|
cd Cybersecurity-Projects/PROJECTS/bug-bounty-platform
|
|
```
|
|
|
|
2. **Configure environment variables:**
|
|
```bash
|
|
cp .env.example .env
|
|
```
|
|
|
|
Edit `.env` and update these critical values:
|
|
- `SECRET_KEY` - Generate a secure random string (minimum 32 characters)
|
|
- `POSTGRES_PASSWORD` - Set a strong database password
|
|
- `ADMIN_EMAIL` - (Optional) First user with this email becomes admin
|
|
- `CORS_ORIGINS` - Update if using different ports
|
|
|
|
3. **Start the platform (development mode with hot reload):**
|
|
```bash
|
|
just dev-up
|
|
```
|
|
|
|
Or in production mode:
|
|
```bash
|
|
just up
|
|
```
|
|
|
|
4. **Access the platform:**
|
|
- **Frontend:** http://localhost:8420
|
|
- **API:** http://localhost:8420/api
|
|
- **API Docs:** http://localhost:8420/api/docs
|
|
- **Backend (direct):** http://localhost:5420
|
|
- **Frontend Dev Server:** http://localhost:3420 (dev mode only)
|
|
|
|
5. **Apply database migrations:**
|
|
```bash
|
|
just migrate head
|
|
```
|
|
|
|
6. **Create your first account:**
|
|
- Navigate to http://localhost:8420
|
|
- Click "Register"
|
|
- If you set `ADMIN_EMAIL` in `.env`, registering with that email grants admin privileges
|
|
|
|
#### Common Commands
|
|
|
|
The `justfile` provides 30+ commands for development:
|
|
|
|
```bash
|
|
just # List all available commands
|
|
|
|
# Development
|
|
just dev-up # Start in development mode (hot reload)
|
|
just dev-down # Stop development containers
|
|
just dev-logs backend # View backend logs
|
|
just dev-shell backend # Open shell in backend container
|
|
|
|
# Production
|
|
just up # Start in production mode
|
|
just down # Stop production containers
|
|
just build # Build all containers
|
|
just rebuild # Rebuild without cache
|
|
|
|
# Database
|
|
just migrate head # Apply all migrations
|
|
just migration "message" # Create new migration
|
|
just rollback # Rollback last migration
|
|
just db-current # Show current migration
|
|
|
|
# Linting & Type Checking
|
|
just lint # Run ruff + pylint
|
|
just ruff-fix # Auto-fix linting issues
|
|
just mypy # Type check with mypy
|
|
just biome-fix # Fix frontend linting issues
|
|
just typecheck # Run all type checks
|
|
|
|
# Testing
|
|
just test # Run all tests
|
|
just test-cov # Run tests with coverage report
|
|
|
|
# CI
|
|
just ci # Run full CI pipeline (lint + typecheck + test)
|
|
```
|
|
|
|
#### Project Structure
|
|
|
|
```
|
|
bug-bounty-platform/
|
|
├── backend/ # FastAPI backend (~7,000 lines)
|
|
│ ├── src/
|
|
│ │ ├── app/
|
|
│ │ │ ├── core/ # Base classes, database, security, constants and enums, etc.
|
|
│ │ │ ├── user/ # User domain
|
|
│ │ │ ├── auth/ # Authentication
|
|
│ │ │ ├── program/ # Bug bounty programs
|
|
│ │ │ ├── report/ # Vulnerability reports
|
|
│ │ │ └── admin/ # Admin functionality
|
|
│ │ └── config.py # configuration values
|
|
│ │ └── factory.py # essentially the 'main.py' file
|
|
│ │ └── __main__.py # Where the run command lives
|
|
│ ├── alembic/ # Database migrations
|
|
│ ├── tests/ # Unit and integration tests
|
|
│ └── pyproject.toml # Python dependencies
|
|
│
|
|
├── frontend/ # React + TypeScript frontend
|
|
│ ├── src/
|
|
│ │ ├── routes/ # Pages
|
|
│ │ ├── api/ # API client and hooks
|
|
│ │ ├── components/ # Reusable components
|
|
│ │ ├── styles/ # SCSS global values
|
|
│ │ └── core/ # App configuration, zustand stores (ui state management), api configuration
|
|
│ └── package.json
|
|
│
|
|
├── infra/ # Docker and Nginx configs
|
|
│ ├── nginx/
|
|
│ └── docker/
|
|
│
|
|
├── learn/ # Educational documentation (see below)
|
|
├── compose.yml # Production Docker Compose
|
|
├── dev.compose.yml # Development Docker Compose
|
|
├── justfile # Task runner commands
|
|
└── .env.example # Environment variables template
|
|
```
|
|
|
|
---
|
|
|
|
## Configuration
|
|
|
|
### Environment Variables
|
|
|
|
All configuration is done via `.env` file. Key variables:
|
|
|
|
| Variable | Description | Default |
|
|
|----------|-------------|---------|
|
|
| `NGINX_HOST_PORT` | External port for Nginx | 8420 |
|
|
| `BACKEND_HOST_PORT` | External port for backend API | 5420 |
|
|
| `FRONTEND_HOST_PORT` | External port for frontend dev server | 3420 |
|
|
| `POSTGRES_HOST_PORT` | External port for PostgreSQL | 4420 |
|
|
| `REDIS_HOST_PORT` | External port for Redis | 6420 |
|
|
| `SECRET_KEY` | JWT signing key (min 32 chars) | **MUST CHANGE** |
|
|
| `POSTGRES_PASSWORD` | Database password | **MUST CHANGE** |
|
|
| `ADMIN_EMAIL` | Auto-promote this email to admin | (empty) |
|
|
| `ENVIRONMENT` | dev/staging/production | development |
|
|
| `ACCESS_TOKEN_EXPIRE_MINUTES` | JWT access token lifetime | 15 |
|
|
| `REFRESH_TOKEN_EXPIRE_DAYS` | Refresh token lifetime | 7 |
|
|
| `CORS_ORIGINS` | Allowed origins for CORS | `["*"]` (all origins) |
|
|
|
|
See `.env.example` for all available options.
|
|
|
|
### Port Configuration
|
|
|
|
If the default ports conflict with other services, update these in `.env`:
|
|
|
|
```bash
|
|
NGINX_HOST_PORT=8420 # Change to any available port
|
|
BACKEND_HOST_PORT=5420 # Change to any available port
|
|
FRONTEND_HOST_PORT=3420 # Change to any available port
|
|
POSTGRES_HOST_PORT=4420 # Change to any available port
|
|
REDIS_HOST_PORT=6420 # Change to any available port
|
|
```
|
|
|
|
### CORS Configuration
|
|
|
|
The API is configured to accept requests from **all origins** by default:
|
|
|
|
```bash
|
|
CORS_ORIGINS=["*"] # Allows all origins (public API)
|
|
```
|
|
|
|
If you need to restrict access to specific origins:
|
|
|
|
```bash
|
|
CORS_ORIGINS=["https://yourdomain.com","https://app.yourdomain.com"]
|
|
```
|
|
|
|
---
|
|
|
|
## Deployment
|
|
|
|
### Option 1: Cloudflare Tunnel (Recommended for beginners)
|
|
|
|
No port forwarding or reverse proxy configuration needed!
|
|
|
|
1. Create a Cloudflare account and add your domain
|
|
2. Go to Zero Trust Dashboard > Access > Tunnels
|
|
3. Create a new tunnel, name it, and copy the token
|
|
4. Add the token to `.env`:
|
|
```bash
|
|
CLOUDFLARE_TUNNEL_TOKEN=your-token-here
|
|
```
|
|
5. Configure public hostname in Cloudflare:
|
|
- Public hostname: `yourdomain.com`
|
|
- Service: `http://nginx:80`
|
|
6. Start the platform:
|
|
```bash
|
|
just up
|
|
```
|
|
|
|
Your platform is now live at `https://yourdomain.com`!
|
|
|
|
### Option 2: Traditional Hosting (VPS)
|
|
|
|
1. Rent a VPS (DigitalOcean, AWS, Linode, etc.)
|
|
2. Install Docker and Docker Compose
|
|
3. Clone the repository and configure `.env`
|
|
4. Point your domain's A record to your VPS IP
|
|
5. Configure SSL (Let's Encrypt with Certbot)
|
|
6. Start the platform:
|
|
```bash
|
|
just up
|
|
```
|
|
|
|
### Option 3: Use the Existing Deployment
|
|
|
|
Just use the API at `bugbounty.carterperez-dev.com/api/` - no deployment needed!
|
|
|
|
---
|
|
|
|
## Learning Resources
|
|
|
|
This project includes comprehensive educational documentation in the `learn/` directory:
|
|
|
|
- **[ARCHITECTURE.md](learn/ARCHITECTURE.md)** - Deep dive into system architecture and design decisions
|
|
- **[PATTERNS.md](learn/PATTERNS.md)** - Explanation of design patterns used (DI, Repository, etc.)
|
|
- **[GETTING-STARTED.md](learn/GETTING-STARTED.md)** - Step-by-step tutorial for building similar applications
|
|
- **[DATABASE.md](learn/DATABASE.md)** - Database schema design and migration strategies
|
|
- **[SECURITY.md](learn/SECURITY.md)** - Security features and best practices explained
|
|
|
|
These documents are designed to help you understand not just *what* the code does, but *why* it's architected this way and *how* you can apply these patterns to your own projects.
|
|
|
|
---
|
|
|
|
## API Documentation
|
|
|
|
### Interactive Documentation
|
|
|
|
When running locally, access interactive API docs at:
|
|
- **Swagger UI:** http://localhost:8420/api/docs
|
|
- **ReDoc:** http://localhost:8420/api/redoc
|
|
|
|
For the live deployment:
|
|
- **Swagger UI:** [bugbounty.carterperez-dev.com/api/docs](https://bugbounty.carterperez-dev.com/api/docs)
|
|
|
|
### Key Endpoints
|
|
|
|
**Authentication:**
|
|
- `POST /api/v1/auth/register` - Create new account
|
|
- `POST /api/v1/auth/login` - Login (returns access + refresh tokens)
|
|
- `POST /api/v1/auth/refresh` - Refresh access token
|
|
- `POST /api/v1/auth/logout` - Logout (invalidates refresh token)
|
|
- `POST /api/v1/auth/logout-all` - Logout from all devices
|
|
|
|
**Users:**
|
|
- `GET /api/v1/users/me` - Get current user profile
|
|
- `PATCH /api/v1/users/me` - Update profile
|
|
- `GET /api/v1/users/{id}` - Get public user profile
|
|
|
|
**Programs:**
|
|
- `GET /api/v1/programs` - List all programs (paginated)
|
|
- `GET /api/v1/programs/{slug}` - Get program details
|
|
- `POST /api/v1/programs` - Create program (company only)
|
|
- `PATCH /api/v1/programs/{slug}` - Update program (owner only)
|
|
- `DELETE /api/v1/programs/{slug}` - Delete program (owner only)
|
|
|
|
**Reports:**
|
|
- `GET /api/v1/reports` - List your reports
|
|
- `GET /api/v1/reports/{id}` - Get report details
|
|
- `POST /api/v1/reports` - Submit vulnerability report
|
|
- `PATCH /api/v1/reports/{id}` - Update report (various endpoints for status changes)
|
|
|
|
**Admin:**
|
|
- `GET /api/v1/admin/stats` - Platform statistics
|
|
- `GET /api/v1/admin/users` - Manage users
|
|
- `GET /api/v1/admin/programs` - Manage programs
|
|
- `GET /api/v1/admin/reports` - Manage reports
|
|
|
|
All endpoints return JSON and use standard HTTP status codes.
|
|
|
|
---
|
|
|
|
## Development
|
|
|
|
### Running Tests
|
|
|
|
```bash
|
|
just test # Run all tests
|
|
just test-cov # Run with coverage report
|
|
```
|
|
|
|
### Type Checking
|
|
|
|
```bash
|
|
just mypy # Check backend types
|
|
just tsc # Check frontend types
|
|
just typecheck # Check all types
|
|
```
|
|
|
|
### Linting
|
|
|
|
```bash
|
|
just lint # Backend: ruff + pylint
|
|
just ruff-fix # Auto-fix backend linting issues
|
|
just biome-fix # Auto-fix frontend linting issues
|
|
just stylelint-fix # Auto-fix SCSS linting issues
|
|
```
|
|
|
|
### Database Migrations
|
|
|
|
```bash
|
|
just migration "Add user reputation field" # Create new migration
|
|
just migrate head # Apply all migrations
|
|
just rollback # Rollback last migration
|
|
just db-history # View migration history
|
|
```
|
|
|
|
### Docker Management
|
|
|
|
```bash
|
|
just dev-shell backend # Open shell in backend container
|
|
just dev-shell db # Open psql in database container
|
|
just dev-logs nginx # View nginx logs
|
|
just ps # List running containers
|
|
```
|
|
|
|
---
|
|
|
|
## Architecture Highlights
|
|
|
|
### Dependency Injection
|
|
|
|
FastAPI's dependency injection system is used extensively:
|
|
|
|
```python
|
|
from fastapi import Depends
|
|
from typing import Annotated
|
|
|
|
CurrentUser = Annotated[User, Depends(get_current_user)]
|
|
|
|
@router.get("/me")
|
|
async def get_me(user: CurrentUser) -> UserSchema:
|
|
return user
|
|
```
|
|
|
|
### Repository Pattern
|
|
|
|
All database operations go through repositories:
|
|
|
|
```python
|
|
class UserRepository(BaseRepository[User]):
|
|
async def find_by_email(self, email: str) -> User | None:
|
|
stmt = select(User).where(User.email == email)
|
|
result = await self.session.execute(stmt)
|
|
return result.scalar_one_or_none()
|
|
|
|
# Usage in service layer
|
|
async def authenticate_user(email: str, password: str) -> User:
|
|
user = await user_repo.find_by_email(email)
|
|
if not user or not verify_password(password, user.password_hash):
|
|
raise InvalidCredentialsError()
|
|
return user
|
|
```
|
|
|
|
### Type Safety
|
|
|
|
Strict type checking with mypy and TypeScript:
|
|
|
|
```python
|
|
from typing import Generic, TypeVar
|
|
|
|
ModelT = TypeVar("ModelT", bound=Base)
|
|
|
|
class BaseRepository(Generic[ModelT]):
|
|
def __init__(self, session: AsyncSession, model: type[ModelT]) -> None:
|
|
self.session = session
|
|
self.model = model
|
|
```
|
|
|
|
### Security
|
|
|
|
Multiple layers of security:
|
|
- JWT tokens with HS256 algorithm
|
|
- Token versioning (instant invalidation on password change)
|
|
- Refresh token rotation (prevents replay attacks)
|
|
- Argon2id password hashing
|
|
- Rate limiting (100 req/min default, 20 req/min for auth)
|
|
- CORS protection
|
|
- Input validation with Pydantic
|
|
|
|
See [learn/SECURITY.md](learn/SECURITY.md) for detailed explanations.
|
|
|
|
---
|
|
|
|
## Contributing
|
|
|
|
This is an educational project demonstrating production-level architecture. Feel free to:
|
|
- Fork the repository and build upon it
|
|
- Use it as a reference for your own projects
|
|
- Submit issues if you find bugs
|
|
- Share feedback and suggestions
|
|
|
|
---
|
|
|
|
## License
|
|
|
|
This project is part of the [Cybersecurity-Projects](https://github.com/CarterPerez-dev/Cybersecurity-Projects) repository.
|
|
|
|
© AngelaMos | 2026
|
|
|
|
---
|
|
|
|
## Links
|
|
|
|
- **Live Platform:** [bugbounty.carterperez-dev.com](https://bugbounty.carterperez-dev.com)
|
|
- **API Docs:** [bugbounty.carterperez-dev.com/api/docs](https://bugbounty.carterperez-dev.com/api/docs)
|
|
- **Parent Repository:** [Cybersecurity-Projects](https://github.com/CarterPerez-dev/Cybersecurity-Projects)
|
|
|
|
---
|
|
|
|
## Support
|
|
|
|
For questions, issues, or discussions:
|
|
1. Check the [learn/](learn/) directory for detailed documentation
|
|
2. Review the API documentation at `/api/docs`
|
|
3. Open an issue in the parent repository
|
|
4. Email: [contact information if applicable]
|
|
|
|
---
|
|
|
|
**Happy Hacking! 🔒**
|