security report · version 4 · November 1, 2026

Verifiable claims.

This is not a 'we're secure' marketing page but a set of verifiable claims (SR-N), each of which you can challenge in our bug bounty program for a reward.

01 · Access to your server

Access to your server

SR-1The root password is used once and not stored on our side.verified+

The password is needed only to open the first SSH connection and install a service user. It is passed as SSH authentication for our connection — not as a script argument or environment variable. Our database has no field for it; it does not enter script-run environments and is not written to logs (connection errors contain only the address and port, never the password). In memory it is wiped (best-effort) after use — that is defense in depth, not a guarantee: Go may keep copies of the value on the heap until garbage collection.

Honest caveat: this remains the root password on your server. After installation we disable password and root login over SSH, but we do not change the password itself — change it yourself if you wish. 'We don't store it' is true; 'it stopped being a secret' is not.

SR-2After installation, password and root SSH login are disabled.verified+

PasswordAuthentication no, PermitRootLogin no, SSH moved to a non-standard port (12011 by default), fail2ban enabled (a one-hour ban after 5 failures), login by key only. The public key is strictly validated before use: newlines (protection against slipping extra keys into authorized_keys) and syntactically invalid keys are rejected.

Anti-lockout: port 22 is not closed until the kernel confirms (via ss) that the new SSH port is actually listening; the config is checked with sshd -t and the sudo rule with visudo -cf, both rolled back on error.

SR-3The management key is stored only in encrypted form.verified+

The panel works not with your password but with a separate key (ed25519) that it generates itself. The private part sits in the database encrypted with AES-256-GCM. The encryption key (KEK) is stored separately from the database — in a server environment variable — and in production it is mandatory (there is no insecure default: without a KEK the crypto subsystem simply won't start). The same encryption protects the heavy secrets in the database — the Marzban admin password/token/JWT, Reality keys, payment-provider keys, the proxy-credential cache, backup config.

Encryption doesn't just hide but authenticates the data (GCM auth tag): tampering with an encrypted field is detected on decryption and rejected. Every field is encrypted with a fresh random nonce; the KEK value never reaches the logs — only its short id.

About capability tokens: the /sub subscription token is a bearer secret. For lookup we store only its SHA-256, while the copy needed to re-display an already-issued link is kept as AES-GCM ciphertext. Older plaintext records are migrated to the new format, fail-closed, before the HTTP server starts. The payment-webhook URL identifier is stored in the clear but does not by itself authenticate an event: authenticity is verified separately by an HMAC signature.

Partner API key secrets are stored irreversibly: the full key is shown only once, when it is issued, and the database keeps the SHA-256 of its secret part. Access and refresh tokens for connected AI are not stored in plaintext either; a connection is limited to the selected access level and can be revoked by the account owner.

SR-4The private key is not included in ordinary responses and is released only on explicit export.verified+

The key is decrypted only on the server, in memory; ordinary APIs never return it. The only way to obtain it is a deliberate export function ('take your key'), protected by sign-in plus a one-time email code (the code is stored only as an HMAC hash, compared in constant time, 10-minute TTL, 5 attempts). So the key can be retrieved intentionally, but not 'leaked' through a normal request.

SR-5When a server is deleted, the key is synchronously cleared from its record.verified+

Before the server's state changes and before any background network operations, the fields holding the management key are zeroed synchronously. If the database does not confirm the clearing, the operation returns an error and can be retried. The deletion remains 'soft': the row and non-secret service data are preserved. This does not mean physical erasure of backups already created — their lifecycle is governed by the backup retention policy.

SR-16Audited partner APIs scope access to the resource owner.verified+

In panel routes, partner_id is derived from the signed session; in the Partner API, from a verified API key or AI OAuth connection. The owner identifier is not taken from the path, query parameters or request body. API keys are additionally limited by scope, expiry and plan; for a connected AI, the set of permissions is computed on every request from the level chosen by the owner.

Before returning or changing anything, the system re-checks that the server, cluster, inbound, route, VPN user or payment belongs to this account. Database queries are scoped by partner_id, and composite unique and foreign keys reject invalid cross-partner links. The authorization matrix in the tests requires an explicit IDOR scenario for every endpoint with a resource identifier.

Honest caveat: this is verified by a code audit across the request path, not by a public penetration test — so SR-16, like the rest, is open to refutation in the bug bounty.

Honestly about the panel's access — it is full admin, not 'limited'.honest note+

To configure everything automatically (install Xray+Reality, apply config, read metrics) the panel holds full administrative access on the server (root-equivalent, via a service user with passwordless sudo). This is necessary for management, and we do NOT call it 'limited'.

What reduces the risk: secrets are passed to the server only via the process's stdin (not as command arguments — they aren't visible in the process list); after the initial install, every management connection verifies the server's pinned host key — a server swap 'in the middle' is rejected. What you control: access rests on a key you can revoke at any time — by deleting the server (the key is zeroed) or simply deleting the VPS at your host (then everything disappears).

02 · Your data and privacy

Your data and privacy

SR-6VPN users live on your server; we hold a minimum of service metadata.verified+

The VPN accounts themselves (VLESS/Reality) are created and live in Marzban on your master server. Centrally we store only what is required to issue a subscription link: a random subscription token and an encrypted snapshot of proxy credentials (a cache; the source of truth is your Marzban). We have no traffic, IP, or user visit history.

An end user's email address is not stored with us: their account name is derived irreversibly and contains no address. The sign-in code email is sent by us, so the address passes through our send queue and is removed from it right after sending — to recognise a returning user, only an irreversible fingerprint remains, and the address cannot be recovered from it. The one case where an address does settle we name directly: at payment it arrives in the payment webhook and enters the payment log with a limited retention window.

We keep this service data only as long as needed and clear it automatically: email is removed from the send queue right after sending, a payment event body after processing, and events awaiting retry within a 90-day window. You can delete your account together with all of its data yourself, in Advanced settings, by confirming with a code from your email (see risk 7 for details). We disclose this openly rather than hiding it behind vague wording.

SR-7We don't collect logs of your traffic or visits, and the servers keep no visit journal.verified+

The CreateYourVPN platform does not receive or store information about which sites you or your users visit. The metrics-ingest schema is closed: it physically has no fields for IPs, domains, or visits — only aggregates (unique online count, total bytes, CPU/RAM/load). Each node authenticates with an HMAC token bound to its own id and can write metrics only for itself. The on-node balancer (HAProxy) works as a TCP router by SNI and does not decrypt traffic. On the server itself, system journals are retained for no more than about an hour and are not forwarded to syslog.

Beyond the platform level, the servers do not keep a visit journal either: Xray access logging is force-disabled on every config push (the platform sets log.access to none), so the edge proxy does not record which addresses users connect to. This is enforced in code and rolled out to the fleet.

SR-8Web analytics is Google Analytics; there are no other trackers.verified+

To understand how the site and panel are used we apply Google Analytics (the cookie banner warns about cookie and statistics collection; details are in the Privacy Policy). On OAuth consent pages, loading of analytics is forcibly disabled: the URL contains a short-lived identifier of the AI connection request, which must not be passed to a third party. There are no other third-party trackers: no Sentry, PostHog, Mixpanel, or ad pixels. The backend has no third-party telemetry, and end-user storefronts are not covered by analytics.

Caveat: GA receives your IP (on Google's side) and the addresses of the panel pages viewed; panel URLs contain only a cluster identifier, not an email.

SR-9Payments are external — we don't receive the full card number.verified+

Payment and all card data are handled on the side of the connected provider (lava.top). We only receive a verified webhook event: its authenticity is established, by the method the specific provider supports, before the balance or access is changed. We do not receive the full card number (PAN) or CVV. Redelivery of the same event does not cause a double grant: events are deduplicated.

Caveat: the provider may include card metadata (brand and last 4 digits) and the payer's name and email in the webhook body. The original body is needed by the worker until processing completes; after successful processing it is deleted together with the email hint. Events awaiting retry or manual review keep the original body only until the end of the retention window (90 days without activity), after which the card metadata and the payer's email are wiped automatically. 'There is no full card number' is true, but that is a property of the providers (we don't filter the body ourselves); 'we see nothing about the card at all' is not.

What we store about you (the partner), honestly.honest note+

For the account we store the email, last sign-in time, interface mode and settings; for billing — balance and Telegram, if one is provided for top-ups. To protect the account, an active session contains its creation and last activity times, IP address and user agent. The history of successful and failed sign-in attempts, with the same technical attributes, is kept for 90 days.

There is no general click history for the panel. Separate, purpose-specific logs do exist: Partner API requests — no more than the latest 500 entries and about 25 hours; infrastructure events and diagnostic results — no more than 7 days; connected AI actions — kept together with the account. Before AI actions are recorded, passwords, tokens, keys and subscription links are removed, and users' emails are masked.

03 · Server hardening

Server hardening

SR-10The firewall denies everything except what's needed.verified+

The firewall denies incoming by default. Open outward: 443 (VPN, Xray+Reality), SSH on a non-standard port (12011 by default), and — on the master server — the Marzban admin panel port, only for control-plane IPs. Port 80 is opened separately only in Let's Encrypt mode for HTTP-01. Port 22 is closed after SSH is moved.

The node's management ports are open only to the master server's IP, not outward (a failure of this binding aborts the install). If the firewall does not become active, installation fails. ICMP echo is limited only for IPv4; we do not promise the server is 'invisible', and IPv6 ICMP is preserved for IPv6 to work correctly.

SR-11Automatic security updates.verified+

Unattended upgrades install security package updates automatically. Caveat: automatic reboot is deliberately disabled (so an unverified kernel doesn't reboot on its own) — which means fixes requiring a reboot (kernel, sometimes OpenSSH) apply only after a manual or scheduled reboot. 'Auto-patching' is true for userland, not for what requires a reboot.

Honestly about 'invisibility' — we don't claim it.honest note+

We do NOT claim the server is 'invisible' or 'can't be scanned'. Port 443 is open and answers a TCP connection like any web server. The property 'on an incorrect connection it looks like an ordinary unrelated website' is provided by the Reality protocol inside Xray — a separate component we don't turn into an absolute.

04 · The platform (control panel)

The platform (control panel)

SR-12Sign-in to your CreateYourVPN account without a password.verified+

Partner sign-in is by a one-time 6-digit code sent to email. There is no account password. This does not apply to internal credentials of managed components, such as the generated server admin password. Codes are generated by a cryptographic generator; only their HMAC hash is stored, and comparison is constant-time. On success the code is deleted immediately, and after 5 wrong attempts it is quenched early. The issuance rate limit is counted both per full address and per underlying mailbox: a change of IP, dots in a Gmail address and plus tags do not yield a separate limit.

SR-13Sessions can be reviewed and revoked immediately.verified+

The session token sits in an HttpOnly and Secure cookie (JS can't read it), verified on the backend (not only at the edge). Idle timeout and auto-logout on inactivity are implemented on the client, not on the server. The token is signed with HS256; on verification we strictly reject any other algorithm (including 'none') — the classic algorithm-swap attack does not pass. The storefront token and the partner-panel token are separated by audience: an end-user token technically cannot reach the partner API (and vice versa). A deleted partner is rejected even with a live token.

Every partner session has a stable server-side identifier that is preserved when the token is renewed. A normal sign-out revokes the entire current session, not just one issued token. The “Account sessions” section shows the device, IP address, sign-in time and last activity; any session can be ended individually. The “Sign out everywhere” action ends all sessions and disconnects connected AI services.

The sign-in history is kept for 90 days and shows successful sign-ins, wrong and expired codes, and exceeded attempt limits. If there are signs that an already exchanged token is being reused, the system treats the session as copied, ends all sessions and AI connections, and sends the owner a notification.

SR-14Session tokens and internal secrets are not accessible to client-side JavaScript.verified+

There are no session tokens in browser local storage, only interface settings. The token is placed in an HttpOnly cookie by the Next.js server layer; the browser does not receive the internal backend address and reaches the backend through Server Actions. CORS does not allow other origins to read API responses containing authorized data.

There are deliberate exceptions controlled by the owner themselves: exporting the private SSH key after a code from an email (SR-4), and a new Partner API key, whose full secret is shown in the browser once, at creation. After that it cannot be recovered from the database — only a hash remains there. The public API domain is reachable from the internet by design, but without a valid session, API key or OAuth token it returns no protected data.

SR-15The platform's public domains use HTTPS with strict security headers.verified+

CreateYourVPN's public hosts are served over HTTPS with HSTS (max-age two years, includeSubDomains). Every web frontend we host — the platform site, the partner panel and partner storefronts, whether on our subdomains or on a partner's own domain — and the API domain send the same set of security headers: a Content-Security-Policy (default-src 'none' on the API; on the frontends it forbids embedding in an iframe and pins base-uri and form-action), X-Content-Type-Options: nosniff, X-Frame-Options, and a locked-down Referrer-Policy (no-referrer on the API; strict-origin-when-cross-origin on the frontends, which also send a restrictive Permissions-Policy).

This is live in production on all of those hosts and independently checkable — with any HTTP header inspector or a service like SSL Labs.

An AI connection is separate, revocable access, not a handover of the account session.honest note+

An AI app connects via OAuth and does not receive your panel's cookies. On the consent page you choose one of three levels: view only; view and configure; delete and grant access. Permissions are checked by the server on every call. Critical deletions require an additional one-time code from an email, and the whole connection can be revoked in the “Connected AI” section.

Every tool call is recorded in a log visible to the owner, together with its result and a safe copy of the arguments. Passwords, tokens, API keys, private keys and subscription links are stripped out before recording; users' emails are masked. The chosen AI app nevertheless remains a third-party service: data you have deliberately asked it to read or change is also processed under its provider's rules.

Honestly about the risks (what we do NOT promise)

Honestly about the risks (what we do NOT promise)

The following limitations remain in the current architecture and should be considered when evaluating its security.

01Centralized key storage — under multi-layered protection.

The control panel stores the encrypted access keys to the entire fleet of servers. It is, naturally, the most sensitive component of the system — and we protect it accordingly.

What protects it: heavy secrets live in the database as ciphertext only; the encryption key (KEK) is stored separately from the database; management keys are not included in ordinary responses to the browser and are zeroed when a server is deleted. Subscription tokens have an extra layer — hash lookup plus AES-GCM — so even a database dump without the KEK contains no working /sub links.

The honest ceiling: encryption reliably protects against theft of the database itself — a backup, a replica or a dump. It does not remove the risk of a full compromise of the application host, where both the KEK and the database are available to the process. A dedicated KMS/HSM is not currently used; that is why the main focus of protection is host isolation, automatic updates and a minimal public surface.

02The first SSH connection relies on trust on first use.

When a VPS is first added, the platform does not yet know its SSH host key and does not receive the fingerprint through an independent trusted channel. The first connection with the entered root password therefore uses the trust on first use model: at that moment, an active attacker on the network path could theoretically impersonate the server. We do not call this risk zero.

After a successful installation the fingerprint is pinned, and every subsequent management connection must match it. The password is stored nowhere and is not used again; password login and root login are disabled, and management switches to a separate key.

The limitation can be fully closed only by independent verification of the first fingerprint, for example through the VPS provider's API or confirmation by the owner. No such verification exists at the moment, so this item remains an open risk.

03Physical access to the server rests with your VPS host.

This is a property of any rented server, not just ours: snapshots, rescue mode and the like are available to the provider, and no software protects against that. On the flip side, choosing a trustworthy provider is in your hands, and the server is entirely yours — you can switch hosts or delete the machine at any time.

04Unknown vulnerabilities (0-days) always exist.

No one can promise absolute protection — new vulnerabilities appear in all software. What we do: security updates are installed automatically, and fixes that require a reboot (the kernel, sometimes OpenSSH) apply after a reboot, whether manual or scheduled (see SR-11).

05Email: we store yours, not your users' addresses.

Your address is needed for sign-in and is stored while the account exists. End users' addresses are not stored as profile data; the exception is the payer's address inside a payment event that is unprocessed or awaiting review, as described in SR-6 and SR-9. In AI activity logs, users' emails are kept only in masked form.

06Sign-in is by email code — no separate 2FA yet.

Since sign-in relies on a one-time email code, your mailbox is effectively the key to the account — worth protecting well. A second factor is not there yet: reasonable for this stage, but worth knowing.

07Different service logs have different retention periods.

An end user's email is removed from the queue after the message is sent, and the raw body of a successful payment event after it is processed. The Partner API log is limited to the latest 500 rows and a period of about 25 hours; infrastructure events and diagnostic results are kept for no more than 7 days.

The sign-in history of a partner account is kept for 90 days. The same maximum period without activity applies to the body of a payment event awaiting a retry or manual review, after which the personal data is wiped.

A separate exception is the connected AI activity log: it is needed to investigate actions taken on the owner's behalf and is kept together with the account. Secrets are removed and emails are masked before recording, but this log currently has no separate short TTL.

You can delete your account yourself in Advanced settings: at once and in full, together with all the logs above, including the AI activity log. Deleted data stays in database backups until they are overwritten, for no more than 30 days. Correspondence with the support team is stored separately from the account and is deleted on request.

08User backups export data beyond your server.

If you enable backup export to Google Drive or S3, user data leaves your server, and its protection then depends on your cloud — this report does not cover it separately. It is your deliberate choice: the feature is one you turn on yourself.

don't take our word

How to check this.

Every claim above is a public bet. We invite you to find where we were wrong or embellished:

track A

Track A — classic vulnerabilities (RCE, authorization bypass, IDOR, leaks, and so on).

track B

Track B — refuting this report: prove that any SR-N is false, get a reward, and we publish the correction publicly.

Found something?

Write to us with a reproducible proof of concept. We reply within 72 hours and triage in-house.

security@createyourvpn.com90 days of silence · safe harborRewards land on your CreateYourVPN account balance — that is the only way we pay out.