Преминете към основното съдържание

Сигурност

Докладване на уязвимост​

Моля, не отваряйте публичен issue. Използвайте функцията на GitHub за поверително докладване на уязвимости в хранилището (repository) (Security → Report a vulnerability), като посочите засегнатата версия, описание, стъпки за възпроизвеждане и очакваното въздействие.

Потвърждение за получаванедо 3 работни дни
Първоначална оценкадо 10 работни дни
Корекция за критични и високи проблемицелеви срок до 30 дни

Тествайте само срещу инсталации, които притежавате. Поддържа се последното минорно издание от серията 1.x; корекциите по сигурността се пускат като patch версии.

В обхвата: бекендът, порталът, агентът, конекторът за обекта, инсталаторите, веригата за самообновяване и файловете за продукционно разгръщане в deploy/. Извън обхвата: находки, които изискват вече компрометирана Windows машина с права на локален администратор (агентът по замисъл работи като SYSTEM), администратор на тенанта, който атакува собствения си тенант, обемни атаки за отказ на услуга и изход от скенери без доказано въздействие.

Модел на заплахите​

Разглеждани нападатели:

  • потребител от един тенант, който иска данни или контрол в друг тенант;
  • по-ниска роля (наблюдател, техник), която иска повече от това, което ролята дава;
  • всеки в интернет, който може да достигне до портала, крайните точки за агенти и конектори и хоста за файлове;
  • обикновен потребител на Windows на управляван компютър, който иска да получи SYSTEM чрез агента;
  • някой, който се сдобие с копие на базата данни, резервно копие, файл с журнал или URL адрес.

Доверени по замисъл: агентът работи като SYSTEM и изпълнява това, което сървърът изпраща; мениджърите на пакети и авторите на скриптове в даден тенант могат да изпълняват произволен код на устройствата на този тенант; глобалният администратор контролира всичко.

Механизми за сигурност​

ОбластМеханизъм
МрежаАгентите и конекторите се свързват само навън; ключовете за всяка инсталация се съхраняват като хешове; токените за регистриране имат срок на валидност и ограничение на използванията.
Изолация на тенантитеПроверки в приложението плюс защита на ниво ред (row-level security) в PostgreSQL със съставни външни ключове по тенант (Мултитенантност); fuzz тест за достъп между тенанти.
АвторизацияВсеки маршрут има изрично правило за достъп; тест с RBAC матрица покрива всеки маршрут × извикващ.
Пароли, двуфакторна автентикация, сесииСамо в Entrosity Hub: argon2id; 12–256 знака; често срещаните пароли се отказват; заключване и ограничения при влизане; TOTP с 10 кода за възстановяване; ротираща се бисквитка на сесията с откриване на повторна употреба (по-долу). Базата данни на Axis не съдържа идентификационни данни.
ВлизанеAxis приема само продуктови токени EdDSA, подписани с ключ от набора ключове на Hub, издадени от RMM_PLATFORM_URL за аудитория rmm, без предназначение (purpose) (допуск за часовника 30 s). Ролите идват от копието на данните на Hub в Axis, никога от токена; сесиите, прекратени в Hub, се отказват; състоянието на потребителя се проверява отново на всеки 30 s. Чувствителните действия (изтриване на токени за регистриране) изискват step-up токен с валидност две минути, обвързан с потребителя и сесията и използваем веднъж на която и да е реплика; Hub го издава срещу паролата и бисквитката на сесията (същата CSRF защита като при продуктовите токени, ограничение на честотата на заявките като при влизане).
Тайни в покойAES-256-GCM с RMM_MASTER_KEY (идентификаторът на ключа се съхранява за ротация): AD пароли, push токени, имейли в опашката. Hub шифрова своите TOTP seed стойности и имейли с PLATFORM_MASTER_KEY.
Потоци от събития60-секундни токени за поток, обвързани с тенанта (HS256, RMM_JWT_SECRET); продуктовите токени никога не са в URL адреси.
WebSocketНадгражданията (upgrade), започнати от браузър (със заглавка Origin), се отказват.
КачванияБраузър → обектно хранилище с предварително подписан (presigned) PUT; размерът и SHA-256 се проверяват при финализиране; съхраняват се като application/octet-stream; хостът за файлове изпраща sandbox CSP.
ИзтеглянияПредварително подписани връзки с валидност един час, генерирани при доставяне; агентите проверяват SHA-256, преди да изпълнят каквото и да е; конекторът проверява изпратения чрез push MSI пакет.
СамообновяванеИзданията се подписват с Ed25519 при публикуване; проверяват се спрямо публичния ключ, вграден в компилацията; неподписаните компилации отказват обновявания; връщане към предишната версия (rollback) чрез watchdog.
Инжектиране на командиПараметрите на скриптовете пристигат като променливи на средата и JSON файл, никога не се интерполират; метасимволите на cmd се отказват в параметрите за cmd и в аргументите за деинсталиране; деинсталирането по име използва само записи в регистъра за цялата машина; аргументите на shutdown.exe никога не минават през обвивка.
ОтмянаИзвеждането от експлоатация, изтриването на конектор или спирането на тенант затваря връзките и изчиства кешираните ключове на всяка реплика.
ЗаглавияHSTS, строг CSP, DENY за вграждане във frame, nosniff, политики Referrer и Permissions.
ОдитВсяко променящо извикване и всяко създаване на задача се записва в одитния журнал в същата транзакция; за ролята на приложението журналът позволява само добавяне; тайните се редактират.
ЖурналиТайните и подписите на предварително подписаните URL адреси се редактират.

Влизане чрез Entrosity Hub​

Entrosity Hub съхранява идентификационните данни, а Axis не съхранява такива: той проверява токените и чете ролите от своето копие на данните на Hub.

РискМеханизъм
Откраднат продуктов токенПет минути, обвързан с аудитория (безполезен срещу Hub или друг продукт), прекратените сесии се отказват след следващото изтегляне.
Роли в токенитеНяма: понижаване или премахване се прилага при следващото изтегляне плюс 30 s кеш, независимо какво пише в токена.
Използване на бисквитката от друг сайтSameSite=Strict плюс проверка за същия произход (Sec-Fetch-Site / Origin) на всеки маршрут с бисквитка, защото hub., files. и старите хостове manage. и portal. са един и същ сайт.
Ключове за подписванеEd25519 (PLATFORM_JWT_SIGNING_KEY), ротират се чрез _OLD, докато и двата са публикувани; Axis изтегля наново набора ключове при непознат kid най-много веднъж в минута и запазва последния валиден набор.
Вътрешен APIОтделен слушател, към който Caddy никога не маршрутизира (пътят се отказва и на ръба на мрежата), bearer токени за всеки продукт, сравнявани за константно време.
Чувствителни действияStep-up токени: две минути, обвързани с потребителя и сесията, еднократна употреба във всички реплики на Axis.
Закъснение при отмянаДеактивирането на потребител, премахването на роля или излизането достига до Axis в рамките на интервала на синхронизация (30 s) плюс кеша на principal обектите (30 s).
Семантика на копиетоПотребителите, липсващи в snapshot, се маркират като изтрити, а организациите – като спрени; нищо не се изтрива окончателно, така че данните и авторството оцеляват при грешка в платформата.

Верига на доставки​

  • Всеки push и pull request изпълнява govulncheck, gosec, pnpm audit, gitleaks и сканиране с Trivy на продукционните образи (.github/workflows/security.yml), плюс седмично изпълнение.
  • Изданията се блокират при отстраними HIGH/CRITICAL находки в образите, качват се в ghcr.io и се публикуват със SPDX SBOM.
  • Зависимостите са фиксирани (go.sum, pnpm-lock.yaml, digest стойности на образите, deploy/caddy/go.sum) и се обновяват от Dependabot.
  • Образите работят без root права (distroless nonroot бекенд; Caddy с uid 10001).

Пълният преглед с доказателства и препратки към файлове е в Преглед на сигурността (1.0).