Positive Technologies на GitHub

    Поздравляю программистов с их профессиональным днем! В связи с этим праздником наша компания Positive Technologies решила рассказать о своей деятельности, напрямую связанной с разработкой, а именно с открытым исходным кодом и GitHub.


    Positive Technologies  GitHub


    В последнее время все больше и больше компаний, таких как Google, Microsoft, Facebook, JetBrains, выкладывают в открытый доступ исходный код как небольших, так и крупных проектов. Positive Technologies славится не только высококлассными специалистами по информационной безопасности, но и большим количеством профессиональных разработчиков. Это позволяет ей также вносить свой посильный вклад в развитие движения Open Source.


    У PT есть следующие GitHub-организации, поддерживающие открытые проекты компании:



    Мы подробно описали первую организацию с ее проектами и кратко — все остальные.


    Содержание



    Организации


    Positive Technologies


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


    Open DevOps Community


    Open DevOps Community

    Цель сообщества — сформировать открытые готовые решения для управления полным циклом процесса разработки, тестирования и смежных процессов, а также доставки, развёртывания и лицензирования продуктов.


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


    Активные проекты:


    1. crosspm — универсальный пакетный менеджер, который позволяет скачивать пакеты для сборок многокомпонентных продуктов, используя правила, заданные в манифесте.
    2. vspheretools — инструмент, который позволяет управлять виртуальными машинами на vSphere прямо из консоли. Также есть возможность подключать его как API-библиотеку в своих Python-скриптах.
    3. YouTrack Python 3 Client Library — Python-клиент для работы с API YouTrack.
    4. TFS API Python client — Python-клиент для работы с API Team Foundation Server от Microsoft.
    5. A Python client for Artifactory — Python-клиент для работы с API хранилища бинарных данных Artifactory.
    6. FuzzyClassificator — универсальный нейронечёткий классификатор произвольных объектов, свойства которых могут быть оценены на нечёткой измерительной шкале.

    Каждый инструмент имеет автоматическую сборку в Travis CI с выкладкой в PyPI-репозиторий, где их можно найти и установить через стандартный pip install.


    Готовятся к публикации еще несколько инструментов:


    1. CrossBuilder — система организации кросс-платформенных сборок build as a code, а-ля Travis CI, но независящая от используемой CI-системы (TeamCity, Jenkins, GitLab-CI и т. п.).
    2. ChangelogBuilder — генератор релиз-нотов с описанием изменений по продукту, который получает и агрегирует данные из различных трекеров (TFS, YouTrack, GitLab и т. п.).
    3. polyglot.sketchplugin — плагин для системы Sketch, которым пользуются дизайнеры для упрощения работы с мультиязычной вёрсткой.

    В качестве контрибьюторов любого инструмента приглашаются все желающие. У нас есть типовой проект ExampleProject, в котором содержатся общая структура и подробная инструкция по созданию собственного проекта в сообществе. Фактически достаточно его скопировать и сделать свой проект по аналогии. Если у вас есть идеи или инструменты для автоматизации чего-либо, давайте делиться ими с сообществом под MIT-лицензией! Это модно, почётно, престижно :)


    Positive Research


    Репозиторий, в котором публикуются некоторые исследовательские наработки, презентации, утилиты (например, для определения уязвимостей), сигнатуры и методы определения атак.


    • Pentest-Detections — утилита, позволяющая быстро сканировать сеть (поддерживаеются IPv4 и IPv6) и определять уязвимости, которые эксплуатируют WannaCry, NotPetya.
    • unME11 — инструменты, позволяющие декодировать последние версии Intel ME 11.x.
    • Bad_Tuesday_Cryptor_SIEM — пакет MaxPatrol SIEM для борьбы с NotPetya.
    • me-disablement — методы отключения Intel ME. В репозитории старый метод. Про новый метод с High Assurance Platform (HAP) можно почитать на хабре в статье Выключаем Intel ME 11, используя недокументированный режим.

    AttackDetection


    В этот репозиторий команда обнаружения атак выкладывает правила для определения эксплуатации уязвимостей с помощью систем обнаружения вторжений Snort и Suricata IDS. Основная цель проекта — создание правил для уязвимостей, имеющих широкое распространение и высокий уровень опасности (high impact). Репозиторий содержит файлы для интеграции с oinkmaster — скриптом для обновления и развертывания правил в указанных IDS. А для теста самих правил прилагаются pcap-файлы с трафиком. Стоит отметить, что репозиторий уже набрал свыше 100 добавлений в избранное, а за год добавилось около 40 новых уязвимостей, среди которых BadTunnel, ETERNALBLUE, ImageTragick, EPICBANANA, SambaCry. Все анонсы о новых угрозах публикуются в Twitter.


    Positive JS


    Сообщество по разработке инструментария (преимущественно веб), используемого в продуктах PT.


    LibProtection


    Организация, объединяющая участников сообщества Positive Development User Group,
    работающих над реализациями библиотеки LibProtection под различные языки и платформы.
    Эта библиотека предоставляет разработчикам безопасные средства работы со строками,
    и берёт на себя всю рутину по санитизации входных данных и автоматизированной защите
    приложений от атак инъекций. Более подробно принципы работы и функциональные
    возможности LibProtection были описаны в докладе Владимира Кочеткова "Побеждая инъекции".


    Проекты


    PT.PM


    PT.PM Logo

    PT Pattern Matching Engine — универсальный сигнатурный анализатор кода, который принимает на вход пользовательские шаблоны, описанные на специальном языке. Данный движок испольуется в бесплатном инструменте для проверки веб-приложений на наличие уязвимых компонентов Approof, а также в анализаторе исходного кода PT Application Inspector.



    Процесс анализа состоит из нескольких этапов:


    1. Парсинг исходного кода в дерево разбора.
    2. Преобразование дерева в унифицированный формат.
    3. Сопоставление дерева с пользовательскими шаблонами.

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


    В PT.PM внедрена непрерывная интеграция, поддерживаются сборка и тестирование модулей проекта как под Windows, так и под Linux (Mono). Процесс разработки организуется с помощью размеченных метками задач (Issues) и пул-реквестов. Наряду с разработкой ведется документация проекта, а результаты всех значимых сборок публикуются в формате как пакетов NuGet, так и «сырых» артефактов. Организацию PT.PM, вероятно, можно считать образцовой, к которой хотелось бы стремиться во всех остальных проектах.


    Для первого этапа, а именно парсинга исходного кода, используются парсеры на базе ANTLR. Этот инструмент генерирует их для различных языков (рантаймов) на основе формальных грамматик, для которых существует репозиторий. Наша компания его активно развивает. В настоящее время поддерживается генерация под Java, C#, Python 2 и 3, JavaScript, C++, Go и Swift, причём поддержка последних трех была добавлена совсем недавно.


    Стоит отметить, что ANTLR используется не только в проектах PT направления Application Security, но и в Max Patrol SIEM: там он используется для обработки собственного языка DSL (Domain Specific Language), который применяется для описания динамических групп активов. Обмен опытом в этой сфере позволил не тратить время на задачи, которые уже были решены ранее.


    Грамматики ANTLR


    При участии Positive Technologies были разработаны и улучшены грамматики для языков PL/SQL, T-SQL, MySQL, PHP, Java 8 и C#.


    PL/SQL


    Грамматики SQL имеют обширный синтаксис с большим количеством ключевых слов. К счастью, грамматика PL/SQL существовала под ANTLR 3 и портировать её под ANTLR 4 было не очень сложно.


    T-SQL


    Для T-SQL не было найдено достойных парсеров, не говоря уже об открытых, и мы долго и кропотливо восстанавливали грамматику из документации MSDN. Однако результат получился достойным: она уже охватывает много распространённых синтаксических конструкций, опрятно выглядит, независима от рантайма и покрыта тестами (примерами SQL-запросов из той же MSDN). С 2015 в нее внесли свой вклад более 15 сторонних пользователей. Более того, эта грамматика сейчас уже используется и в DBFW, прототипе межсетевого экрана уровня систем управления базами данных, подпроекте PT Application Firewall. Денис Колегов с Арсением Реутовым рассказывали о нем на PHDays VII: «Как разработать DBFW с нуля».


    MySQL


    Грамматика, разработанная вышеупомянутой командой, в первую очередь Иваном Худяшовым и Денисом Колеговым, на основе T-SQL. Она также используется в DBFW.


    PHP


    Данная грамматика транслировалась из грамматики Bison в ANTLR. Она интересна тем, что поддерживает парсинг сразу PHP, JavaScript и HTML. Точнее, участки кода JavaScript и HTML парсятся в текст, который позже обрабатывается парсерами конкретно под эти языки.


    Java


    Грамматика с поддержкой Java 8 была разработана совсем недавно. За основу была взята грамматика предыдущей седьмой версии. Однако в новой значительно расширены и улучшены тестовые примеры с различным синтаксисом (AllInOne7.java, AllInOne8.java), а также добавлены результаты тестов производительности для популярных проектов на Java (jdk8, Spring Framework, Elasticsearch и т.д.).


    JavaScript


    Создана на основе старой грамматики ECMAScript без точного соответствия стандарту. При разработке грамматик мы прежде всего руководствуемся практическим применением и понятностью, а не формальным соответствием. Еще одним существенным отличием является почти полная поддержка ECMAScript 6, а также устаревших конструкций (комментарии Html, секции CDATA).


    Не все синтаксические конструкции можно описывать только лишь с помощью правил грамматики. В некоторых ситуациях удобно и необходимо использовать вставки кода на целевом языке рантайма. Например, в JavaScript токен get в одних случаях являться обычным идентификтаором, а в других — ключевым словом, описывающий getter у свойства. Т.е. данный токен можно парсить как общий идентификатор, а в парсере проверять значение токена при обработке свойства:


    getter
        : Identifier{p("get")}? propertyName
        ;

    Данная грамматика интересна тем, что эти вставки кода являются универсальными по крайней мере для рантаймов C# и Java, благодаря опции
    superClass.


    Т.е. в C# коде функция p("get") описывается в классе-родителе JavaScriptBaseParser.cs:


    protected bool p(string str) =>  _input.Lt(-1).Text.Equals(str);

    В Java же эта функция выглядит следующим образом (JavaScriptBaseLexer.java):


    protected boolean p(String str) {
        return _input.LT(-1).getText().equals(str);
    }

    C#


    Это по большей части экспериментальная грамматика, созданная для сравнения скоростей парсеров на основе ANTLR и парсера Roslyn.


    Разработка и перспективы


    ANTLR Logo

    О деталях разработки грамматик можно почитать в нашей прошлогодней статье «Теория и практика парсинга исходников с помощью ANTLR и Roslyn».


    Как видно по истории изменений и большому количеству принятых Pull Request (tsql, plsql, mysql), эти грамматики дорабатываются не только усилиями Positive Technologies, но и большим количеством сторонних разработчиков. За время этой кооперации репозиторий вырос не только количественно, но и качественно.


    PT.SourceStats


    Позволяет собирать статистику для проектов на различных языках программирования и используется в бесплатном продукте Approof.


    AspxParser


    В рамках данного проекта разрабатывается парсер страниц ASPX, который используется не только в открытом движке PT.PM, но и во внутреннем анализаторе .NET-приложений (AI.Net), основанном на абстрактной интерпретации кода.


    FP Community Rules


    Approof Logo

    В репозитории идет разработка наборов правил в формате YARA, которые используются в модуле сигнатурного анализа проектов в Approof. В августе прошлого года в рамках PDUG (юзер-группы по безопасной разработке) Алексей Гончаров делал доклад о модуле FingerPrint, используемом в PT AI и Approof.


    Движок FingerPrint запускается на наборе исходных кодов сайта (бэкенда, фронтенда) и в соответствии с описанными правилами YARA ищет известные версии сторонних компонентов (например, библиотеку bla-bla версии 3). Правила составляются так, что содержат сигнатуры уязвимых версии библиотек с текстовым описанием проблемы.


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


    Подробнее об этом можно почитать в статье Дениса Ефремова (ИСП РАН) «Разработка правил для Approof». Также см. его доклад «Автоматизация построения правил для Approof» на PDUG секции PHDays.


    Учебно-демонстрационные проекты


    На PHDays VII в рамках PDUG прошел мастер-класс «Appsec Outback». Для него были разработаны учебно-демонстрационные версии статического анализатора кода Mantaray и межсетевого экрана Schockfish. Данные проекты имеют все основные механизмы, которые используются в реальных средствах защиты. Но, в отличие от последних, их основная цель продемонстрировать алгоритмы и методы защиты, помочь понять процесс анализа и защиты приложений, а также проиллюстрировать фундаментальные теоретические возможности и ограничения технологий.


    Также в репозитории имеются примеры реализации механизмов защиты:


    • DOMSanitizer — модуль для обнаружения XSS-атак на стороне веб-браузера.
    • DOMParanoid — модуль (security linter) для проверки безопасности HTML.

    Лицензия


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


    Заключение


    Процесс переезда на GitHub оказался полезным и дал нам опыт в различных областях — в настройке DevOps под Windows и Linux, написании документации, в разработке.


    Positive Technologies развивает Open Source проекты и планирует расширять эту активность.

    • +33
    • 8,6k
    • 3
    Positive Technologies 397,93
    Компания
    Поделиться публикацией
    Комментарии 3
    • +8

      Про TSQL. С одной стороны всё так: и не найти приличных, и в вашем репозитории видно старание, аккуратность и объём проделанной работы, но… Но нельзя просто так взять и написать парсер SQL :)
      15 минут посмотрел на лексер и уже вижу не менее 5 ошибок:


      Спрятал тут
      1. Идентификаторы с "[]". Закрывающая скобка может быть частью идентификатора


        select 42 as [Look here []]]

        Вывод


        Look here []
        ------------
        42

      2. Числа:


        select 1e -- у вас это не число
        select 1e- -- у вас это не число

      3. Пустое место. Неразрывный пробел MS SQL воспринимает как пробел. Стоит отметить, что есть и дргие "пробелы"
        declare @sql nvarchar(max)
        set @sql = N'select 1' + char(160) + N'a'
        print @sql
        exec (@sql)
      4. BINARY BASE64 воспринимается как одна лексема. Конкретный сценарий неправильного парсинга надо подбирать, но, как минимум, несколько пробелов там допустимы.
      5. Комментарии. У вас `'/' .? '*/', а на самом деле возможны вложенные комментарии.
        /* SELECT 'Hello' /* */ SELECT 'Protected by PT' --*/ SELECT 'Executed by someone'

        Ваш лексер будет думать, что выведется 'Protected by PT', а на самом деле 'Executed by someone'. И эти люди защищают нас от инъекций??? Простите, не удержался :)



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


      • Парсеры без ошибок писать сложно. Чертовски сложно даже для тех, кто, наверное, должен уметь писать безопасные парсеры.
      • Язык TSQL — ад для перфекционистов-парсерописателей.
      • Open-Source рулит, потому что в закрытом коде эти проблемы просто бы скрылись.
      • Я зануда и у меня просто глаз набит (да, я видел очень немного грамматик/парсеров, в которых бы я не находил ошибок).

      PS: Правки достаточно простые, я попробую найти время на выходных для PR в github, но не обещаю.

      • 0

        Спасибо за подмеченные ошибки, будем рады любой помощи :)

        • +2
          По моему это круто, когда кто-то может вот так бегло посмотреть твою работу и ткнуть пальцем — «типа вот тут и тут у тебя косяк».

          За одно это стоит всячески поддерживать open source.

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

        Самое читаемое