# Security Policy ## Supported Versions | Version | Supported | |---------|-----------| | 2.1.x | ✅ Active | | 2.0.x | ✅ Security fixes | | 1.x | ❌ End of life | | 0.x | ❌ End of life | ## Reporting a Vulnerability If you discover a security vulnerability in PgClone, please report it responsibly: 1. **Do not** open a public GitHub issue for security vulnerabilities 2. Email the maintainer directly or use GitHub's private vulnerability reporting feature 3. Include a clear description of the vulnerability and steps to reproduce We will acknowledge your report within 48 hours and provide a timeline for a fix. ## Security Considerations PgClone operates with **superuser** privileges and handles database connections. Users should be aware of the following: ### Connection Strings Connection strings passed to pgclone functions may contain passwords in plaintext. To avoid exposing credentials: - Use `.pgpass` files or the `PGPASSFILE` environment variable instead of inline passwords - Restrict access to pgclone functions to trusted users only - Avoid logging connection strings in application logs ### SQL Injection — WHERE Clause The `"where"` option in JSON parameters is passed directly to SQL queries on the **source** database. This is by design for flexibility, but means: - Only use `WHERE` filters with trusted input - Do not pass user-supplied strings directly into the `"where"` option - A future version (v2.2.1) will add read-only transaction wrapping for additional protection ### Network Security pgclone connects to remote PostgreSQL instances using `libpq`. Ensure: - Firewall rules restrict which hosts can be reached - Use SSL connections where possible (`sslmode=require` in connection strings) - Source databases should grant minimal required privileges (read-only access is sufficient for cloning) ### Shared Memory Async job state is stored in PostgreSQL shared memory. Job metadata (schema names, table names, progress) is visible to all database users who can call `pgclone_progress()` or query `pgclone_jobs_view`. This is expected behavior but should be considered in multi-tenant environments.