Рисунок 2


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

Bug Bounties on Free and Open Source Software — что это такое?


Bug Bounty — это общее название для различных программ, в которых разработчики сайтов и программного обеспечения предлагают денежные вознаграждения за нахождение багов и уязвимостей. Помимо весьма известных Bug Bounty программ от крупных корпораций типа Apple или Microsoft, существуют также программы по поиску уязвимостей в проектах с открытым исходным кодом.

Многие из них можно найти на HackerOne, но, пожалуй, самым крупным является FOSSA — Free and Open Source Software Audit. Это программа по поиску уязвимостей в различных открытых проектах, спонсируемая Европейским Союзом. Суммарный призовой фонд представляет собой внушительную сумму — аж 850 000 евро!

Как принять участие?


Для начала нужно зарегистрироваться на HackerOne. Нам будут нужны именно те проекты, которые имеют открытый исходный код. На HackerOne есть целый список.

Если же есть желание поучаствовать в Bug Bounty от Европейского союза — список проектов, участвующих в этой программе, можно найти вот здесь. Для большинства проектов будет достаточно быть зарегистрированным на HackerOne, но многие их приведенных в том списке программ находятся на сайте intigriti.com.

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

Чтобы найти уязвимость и получить свои деньги, нужно будет всего лишь скачать проект (или клонировать его с GitHub) и тщательно проанализировать каждую строчку кода, исследуя каждое выражение на предмет потенциальных ошибок. Если найдёте что-нибудь, что может повлиять на безопасность программы — оформляйте это в отчет и присылайте разработчикам. Если они оценят вашу находку как стоящую поощрения — ваши денежки у вас в кармане :).

Подождите, а где легкость?


А легкость заключается в том, что анализировать код исключительно вручную вовсе не обязательно. Существуют инструменты, позволяющие искать ошибки в коде в автоматическом режиме. Например — статические анализаторы кода. Я предпочитаю использовать нашу разработку – PVS-Studio. Анализатор PVS-Studio способен находить ошибки в коде, написанном на C++, C# и Java, а также имеет удобный интерфейс. Помимо этого, есть несколько вариантов его бесплатного использования. Также существует и множество других анализаторов кода.

Конечно, статические анализаторы могут выявить далеко не все ошибки. Да и бог с ними! Ведь перед нами стоит цель найти ошибки быстро и просто, а не найти их все.

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

Рисунок 1


Пример фильтрации результатов анализа.

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

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

На скриншоте показан интерфейс Visual Studio. Однако, пусть это не вводит вас в заблуждение. Анализатор можно использовать не только как плагин для Visual Studio, но и самостоятельно, в том числе в среде Linux и macOS.

Плюсы данного подхода


Во-первых, использование статического анализатора — это один из самых простых способов поиска ошибок. Чтобы использовать анализаторы кода, вовсе не обязательно обладать какими-то специальными знаниями: достаточно лишь разбираться в языке, на котором написан проверяемый код.

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

В-третьих, анализаторы зачастую обладают большим знанием, чем человек. Что это значит? Давайте я поясню свою мысль на примере кода из ядра Android:

static void FwdLockGlue_InitializeRoundKeys() {
  unsigned char keyEncryptionKey[KEY_SIZE];
  ....
  memset(keyEncryptionKey, 0, KEY_SIZE); // Zero out key data.
}

Казалось бы, где здесь может быть ошибка?

Оказывается, компилятор, видя, что массив keyEncryptionKey больше нигде не используется, может оптимизировать код и удалить из него вызов функции memset. Причем делать это он будет только при сборке в конфигурации release. Всё бы ничего, да только ключ шифрования на какое-то время останется в оперативной памяти незатёртым, благодаря чему он может быть получен злоумышленником. Настоящая брешь в безопасности!

И ведь найти эту ошибку самому практически невозможно: в режиме отладки вызов memset работает нормально. Да и тесты для этого особо и не напишешь… Остается об этой фиче только знать и помнить самому.

А что, если об этой фиче не знают разработчики проекта? Что, если при поиске багов об этой фиче не будете знать и вы? Анализатору это не важно, потому что у него есть диагностика V597, поэтому во время просмотра отчета вы обязательно о ней узнаете.

Наконец, в-четвертых. Один из самых полезных плюсов применения статического анализа при участии в погоне за Bug Bounty — это скорость. Да, с помощью него можно проверить два, три, четыре проекта за вечер — но это еще не всё.

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

Рисунок 4


Потенциальные уязвимости


Внимательный читатель может озадачиться:

Стоп, стоп! С одной стороны, говорится об поиске в коде ошибок в программах, с другой стороны упоминаются потенциальные уязвимости. Более того, уязвимости более интересны с точки Bug Bounty. Прошу пояснить!

Дело в том, что ошибки и потенциальные уязвимости – это, по сути, одно и тоже. Конечно, только немногие ошибки/потенциальные уязвимости при дальнейшем исследовании могут оказываются настоящими уязвимостями. Однако, безобидный ляп и серьезная уязвимость может выглядеть в коде совершенно одинаково. В статье "Как PVS-Studio может помочь в поиске уязвимостей?" приводится несколько таких (на первый взгляд обыкновенных) ошибок, которые, как теперь известно, являются уязвимостями.

Кстати, согласно докладу National Institute of Standards and Technology (NIST), около 64% уязвимостей в приложениях, связаны именно с программными ошибками, а не с недостатками системы безопасности (not a lack of security features).

Так что уверенно берите в руки PVS-Studio и приступайте к поиску ошибок и дефектов безопасности! В этом, кстати, вам поможет классификация предупреждений согласно CWE.

Заключение


Надеюсь, я помог читателю в поисках того самого бага, который принесет ему немного признания и денежного вознаграждения. Уверен, что статический анализ им в этом поможет! Помните, что у разработчиков, как правило, нет времени на детальный анализ найденных ошибок, поэтому вам еще предстоит доказать, что ваша находка действительно может повлиять на работу программы. Лучшим способом будет наглядно её воспроизвести. И помните: чем сильнее баг в коде может нарушить безопасность, тем больше за неё заплатят.

На этом, пожалуй, всё. Желаю удачи в поисках награды!



Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: George Gribkov. An Easy Way to Make Money on Bug Bounty.

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


  1. xmm10
    21.08.2019 19:00

    И ведь найти эту ошибку самому практически невозможно: в режиме отладки вызов memset работает нормально.


    Обычно те, кто пишет код криптографических алгоритмов уже знают об этом и вызывают эту функцию через volatile указатель :) А как вы определяете, что массив это действительно sensitive data, а не обычный массив? По названию переменной?


    1. eliduvid
      21.08.2019 19:26

      Мне кажется мемсет нулями в область памяти которая потом не используется.


    1. Andrey2008
      21.08.2019 20:12

      Обычно те, кто пишет код криптографических алгоритмов уже знают об этом и вызывают эту функцию через volatile указатель :)
      Ох, если бы. Эта ошибка живёт практически везде. Кстати, не стоит полагаться в этом на volatile. Я не могу доказать, но есть подозрение, что это ненадёжно. Функция то принимает просто void *, что может привести не к тому поведению, которое хотелось.

      А как вы определяете, что массив это действительно sensitive data, а не обычный массив? По названию переменной?
      А никак. Это не требуется. Если что-то чистят и не использую, это явно приватные данные. Т.е. конечно это может быть просто неинтересный массив, который почём зря чистят в самом конце, но на практике такого не бывает. Вот сколько раз срабатывала V597, столько и ошибок. Я не припомню ложных срабатываний.


  1. Amistad
    21.08.2019 20:57
    +2

    Надо же, на hackerone.com есть даже Qiwi.
    Кстати о Киви.
    Однажды завел у них виртуальную кредитку и не мог платить через нее. Через час догадался в чем проблема.
    Спросил у одного кивиста как продать им их же баг, из-за которого я не мог делать платежи. Он отослал к другому. Другой сказал, что это не профиль его отдела и они покупают только дыры в безопасности.
    На этом все. Такой «командный дух» у кивистов.


  1. kay
    21.08.2019 23:38

    Ждем поддержки Go lang.


  1. ooprizrakoo
    22.08.2019 00:07
    +1

    А можно вопрос от гуманитария? то бишь от меня.
    И ответить на него прошу, если это возможно, «гуманитарным» языком :)

    Вопрос вот о чем: с одной стороны, найти ошибки, конечно, ваш анализатор какие-то находит. Где-то выявятся неэкранированные формы, или какие-то граничные случаи вылезут, где-то просто баг в программе который нарушит функциональность. Но вот точно ли эти баги можно использовать именно для нарушения безопасности системы? Типа того, что подать в программу какие-то данные, которые позволят исполнить произвольные команды в система с правами уязвимой программы. Очевидно, как раз это та самая часть, которую надо копать именно человеческим мозгом, а ваш анализатор даст просто намёк что «вот тут скорее всего может быть дыра».

    А вопрос-предложение вот в чем: есть довольно известные уязвимости, которые бомбанули в интернете в прошлом: я помню, какие-то версии proftpd были дырявыми, потом история с openssl, потом с гитом, и тд и тп.
    А можете вы написать статью, которая покажет как именно ваш анализатор мог бы обнаружить именно эти уязвимости? Не просто ошибки, а что-то вроде «как можно было предотвратить CVE-2014-9390». Это было бы интересно, имхо.
    Конечно, если ваш софт умеет работать с тем языком программирования на котором написаны уязвимые сервисы.


    1. Andrey2008
      22.08.2019 09:27
      +1

      Вот статья на эту тему: "Как PVS-Studio может помочь в поиске уязвимостей?". В ней есть примеры, что анализатор мог бы выявить некоторые из известных уязвимость (если бы его использовали :).


  1. AlePil
    22.08.2019 01:06

    Более ужасной и примитивной рекламы pvs-studio я еще не видел. Что, так плохо все с продажей лицензий, что решились поиграть на почве людской лени и жадности типа " купите лицензию и будете в шоколаде, а мы расскажем как". Мне кажется, что это не тот ресурс, где можно так играть на примитивах, или я ошибаюсь и Хабр становится "IT-одноглазники"?


    1. symbix
      22.08.2019 01:27

      Эм, а зачем покупать? Тут более чем достаточно способа с комментарием.


      1. Andrey2008
        22.08.2019 09:29

        1. symbix
          22.08.2019 15:52

          "Бесплатная лицензия не распространяется на зеркала проектов" — вот тут проблемка, откуда у меня возьмется доступ к основному репозиторию проекта (если речь о bug bounty)? А с форком не прокатит ведь, верно?


          1. Andrey2008
            24.08.2019 16:29
            +1

            Всегда хочется найти повод, чтобы оправдать бездействие. Не выйдет :). Держите:

            Name: symbix
            Key: KRA0-4XH6-1K7G-SUG6
            License Type: Team9 License up to 9 developers
            License Valid Thru: Sep 24, 2019

            Будет мало — приходите, ещё сгенерирую.


            1. symbix
              24.08.2019 19:48

              Фига себе! :-)


              Спасибо!


  1. iig
    22.08.2019 11:41
    +3

    Легкий способ заработка в интернете без вложений ;)

    Не хватает картинки с подростком и кучей денег.
    image


  1. Tangeman
    22.08.2019 18:14

    Да, с помощью него можно проверить два, три, четыре проекта за вечер — но это еще не всё.

    Зависит от размера проекта. А если учесть что PVS Studio выдает газиллионы ложных сообщений, которые при ручной тщательной проверке оказываются и не ошибками вовсе (или просто ложными) — то о скорости проверки можно забыть, потому что каждое сообщение нужно «помыть и завернуть», причём зачастую для этого требуется ощутимое время.

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


    1. Andrey2008
      22.08.2019 18:41

      Про ложные срабатывания. Любой статический анализ требует предварительной настройки. И да, конечно, если взять проект размера Chromium, то его хватит не на день, а на месяц :). Я в процессе последней поверхностной проверки в 2018 году написал про него цикл из 7 статей: 1, 2, 3, 4, 5, 6, 7.

      Да, найти уязвимость непросто. Только очень маленькое количество ошибок представляет собой угрозу. Однако, без статического анализа начать их искать ещё сложнее. За что зацепиться? С чего начать? Статический анализатор подбрасывает информацию (дефектный код) для дальнейшего изучения и исследования.


  1. perfect_genius
    24.08.2019 16:15
    +1

    Если бы вы сами находили уязвимости и зарабатывали на этом, то не хотели бы конкурентов в лице нас, не так ли?


    1. Andrey2008
      24.08.2019 16:25
      +1

      Нет, нет, это не наше. Мы продаём лопаты. :)