звіт з безпеки · версія 3 · 13 серпня 2026 р.

Перевірювані твердження.

Це не маркетингова сторінка «ми безпечні», а набір перевірюваних тверджень (SR-N), кожне з яких ви можете оскаржити в нашій програмі bug bounty за винагороду.

01 · Доступ до вашого сервера

Доступ до вашого сервера

SR-1Пароль root використовується один раз і не зберігається в нас.перевірено+

Пароль потрібен лише щоб відкрити перше SSH-з'єднання і поставити службового користувача. Він передається як SSH-автентифікація нашого підключення — не як аргумент чи змінна скрипта. У нашій базі для нього немає поля; він не потрапляє в env прогонів скриптів і не пишеться в логи (помилки підключення містять лише адресу й порт, але не пароль). В оперативній пам'яті він затирається (best-effort) після використання — це захист у глибину, а не гарантія: Go може тримати копії значення в купі до збирання сміття.

Чесне застереження: це залишається паролем root на вашому сервері. Після встановлення ми вимикаємо вхід за паролем і під root по SSH, але сам пароль не змінюємо — за бажанням змініть його самі. «Ми не зберігаємо» — правда; «він перестав бути секретом» — ні.

SR-2Після встановлення вхід за паролем і під root по SSH вимикається.перевірено+

PasswordAuthentication no, PermitRootLogin no, SSH перенесено на нестандартний порт (за замовчуванням 12011), увімкнено fail2ban (бан на годину після 5 невдач), вхід — лише за ключем. Публічний ключ суворо валідується до застосування: відхиляються переноси рядків (захист від підмішування зайвих ключів у authorized_keys) і синтаксично некоректні ключі.

Анти-локаут: порт 22 не закривається, поки ядро не підтвердить (через ss), що новий SSH-порт справді слухає; конфіг перевіряється через sshd -t, правило sudo — через visudo -cf, обидва відкочуються при помилці.

SR-3Ключ керування зберігається лише в зашифрованому вигляді.перевірено+

Панель працює не вашим паролем, а окремим ключем (ed25519), який вона генерує сама. Приватна частина лежить у базі зашифрованою AES-256-GCM. Ключ шифрування (KEK) зберігається окремо від бази — у змінній оточення сервера — і в проді він обов'язковий (небезпечного дефолту немає: без KEK крипто-підсистема просто не запускається). Тим самим шифруванням захищені важкі секрети в базі — адмін-пароль/токен/JWT Marzban, Reality-ключі, ключі payment-провайдерів, кеш proxy-кредів, конфіг бекапів.

Шифрування не просто приховує, а автентифікує дані (GCM auth-tag): підміна зашифрованого поля виявляється при розшифруванні і відхиляється. Кожне поле шифрується зі свіжим випадковим nonce; значення KEK у логи не потрапляє — лише його короткий id.

Про capability-токени: токен підписки /sub — це bearer-секрет. Для пошуку ми зберігаємо лише його SHA-256, а копію, потрібну для повторного показу вже виданого посилання, тримаємо у вигляді AES-GCM шифртексту. Старі plaintext-записи переводяться в новий формат fail-closed до запуску HTTP-сервера. Ідентифікатор URL платіжного webhook зберігається відкрито, але сам по собі не автентифікує подію: справжність окремо перевіряється HMAC-підписом.

SR-4Приватний ключ ніколи не потрапляє у браузер.перевірено+

Ключ розшифровується лише на сервері, в оперативній пам'яті; звичайні API його ніколи не віддають. Єдиний спосіб його отримати — навмисна функція експорту («забрати свій ключ»), захищена входом плюс одноразовим кодом на email (код зберігається лише як HMAC-хеш, звірка постійного часу, TTL 10 хвилин, 5 спроб). Тобто ключ можна дістати свідомо, але не «витоком» через звичайний запит.

SR-5При видаленні сервера ключ синхронно очищається з його запису.перевірено+

До зміни стану сервера і до будь-яких фонових мережевих операцій поля з керуючим ключем обнуляються синхронно. Якщо база не підтверджує очищення, операція повертає помилку і може бути повторена. Видалення залишається «м'яким»: рядок і несекретні службові відомості зберігаються. Це не означає фізичного стирання вже створених резервних копій — їхній життєвий цикл визначається політикою зберігання бекапів.

SR-16Перевірені партнерські API обмежують доступ власником ресурсу.перевірено+

Перевірені партнерські маршрути авторизуються за partner_id, який сервер виводить із підписаного токена входу — а не з того, що клієнт надіслав у шляху чи тілі запиту. Перш ніж щось віддати чи змінити, система перевіряє повторно, що запитаний сервер, кластер, інбаунд, маршрут, VPN-користувач чи платіж належить вашому акаунту; відповідні запити до бази обмежені вашим partner_id, а схема (складені унікальні ключі плюс складені зовнішні ключі) відхиляє некоректні міжпартнерські зв'язки. Ізоляція ешелонована: застосунок, повторна перевірка в usecase, фільтр за partner_id і схема.

Чесне застереження: це перевірено аудитом коду по всьому шляху запиту, а не публічним пентестом — тому SR-16, як і решта, відкритий для спростування в bug bounty.

Чесно про доступ панелі — це повний адмін, а не «обмежений».чесна примітка+

Щоб усе налаштовувати автоматично (встановлювати Xray+Reality, застосовувати конфіг, читати метрики), панель тримає на сервері повний адміністративний доступ (еквівалент root, через службового користувача з sudo без пароля). Це необхідно для керування, і ми НЕ називаємо його «обмеженим».

Що знижує ризик: секрети передаються на сервер лише через stdin процесу (не як аргументи команди — їх не видно в списку процесів); після первинного встановлення кожне керуюче підключення перевіряє закріплений host-key сервера — підміна сервера «на шляху» відбивається. Що ви контролюєте: доступ тримається на ключі, який ви будь-якої миті можете відкликати — видаливши сервер (ключ обнуляється) або просто видаливши VPS у хостера (тоді зникає взагалі все).

02 · Ваші дані та приватність

Ваші дані та приватність

SR-6VPN-користувачі живуть на вашому сервері; у нас — мінімум службових метаданих.перевірено+

Самі VPN-акаунти (VLESS/Reality) створюються і живуть у Marzban на вашому master-сервері. Централізовано ми зберігаємо лише те, без чого не можна видати посилання-підписку: випадковий токен підписки і зашифрований зліпок proxy-кредів (кеш; джерело істини — ваш Marzban). Ні трафіку, ні IP, ні історії відвідувань користувачів у нас немає.

Адреса кінцевого користувача в нас не зберігається: ім'я його облікового запису виводиться необоротно й адреси не містить. Лист із кодом входу надсилаємо ми, тому адреса проходить через чергу надсилання і видаляється звідти одразу після відправлення — для впізнавання користувача, який повернувся, лишається тільки необоротний відбиток, і відновити адресу з нього неможливо. Єдиний випадок, де адреса все ж осідає, називаємо прямо: під час оплати вона приходить у платіжному webhook і потрапляє до журналу платежів з обмеженим строком зберігання.

Ці службові дані ми зберігаємо рівно стільки, скільки потрібно, і очищаємо автоматично: email — з черги одразу після надсилання, тіло платіжної події — після обробки, а події на ретраї — до вікна в 90 днів. Видалити акаунт разом із пов'язаними даними можна, написавши в підтримку (докладніше — ризик 7). Ми розкриваємо це чесно, а не ховаємо за загальними словами.

SR-7Ми не збираємо логи вашого трафіку чи відвідувань, і сервери не ведуть жодного журналу відвідувань.перевірено+

Платформа CreateYourVPN не отримує і не зберігає інформацію про те, які сайти відвідуєте ви чи ваші користувачі. Схема прийому метрик закрита: у ній фізично немає полів під IP, домени чи відвідування — лише агрегати (число унікальних онлайн, сумарні байти, CPU/RAM/навантаження). Кожна нода автентифікується HMAC-токеном, прив'язаним до її власного id, і може писати метрики лише за себе. Балансувальник на ноді (HAProxy) працює як TCP-роутер за SNI і не розшифровує трафік. На самому сервері системні журнали утримуються не довше приблизно години і не форвардяться в syslog.

Окрім рівня платформи, сервери також не ведуть журналу відвідувань: логування доступу Xray примусово вимикається при кожному застосуванні конфігурації (платформа встановлює log.access у none), тож гранична проксі не записує, на які адреси підключаються користувачі. Це закріплено в коді й розгорнуто на весь флот.

SR-8Веб-аналітика — це Google Analytics; інших трекерів немає.перевірено+

Щоб розуміти, як використовують сайт і панель, ми застосовуємо Google Analytics (про збір cookie і статистики попереджає куки-банер, деталі — у Політиці конфіденційності). Інших сторонніх трекерів немає: ні Sentry, ні PostHog, ні Mixpanel, ні рекламних пікселів (перевірено пошуком по обох фронтендах). У бекенді сторонньої телеметрії немає взагалі. Вітрина для кінцевих користувачів аналітикою не покрита взагалі — ні GA, ні трекерів (перевірювано за її вихідними кодами).

Застереження: GA отримує ваш IP (на боці Google) і адреси переглянутих сторінок панелі; в URL панелі — лише ідентифікатор кластера, не email.

SR-9Платежі зовнішні — повного номера картки ми не отримуємо.перевірено+

Оплата і всі карткові дані обробляються на боці провайдера (Tribute / Lemon Squeezy). До нас приходить лише підписаний webhook (HMAC-SHA256, звірка постійного часу, перевіряється до розбору тіла і до будь-якого запису в базу: без знання секрета подія не проходить перевірку). Повного номера картки (PAN) і CVV ми не отримуємо. Повторна доставка того самого webhook (ретраї провайдера) не призводить до подвійної видачі — події дедуплікуються.

Застереження: провайдер може включати в тіло webhook метадані картки (бренд і останні 4 цифри) та ім'я й email платника. Вихідне тіло потрібне воркеру до завершення обробки; після успішної обробки воно видаляється разом із email-підказкою. Події, що очікують ретраю чи ручного розбору, зберігають вихідне тіло лише до кінця вікна зберігання (90 днів без активності), після чого метадані картки й email платника видаляються автоматично. «Повного номера картки немає» — правда, але це властивість провайдерів (саме тіло ми не фільтруємо); «ми взагалі нічого не бачимо про картку» — ні.

Що ми зберігаємо про вас (партнера), чесно.чесна примітка+

Email (потрібен для входу), час останнього входу, режим інтерфейсу; для білінгу — баланс і Telegram (для поповнень). IP партнера в базі не зберігається, історію кліків чи дій у панелі ми не ведемо (крім короткого access-логу при помилках).

03 · Захист сервера

Захист сервера

SR-10Фаервол забороняє все, крім потрібного.перевірено+

Фаервол за замовчуванням забороняє вхідні. Назовні відкриті: 443 (VPN, Xray+Reality), SSH на нестандартному порту (за замовчуванням 12011) і — на master-сервері — порт адмін-панелі Marzban, лише для IP control-plane. Порт 80 відкривається окремо лише в режимі Let's Encrypt для HTTP-01. Порт 22 закривається після перенесення SSH.

Керуючі порти ноди відкриті лише для IP master-сервера, а не назовні (провал цієї прив'язки перериває встановлення). Якщо фаервол не стає активним, встановлення завершується помилкою. ICMP echo обмежується лише для IPv4; ми не обіцяємо, що сервер «невидимий», а IPv6 ICMP зберігається, щоб IPv6 працював коректно.

SR-11Автоматичні оновлення безпеки.перевірено+

Unattended upgrades встановлює оновлення безпеки пакетів автоматично. Застереження: авто-перезавантаження навмисно вимкнене (щоб неперевірене ядро не пішло в ребут само) — отже фікси, що потребують перезавантаження (ядро, іноді OpenSSH), застосовуються лише після ручного чи планового ребуту. «Автопатчинг» — правда для userland, але не для того, що потребує ребуту.

Чесно про «невидимість» — ми її не заявляємо.чесна примітка+

Ми НЕ стверджуємо, що сервер «невидимий» чи «його не можна просканувати». Порт 443 відкритий і відповідає на TCP-з'єднання, як будь-який веб-сервер. Властивість «на некоректне підключення виглядає як звичайний чужий сайт» забезпечує протокол Reality всередині Xray — це окремий компонент, і в абсолют ми його не зводимо.

04 · Платформа (панель керування)

Платформа (панель керування)

SR-12Вхід в акаунт CreateYourVPN без пароля.перевірено+

Вхід партнера — за одноразовим 6-значним кодом на email. Пароля акаунта немає. Це не стосується внутрішніх credentials керованих компонентів, наприклад згенерованого адмін-пароля Marzban. Коди генеруються криптографічним генератором; зберігається лише їхній HMAC-хеш, а порівняння — постійного часу. Код одноразовий: при успіху одразу видаляється (повтор неможливий); після 5 невірних спроб гаситься достроково. Обмеження частоти видачі рахується за email, а не за IP — його не можна обійти зміною адреси.

SR-13Сесія захищена.перевірено+

Токен сесії лежить у cookie HttpOnly і Secure (JS його не прочитає), перевіряється на бекенді (не лише на краю). Таймаут простою і авто-вихід за бездіяльністю реалізовані на клієнті, не на сервері. Токен підписаний HS256; при перевірці ми жорстко відхиляємо будь-який інший алгоритм (включно з «none») — класична атака підміни алгоритму не проходить. Токен вітрини і токен партнерської панелі розділені за audience: токен кінцевого користувача технічно не може звертатися до партнерського API (і навпаки). Видалений партнер відбивається навіть із живим токеном.

Вихід завершує сесію на сервері, а не лише в браузері: пред'явлений під час виходу токен перестає прийматися, тож знята заздалегідь копія після виходу непотрібна. У панелі це стосується лише тієї сесії, з якої ви вийшли, — інші ваші пристрої залишаються в системі; у кабінеті вихід завершує всі сесії цього облікового запису. Сесії, відкриті до цієї зміни, мітки відкликання не мають і просто спливають самі.

SR-14Токени і секрети не витікають у браузер.перевірено+

У локальному сховищі браузера токенів немає (лише UI-налаштування); секрети й адреса API в клієнтський бандл не потрапляють. Токен у HttpOnly-cookie кладе лише сервер (Next.js). Браузер спілкується з ядром лише через сервер (Server Actions): фронтенд не ходить в API напряму з браузера, а CORS не дозволяє браузерне читання відповідей API з інших origin.

Уточнення замість колишнього абсолюту: сам API-домен — публічний хост, відкрити його з браузера технічно можна, але без сесії авторизованих даних він не віддає.

SR-15Публічні домени платформи використовують HTTPS зі строгими security-заголовками.перевірено+

Публічні хости CreateYourVPN віддаються через HTTPS із HSTS (max-age два роки, includeSubDomains). Кожен вебфронтенд, який ми розміщуємо, — сайт платформи, партнерська панель і вітрини партнерів, чи то на наших піддоменах, чи на власному домені партнера, — а також API-домен надсилають однаковий набір security-заголовків: Content-Security-Policy (default-src 'none' на API; на фронтендах вона забороняє вбудовування в iframe і фіксує base-uri та form-action), X-Content-Type-Options: nosniff, X-Frame-Options і жорсткий Referrer-Policy (no-referrer на API; strict-origin-when-cross-origin на фронтендах, які також віддають обмежувальний Permissions-Policy).

Це працює у проді на всіх цих хостах і перевіряється незалежно — будь-яким інспектором HTTP-заголовків або сервісом на кшталт SSL Labs.

Чесно про ризики (те, чого ми НЕ обіцяємо)

Чесно про ризики (те, чого ми НЕ обіцяємо)

Звіт без цього розділу — маркетинг. Ось справжні обмеження:

01Централізоване зберігання ключів — під багаторівневим захистом.

Панель керування зберігає зашифровані ключі доступу до всього парку серверів. Це, природно, найчутливіший компонент системи — і захищаємо ми його відповідно.

Що забезпечує захист: важкі секрети зберігаються в базі лише у вигляді шифротексту; ключ шифрування (KEK) зберігається окремо від бази; у браузер ключі не потрапляють ніколи; а під час видалення сервера вони обнуляються. Токени підписки мають додатковий шар — hash-lookup плюс AES-GCM — тому навіть дамп бази без KEK не містить робочих /sub-посилань.

Чесна стеля: шифрування надійно захищає від крадіжки самої бази — резервної копії, репліки чи дампа. Воно не усуває ризику повної компрометації самого хоста панелі, де KEK і база доступні одному процесу. Тому основний фокус захисту — не допустити саме захоплення хоста: ізоляція, автоматичні оновлення безпеки та мінімум відкритих поверхонь.

Виділений KMS/HSM з'явиться в одному з найближчих релізів безпеки.

02Ризик атаки Man-in-the-Middle (MITM) під час першого підключення зведений практично до нуля.

Коли ви додаєте сервер, ми підключаємося до нього рівно один раз — за тимчасовим паролем, який ви вводите. Саме на цьому першому підключенні теоретично можлива атака Man-in-the-Middle (MITM). Ми нейтралізуємо її кількома незалежними заходами, тож практичний ризик зведений до нуля.

Пароль одноразовий: він обслуговує рівно одне підключення, ніде на нашому боці не зберігається й повторно не використовується. Приватний ключ ніколи не передається через мережу — подальша автентифікація ґрунтується на парі ключів (автентифікація за відкритим ключем, pubkey), а не на паролі.

Одразу після встановлення на сервері вимикаються автентифікація за паролем і вхід під root, змінюється SSH-порт, а доступ переводиться виключно на ключі. Від цієї миті навіть перехоплений пароль уже нічого не відкриває.

Кожне подальше керувальне підключення звіряє закріплений відбиток сервера (host-key pinning) — підмінений «посередині» сервер відхиляється.

Як наслідок, перехоплення було б можливим лише для зловмисника, фізично присутнього на мережевому маршруті між нами та сервером упродовж тих кількох секунд початкового встановлення, — та навіть у цьому крайньому випадку перехоплені дані миттєво втрачають чинність.

03Фізичний доступ до сервера — на боці вашого VPS-хостера.

Це властивість будь-якого орендованого сервера, а не лише нашого: снапшоти, rescue-режим і подібне доступні провайдеру, і жоден софт від цього не захищає. Зате вибір надійного провайдера — під вашим контролем, і сервер цілком ваш: хостера можна змінити, а машину видалити будь-якої миті.

04Невідомі вразливості (0-day) існують завжди.

Абсолютного захисту не обіцяє ніхто — нові вразливості з'являються в усьому софті. Що робимо ми: оновлення безпеки встановлюються автоматично, а виправлення, що потребують перезавантаження (ядро, іноді OpenSSH), застосовуються після ребуту — ручного чи планового (див. SR-11).

05Email: вашу адресу зберігаємо, адреси ваших користувачів — ні.

Ваша адреса потрібна для входу і зберігається, доки існує обліковий запис. Адреси кінцевих користувачів не зберігаємо — єдиний виняток, платіжний webhook, названо в SR-6. Усе, що проходить через нас, очищається автоматично (див. ризик 7).

06Вхід — за email-кодом; окремого 2FA поки немає.

Оскільки вхід будується на одноразовому коді з листа, ваша поштова скринька по суті і є ключем до акаунта — її варто добре захистити. Другого фактора поки немає: розумно для поточного етапу, але знати про це варто.

07Дані зберігаються обмежений час і очищаються автоматично.

Особисті дані ми тримаємо рівно стільки, скільки потрібно для операції, а потім очищаємо автоматично. Email видаляється з черги одразу після надсилання листа, а сире тіло успішної платіжної події — одразу після обробки.

Довше живе лише одне: платіжні події, що очікують повторної спроби або ручної перевірки. Їхнє вихідне тіло зберігається не безкінечно, а до кінця вікна в 90 днів без активності, після чого особисті дані обнуляються автоматично.

Самостійного «видалити мої дані» в інтерфейсі поки немає — у планах. А видалити акаунт разом із пов'язаними даними можна, написавши в підтримку.

08Бекапи користувачів виносять особисті дані за межі вашого сервера.

Якщо ви вмикаєте експорт бекапів на Google Drive або S3, дані користувачів залишають ваш сервер, і їхній захист залежить уже від вашої хмари — у цьому звіті він окремо не покривається. Це ваш свідомий вибір: функцію ви вмикаєте самі.

не вірте на слово

Як це перевірити.

Кожне твердження вище — публічна ставка. Ми запрошуємо знайти, де ми помилилися чи прикрасили:

трек A

Трек A — класичні вразливості (RCE, обхід авторизації, IDOR, витоки і так далі).

трек B

Трек B — спростування цього звіту: доведіть, що будь-яке SR-N хибне, отримайте винагороду, а ми публічно опублікуємо поправку.

Щось знайшли?

Напишіть нам із відтворюваним proof of concept. Відповідаємо протягом 72 годин, тріаж ведемо самі.

security@createyourvpn.com90 днів тиші · безпечна гаваньВинагорода надходить на баланс вашого акаунта CreateYourVPN — це єдиний спосіб виплати.