Моё приложение представляет собой каталог, который объединяет профили исследователей безопасности с различных платформ, таких как HackerOne, Bugcrowd, GitHub и других. Фронтенд подключается к Supabase, и я создал его с помощью инструментов Lovable и Cursor. Вся автоматизация, которая подает данные в базу данных, обрабатывается отдельно.

Изначально я планировал разрешить пользователям самостоятельно регистрироваться через Supabase Auth и запрашивать профили, которые они хотели бы агрегировать. Но в процессе реализации я понял: это создаёт риски, ведь нужно корректно управлять как аутентификацией (какой именно пользователь), так и авторизацией (что ему разрешено). Я отказался от саморегистрации… но упустил важную деталь. (Подробнее об этом чуть позже.)

Баг №1: Утечка email-адресов

На первом тесте пользователи проходили аутентификацию через Supabase, что требовало реальных email-адресов. При анализе сетевых запросов я заметил, что ответы от таблицы profiles содержали email-поля пользователей. Это очевидно плохо, особенно если бы кто-то действительно доверил мне личные данные.

Чтобы исправить это, я создал PostgreSQL-представление, которое запрашивало только нужные мне поля из профилей, исключая email. Фронтенд начал запрашивать данные через это представление. Казалось, стало безопаснее… но на самом деле — только хуже. (Скоро поймёте почему.)

Запуск и первая компрометация

После перехода на представление и удаления возможности добавления данных с фронтенда, я запустил приложение. У меня была включена безопасность на уровне строк (Row-Level Security, RLS), и я считал, что доступ «только для чтения» сделает систему безопасной. Однако через 24 часа исследователь по безопасности показал, что можно вставлять, обновлять и удалять записи, хотя фронтенд не предоставлял такие эндпоинты, а RLS должна была это блокировать.

Почему это сработало? Проблема была в том, что созданное мной представление игнорировало RLS.

По умолчанию PostgreSQL-представления выполняются с привилегиями владельца. В моём случае — это была админская роль. Если не указать SECURITY INVOKER или не настроить доп. защиту, политики RLS таблиц обходятся. Это и стало критической ошибкой конфигурации. Я исправил это, отозвав небезопасный доступ к представлению и перестроив логику запросов данных. Респект исследователю, который ответственно сообщил об уязвимости — @Goofygiraffe06.

Вторая компрометация

На следующий день другой исследователь (@Kr1shna4garwal) сообщил: он смог создать новые профили в базе данных. К счастью, он не мог редактировать или удалять существующие. Причина была не в представлении таблицы. Я просто забыл отключить Supabase Auth, хотя уже убрал регистрацию из фронтенда. Это означало, что злоумышленники всё ещё могли регистрироваться через email/password, получая роль аутентифицированного пользователя — и доступ в рамках RLS. Я отключил регистрацию в настройках Supabase Auth. Проблема решена.

Главное, что я вынес из этого:

  • Вайбкодинг позволяет быстро запускать продукты, но дыры в безопасности — это норма по умолчанию.

  • Supabase и PostgreSQL — мощные инструменты, но их легко настроить неправильно, если не разбираться в модели безопасности, особенно в работе представлений и RLS.

  • Если используете представления PostgreSQL, помните: они не учитывают политики RLS по умолчанию.

  • Отключайте Supabase Auth, если вы им не пользуетесь — даже если интерфейс не показывает такой возможности.

  • Threat modeling — обязателен. Моё приложение работает только с публичными данными, поэтому ущерб был минимален. Но если бы речь шла о персональных данных (PII) или медицинской информации (PHI), такая уязвимость могла бы стать катастрофой.

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


  1. azzas
    03.06.2025 14:48

    Хабр прекращается в какой то личный блог, прости Господи, "вайбкодеров".

    На IXBT автоновости.

    На Overclockers рассказывают про политику и успехи СВО.

    Чо происходит?


    1. temadiary
      03.06.2025 14:48

      лишь пикабу и удаффком верны себе


      1. Wesha
        03.06.2025 14:48

        Дайте время — и снизу постучат!


      1. poriogam
        03.06.2025 14:48

        Пикабу зигует почти как первый канал.


    1. Wesha
      03.06.2025 14:48

      Чо происходит?

      Приходит дивный новый мир.

      Если дать строить дома тем, кто *не представляет, как нужно строить дома*


      1. Owleyeinnose
        03.06.2025 14:48

        это кадр из идиократии, нещитово. Люди изначально не очень умеют в строительство/подставьте своё/, они этому обучаются. Ну упадет десяток домов, зато двадцатый будет хорош! Главное чтобы жертв не было)


        1. Wesha
          03.06.2025 14:48

          Люди изначально не очень умеют в строительство/подставьте своё/, они этому обучаются.

          Ви таки будете смеяться, но изначально люди умеют только дышать и сисю сосать — всему остальному они обучаются.

          Ну упадет десяток домов,

          Над этим уже работают!


          1. Metotron0
            03.06.2025 14:48

            Видел на ютубе сюжет про ребёнка (кажется), который не умеет дышать автономно и вынужден делать это сознательно, а во время сна включать дыхательный аппарат.


    1. achekalin
      03.06.2025 14:48

      Бабки всем нужны


    1. turbo_f
      03.06.2025 14:48

      Хабр стал не «личным блогом вайбкодеров». Просто до Хабра дошла зараза, которая страшнее поноса - инфантильные/соевые/прогрессивные котятки, которые научились трепать языком, чтобы проходить собеседования, а разбираться в чём-то и работать не научились.

      По этому на Хабре вы видите посты «йоу, я вайбкодер, своя апка за 5нс», «ой, я вайбово обосрался на безопасности».

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


  1. MountainGoat
    03.06.2025 14:48

    Я запустил базу данных с доступом к админке без пароля. Кто виноват? ИИ!


    1. Wesha
      03.06.2025 14:48

      Я запустил базу данных с доступом к админке без пароля. Кто виноват? ИИ!

      — А чё он не предупредил, что так низзя?
      — А чё ты в промпте не написал «сделай мне приложение.... и чтобы без дырок в безопасности!»?


      1. pnmv
        03.06.2025 14:48

        Он так и написал - "чтобы без дырок и безопасности"


        1. DissXX
          03.06.2025 14:48

          Вот только ИИ не понимает отрицание))


          1. pnmv
            03.06.2025 14:48

            когда сберовский конь-динь-ский мне картинки генерит, то одинаково верно воспринимает, и "негативный промпт", и отрицание в основном запросе. даже глючит единообразно и с одинаковой вероятностью.


            1. DissXX
              03.06.2025 14:48


              1. pnmv
                03.06.2025 14:48

                некачественный запрос.


                1. DissXX
                  03.06.2025 14:48

                  Это пример. Нейросеть просто учится на положительном подверждении(RLHF). С отрицанием у них прям проблемы.


                  1. pnmv
                    03.06.2025 14:48

                    по моим запросам, как правило, генерирует примерно то, чего ожидаю.

                    негативный промпт - пуская трата времени, в случае сберовской игрушки, поэтому изменяю основной запрос, меняя местами словосочетания и по-разному расставляя запятые.

                    другое дело, что мои запросы - не про котиков и их отсутствие, и не про "нарежь апельсин на четыре кофемашины".


  1. ramil_trinion
    03.06.2025 14:48


  1. clx
    03.06.2025 14:48

    Вы были из секты свидетелей отличий авторизации от аутентификации и даже это не уберегло вас, а что будет если совсем несведущие люди буду вайбкодить?


    1. g0gan
      03.06.2025 14:48

      Это перевод. Не разговаривайте с копипастой


      1. Metotron0
        03.06.2025 14:48

        А я думал, там реально ссылка на хабропрофиль.


    1. pnmv
      03.06.2025 14:48

      Пусть побольше делают это. Побольше и почаще. Самое главное - вайб и вера в великие мощи ии.


  1. altaastro
    03.06.2025 14:48

    Подскажите, пожалуйста, как можно ударить человека через интернет?