CB2FA — двухфакторная аутентификация через сообщество (без телефонов и кодов)

В большинстве реализаций 2FA всё держится на устройствах и секретах: телефонах, кодах, токенах. Это удобно, пока не теряешь доступ. А что если бы вторая проверка шла не через устройство — а через людей, которым ты доверяешь?

Так появилась CB2FA (Community-Based Two-Factor Authentication) — проект, где вход подтверждается живыми людьми в Matrix-чате. Без телефонов. Без TOTP. Без внешних сервисов.


? Как это работает

  1. Пользователь вводит логин и пароль (как обычно)

  2. Вместо выдачи токена, запрос уходит в Matrix-комнату, где сидят доверенные участники

  3. Они видят таблицу с деталями запроса и голосуют: y или n

  4. После кворума (или 1 ответа, если настройка такова) — доступ разрешается или отклоняется


? Архитектура

  • Bot — Deno-приложение, отправляющее запросы в Matrix

  • Middleware — перехватывает логин в Synapse и запускает 2FA-процесс

  • Очередь — чтобы не спамить комнату, обрабатывается один запрос за раз

  • Интернационализация — 7 языков, переключаются через переменные среды


? Где это уже работает

  • Matrix — полноценная реализация через Synapse + nginx + bot + middleware

  • Telegram / Discord / Slack / Webhook — в планах


? Установка (Matrix-режим)

git clone https://github.com/EPTLLC/cb2fa.com
cd cb2fa
cp .env.example .env
# правим настройки, запускаем:
deno run --allow-net --allow-env --allow-read src/main.ts
# отдельно — middleware:
deno run --allow-net --allow-env --allow-read middleware/middleware.ts

nginx перенаправляет /login на middleware, который всё координирует.


? Зачем это нужно

  • Нет зависимости от устройств и приложений

  • Можно использовать в airgapped-сетях

  • Можно поставить в командных или корпоративных средах

  • Идеально для закрытых Matrix-инстансов


? Лицензия и поддержка

MIT License. Проект свободен, открыт и не сопровождается.
Нет поддержки. Нет объяснений. Но есть документация — и пулреквесты приветствуются.

GitHub: https://github.com/EPTLLC/cb2fa.com

Комментарии (16)


  1. home14352
    30.06.2025 14:16

    А вдруг что-то не так им сделал, и бам! Сразу потерял доступ ко всем аккаунтам


    1. easyprotech Автор
      30.06.2025 14:16

      Даже затрудняюсь что либо ответить) Что можно не так сделать отпраляя в чат Y или N? ) После отправки N - пользователь может повторить запрос повторно, нажмете Y)


      1. arokettu
        30.06.2025 14:16

        можно поссориться с людьми и они не пустят вас в ваш аккаунт


        1. easyprotech Автор
          30.06.2025 14:16

          Вы описываете не техническую уязвимость, а социальную модель доверия, которая существует в любой системе восстановления доступа.
          Ссориться с доверенными лицами — плохая идея не только в CB2FA, но и в жизни.

          CB2FA не исключает резервных путей:

          • можно назначить несколько комнат,

          • разных участников,

          • fallback-механизмы (например, временные коды или подключение админа).

          Это так же, как с мультисиг-кошельками или DAO-голосованиями: если доверие потеряно — пересобирается структура.

          В централизованных системах вы теряете доступ, если у вас нет SMS или почты. В CB2FA вы сами формируете круг доверия. Это гибче.


          1. arokettu
            30.06.2025 14:16

            Вообще я просто пересказал как понял комментарий @home14352.

            если доверие потеряно — пересобирается структура

            Посмотрите на это с обратной стороны — я уговорил людей в чате пустить меня в ваш аккаунт. Структура-то может и пересоберется, но что толку если я уже сделал там что хотел. Резервные пути тут не помогут, разве что вы предложитве ввести уже трёхфакторку, но зачем тогда этот второй фактор? Я бы предпочел иметь вторым фактором код, который невозможно уговорить или подкупить в отличие от человека или нейронки, и значительно сложнее обмануть.

            В централизованных системах вы теряете доступ, если у вас нет SMS или почты.

            Поэтому я использую децентрализованные — WebAuthn и TOTP (с автоматическим бэкапом)


            1. easyprotech Автор
              30.06.2025 14:16

              По умолчанию доступ к системе разрешает или запрещает администратор. В структурах, где "любой пользователь в чате" может предоставить доступ, такие подходы тоже существуют, но мы говорим о другом аспекте.

              Представим, что вы - администратор, а я пытаюсь войти в систему. Пока вы не подтвердите мой доступ, я не смогу войти. По мере роста команды вы можете делегировать мне право подтверждать доступ новым пользователям. Тогда любой, кто хочет присоединиться, должен связаться с вами или со мной для подтверждения - по любому каналу связи: телефону, Telegram, WhatsApp или другим.

              Мы говорим о надстройке над стандартной двухфакторной аутентификацией (2FA), которую мы называем Community-Based Two-Factor Authentication (CB2FA). Это не замена классической 2FA (хотя в некоторых случаях может использоваться как единственный механизм, в зависимости от структуры), а дополнительный уровень защиты - последний рубеж. Вы можете продолжать использовать привычные методы аутентификации, но для критически важных систем CB2FA добавляет надежности.

              Особенно это актуально для Matrix. В отличие от стандартных решений, где 2FA часто требует интеграции сторонних сервисов, наша надстройка полностью реализована внутри сервера, без внешних зависимостей. Простыми словами: зачем использовать приватность Matrix, если я сам раскрываю связь своего аккаунта с номером телефона или почтой? CB2FA устраняет эту проблему, обеспечивая контроль доступа без компрометации личных данных.


              1. arokettu
                30.06.2025 14:16

                так у вас обычный admin approval, реализованный через бота, а вы ему аббревиатуру придумали

                Это не замена классической 2FA

                Если это не замена 2fa или не реализация 2fa, почему вы называете ее 2fa?

                дополнительный уровень защиты

                третий фактор, как я и говорил


              1. arokettu
                30.06.2025 14:16

                Я кстати не большой знаток Матрикса, но я не помню чтобы там мейл/телефон для 2фактора использвали, это обычно механизмы сброса пароля


              1. arokettu
                30.06.2025 14:16

                По умолчанию доступ к системе разрешает или запрещает администратор. В структурах, где "любой пользователь в чате" может предоставить доступ, такие подходы тоже существуют, но мы говорим о другом аспекте.

                У вас в дизайне другое написано:

                Community platform membership = CB2FA approval rights


            1. easyprotech Автор
              30.06.2025 14:16

              1. Frontend (Matrix-клиент, например, Element):

                • Пользователь видит только поле для логина и пароля.

                • После отправки формы запрос уходит на сервер Matrix (Synapse), где middleware берёт на себя обработку.

              2. Middleware (на Deno):

                • Проверяет логин/пароль через Synapse.

                • Если 2FA включена, middleware:

                  • CB2FA: Отправляет запрос в Matrix-комнату (например, "Подтвердить вход для @user:example.com? y/n"). Ждёт ответа от доверенных лиц.

                • Если 2FA не пройдена, middleware возвращает Synapse ошибку "Invalid credentials", которую клиент показывает как "Ваши данные неверны".

              3. Backend (Matrix-комната и приложение):

                • CB2FA: Бот в комнате собирает голоса (y/n) и передаёт результат middleware. Всё происходит в зашифрованной комнате с E2EE.

              4. Обработка ошибок:

                • Если пароль неверный, CB2FA отклоняет запрос, пользователь видит одну и ту же ошибку: "Ваши данные неверны".

                • Это делает невозможным для атакующего понять, на каком этапе он провалился.

              Примерный флоу для пользователя

              • Сценарий 1: Используешь CB2FA:

                • Вводишь логин/пароль.

                • Middleware отправляет запрос в комнату: "Подтвердить @user? y/n".

                • Доверенные лица отвечают "y", ты получаешь доступ.

                • Если ответили "n" или никто не ответил, опять же "Ваши данные неверны".

              • Сценарий 2: Атакующий:

                • Пробует подобрать логин/пароль.

                • Даже если угадал, без CB2FA или подтверждения из приложения доступ не получить.

                • Ошибка всегда одна: "Ваши данные неверны", и он не знает, что не так.

              Плюсы этого подхода

              • Обман атакующего:

                • Единая ошибка и отсутствие видимого второго фактора делают систему устойчивой к разведке (reconnaissance). Атакующий не знает, что атаковать дальше — пароли, TOTP, или пытаться манипулировать сообществом.

              • Простота для пользователя:

                • Нет лишних шагов вроде ввода кодов. CB2FA вообще не требует действий от пользователя.

              • Высокая безопасность:

                • Даже если пароль скомпрометирован, без второго фактора доступ невозможен.

              • Приватность:

                • Никаких внешних сервисов, всё внутри Matrix.


              1. arokettu
                30.06.2025 14:16

                Это делает невозможным для атакующего понять, на каком этапе он провалился.

                Не увидел у вас защиты от тайминг атаки, к тому же она обходится элементарно -- если мне надо проверить пароль, я просто залогинюсь ночью. Какой бы эмулятор задержки у вас ни стоял, совершенно непрактично делать задержку несколько часов.

                Атакующий не знает, что атаковать дальше — пароли, TOTP, или пытаться манипулировать сообществом

                совершенно точно не totp, т.к. я его нигде не вводил, и скорее всего не пароль, т.к. если я пытаюсь войти, я его уже где-то украл


              1. arokettu
                30.06.2025 14:16

                CB2FA вообще не требует действий от пользователя.

                Но требует действий от других людей, которые могут не хотеть в данный момент делать действия


  1. cliver
    30.06.2025 14:16

    В том виде, в каком это подано - сомнительно выглядит. Для надежности должен быть побочный канал связи с доверенными лицами, собственно через который происходит аутетификация (переводя на обычный язык если вы в комнате скажем с человеком лично находитесь и сомнений нет, что именно он сделает запрос в чатик, либо у вас есть канал связи через другой доверенный мессенждер). Второй фактор сводится именно к этому каналу связи и надежности доверенных лиц.


    1. easyprotech Автор
      30.06.2025 14:16

      Вы посмотрели код?

      Если кратко — именно в этом и смысл. Второй канал связи не фиксирован и никому не известен, включая атакующего. Он не прописан в системе, не хранится в базе и не передаётся по сети.

      Авторизовать может:

      • коллега за соседним столом,

      • жена по звонку,

      • друг в Telegram,

      • даже охранник у турникета — если вы так договорились.

      CB2FA не навязывает канал, а использует любую доступную вам надёжную коммуникацию вне текущего цифрового контекста.
      Хотите — используйте Matrix, хотите — Discord, хотите — голосом или жестом.

      Система просто ждёт подтверждение из доверенной комнаты. Откуда и как инициируется голос — не важно.
      Важно то, что вы сами выбираете, кому доверять, и как именно подтверждать вход.

      В этом и есть сила: второй фактор полностью отделён от первого и не предсказуем извне.


      1. cliver
        30.06.2025 14:16

        Ну в статье явно про это не было намека собственно, поэтому и написал. Если люди в чатике будут просто тупо доверять любому "залогиньте меня" сообщению то это теряет смысл, поэтому побочный доверенный канал и осведомленность операторов о протоколе аутентификации являются необходимыми условиями безопасности.


        1. easyprotech Автор
          30.06.2025 14:16

          Вы соверешенно правы, и все правильно поняли. При всей моей личной любви к опенсорсу, если кто то то не понял - ну вы меня понимаете, подкачают пусть знания. Ну и естесвенно это не наша реальная комерческая модель которую мы релизуем в своих проектах, а опенсор что бы было легче и понятнее куда двигаться сообществу. Я сегодня или завтра напишу и статью и выложу еще код, я заканчиваю еще несколько серьезных решений которые закроют вообще все проблемы и дырки матрикса. Я вообще очень верю в этот протокол, так как именно как протокол - он практически идеален.