Научно-технический вебинар "Идентификация автора исходного кода при помощи нейронных сетей"
22 сентября 2020, 12:00 МСК

О ВЕБИНАРЕ

Спикер
Анна Куртукова, Junior Data Scientist, НТР
Тема
Научно-технический вебинар "Идентификация автора исходного кода при помощи нейронных сетей"
Подробнее про вебинар

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

Запись прошедшего вебинара: https://youtu.be/ndIuYaNUntQ

Презентация: https://drive.google.com/drive/u/1/folders/12BPAhkTN8l5s29CGCUOQVrXBgL_ZYyTD

(00:00:00) (Начало записи) 

Анна Куртукова: Добрый день. Меня зовут Куртукова Анна, я Junior Data Scientist компании «НТР». Сегодня мы с вами поговорим об идентификации автора исходного кода при помощи нейронных сетей. 

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

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

Далеко здесь ходить не надо, примеров в судебной практике огромное множество, но расскажу о наиболее ярком с точки зрения понесенного убытка. Данный случай произошел в 2017 году, при слиянии двух банков не была построена система обеспечения информационной безопасности, в том числе, на каждом компьютере, как ни парадоксально, отсутствовал антивирус, а операционист регулярно посещала Интернет-ресурсы непристойного содержания, в связи с чем компьютер подвергся заражению вредоносной программой, и злоумышленники смогли удаленно управлять доступом к компьютерам. В конце рабочего дня операционист, в очередной раз нарушив требования безопасности, не выключила, не заблокировала компьютер, и ночью злоумышленники с использованием этой самой программы завладели управлением и стали переводить денежные средства на счета банковской карты. За ночь итого преступники совершили хищение денежных средств на сумму свыше 75 миллионов рублей. В данном случае речь, конечно, идет именно об использовании вредоносной программы, а не о ее создании, но масштаб проблемы позволяет понять. 

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

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

Последняя сфера, по большому счету, она вытекает из предыдущей, но не влечет за собой ответственности, это выявление плагиата программ студентами технических специальностей. Думаю, все знакомы с системой «Антиплагиат», которая определяет наличие плагиата в естественно-языковых текстах, и, по сути, в данном случае полученное решение считается его аналогом для исходных кодов программ, что позволит оценивать работы студентов технических специальностей на плагиат по дисциплинам, связанным с программированием. Могу сказать, что уже сейчас она успешно применяется в моем вузе, и с ее помощью этот плагиат отслеживается успешно. 

Итак, мы определили значимость, и теперь можем поговорить о самой задаче. Сформулировать ее можно следующим образом. У нас имеется множество исходных кодов и множество авторов-программистов. Для некоторого подмножества исходных кодов, где авторы известны, существует множество пар «исходный код и программист», и задачей является установление, какой автор-программист из множества является истинным автором анонимных образцов исходных кодов. 

(00:04:54)

В данной постановке задачу идентификации следует рассматривать как задачу классификации с несколькими классами. В таком случае множество программистов состоит из предопределенных классов и меток, а пары «исходный код – автор» являются тренировочными образцами, и множество анонимных образцов содержит непосредственно классифицируемые образцы. Целью является построение классификатора, который решает поставленную задачу, то есть находит некоторую целевую функцию, которая относит случайный исходный код множества исходных кодов к его истинному автору. Значение функции интерпретируются как степень принадлежности объекта классу, то есть единица соответствует полностью положительному решению, минус единица – полностью отрицательному. 

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

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

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

Наконец, методы, основанные на нейронных сетях. Самое популярное сегодня решение базируется на глубоких архитектурах нейронных сетей, особенно распространенными являются двунаправленные рекуррентные нейронные сети – (Bi)LSTM, (Bi)GRU, кому знакомо. Причины их распространенности понятны, это простое решение для текстовых последовательностей, когда возникает необходимость в определении долгосрочных зависимостей. Довольно часто нейронные сети применяются не вхолостую, а в комбинации с иными подходами, такие варианты мы тоже посмотрим.

А сейчас более подробно рассмотрим наиболее популярные подходы к идентификации автора исходного кода. В рамках первого подхода, который мы рассмотрим, вводится нейронная сеть обратного распространения. Она основана на оптимизации методом роя частиц, методом оптимизации, и идентификация начинается с вычисления набора определенных показателей, характеристик, включая показатели лексики и разметки, показатели структуры, синтаксиса, итого там около 20 измерений. Затем эти метрики вводятся в нейронную сеть для обучения, веса которой выводятся гибридным алгоритмом метода роя частиц и обратного распространения ошибки. Предложенный подход был оценен на языке Java, и его точность составила 91%. 

Во втором подходе усовершенствуется тривиальная для задач определения авторства методика, основанная на абстрактных синтаксических деревьях, путем создания ансамбля с глубокой нейронной сетью, в данном случае с двумя нейронными сетями. Это обычная LSTM-модель и двунаправленная LSTM- модель. Точность данной методики для Python составила 92% для LSTM обычной, и 96% – для двунаправленной, и для С++, соответственно, 80 и 85 процентов точности. Следует отметить, что данная методика зависит от языка, и даже по этим результатам это видно.

Третий подход в свое время считался прорывом среди решений задач идентификации автора исходного кода. Это метод SCAP, расшифровываться как «авторские профили исходных кодов», и используется статистический подсчет определенных метрик, на основе которых составляется профиль почерка и вычисляется отклонение от данного профиля для каждого отдельного автора. Данная методика, одна из немногих, не является зависимой от языка программирования, и это, конечно, является преимуществом.

Четвертый подход основан на совокупном применение n-грамм структурных метрик, полученных из абстрактных синтаксических деревьев, статистических метрик, а также ранее описанного метода SCAP. Классификация производится в данном случае методом опорных векторов с линейным ядром. Для языка Java такой метод дает 88%. 

(00:09:57)

Ранее я говорила о не совсем стандартном решении, это энтропийная классификация при помощи сжатия. Особенность этого метода состоит в применении архиваторов. В целом он звучит так: анонимные коды присоединяются к образцам кодов, принадлежащих заведомо известным авторам, полученные документы сжимаются архиватором, а затем проверяется полученный уровень сжатия. Собственно, самым вероятным автором будет тот, к чьему коду образец жмется лучше всего. Данный метод применялся авторами к вирусам, написанным на языке Delphi, и позволил верно идентифицировать все анонимные образцы, то есть сто процентов. Но тут есть оговорка, соответственно, данный метод неприменим для решения реальных задач, потому как требует единообразия как языка, так и компилятора, и даже платформы для всех образцов кода.

Шестой подход применяет метод стилометрии абстрактных синтаксических деревьев и так называемых code smells. Последние представляют собой ряд весьма специфичных признаков, указывающих на авторские недочеты в программе, на участки кода, подлежащие рефакторингу, то есть нарушающие парадигмы того или иного языка программирования. Я делаю на этом такой акцент, так как сама наблюдала большой прирост точности при обучении машины опорных векторов на признаках с использованием code smells. Полученные признаки использовались авторами для обучения машин опорных векторов, алгоритма G48, наивного байесовского классификатора и К ближайших соседей, но наибольшая точность составила лишь 75%, с помощью машины опорных векторов. 

Седьмой метод основывается на алгоритмах классификации случайных деревьев и нечетких абстрактных синтаксических деревьев. Такая методика позволила авторам получить точность 90% для программистов, пишущих на Python, и в дальнейшем была усовершенствована калибровочными кривыми для анализа неполных и некомпилируемых образцов кода, что позволило получить 73%, но при наличии лишь одного образца исходного кода автора, который программирует на С++. Также авторы данного метода стали единственными исследователями, которые выполнили эксперименты на обфусцированных исходных кодах, написанных на С++, и в данном исследовании было доказано негативное влияние обфускации на методы идентификации автора исходного кода. Как мы видим, потеря в точности составила около 30%. 

Еще один нетривиальный подход является одним из первых решений данной задачи, если не ошибаюсь, в далеком 2008 году. Это подход Burrows, атрибуция исходного кода в данном случае выполняется за счет ключевых подстрок в n-граммах исходного кода, и полученные частоты выстраиваются в так называемый рейтинг, где автор, занявший первую позицию, считается истинным автором анонимного образца.

Следующий метод объединяет статический и динамический анализы стилометрии. Что подразумевается под статическими признаками? Это ключевые слова, структурные элементы и другие признаки. Динамические подразумевают вызов функции, выделяемую память и другие подобные признаки. Преимущество этого метода состоит в применении небольшого количества созданных вручную функций, возможности расширения исследуемой выборки без переобучения, и устойчивости результата к изменению количества авторов, участвующих в эксперименте. Точность достигает 94% для языка Python. 

Последний метод, который мы рассмотрим, осуществляет идентификацию независимо от языка программирования. Архитектура глубокого обучения, принятая в этой работе, использует представление на основе TF/IDF и нескольких слоев рекуррентных и полносвязных слоев нейронной сети. Затем глубокое представление подается в классификатор случайного леса с целью масштабируемости, чтобы деанонимизировать автора. Эксперименты позволили достигнуть 95% для языка С++. 

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

Теперь обсудим то, в чем все эти методы схожи, и их недостатки. Первый и, пожалуй, главный из них – это неуниверсальность. Авторы не проводили исследования с более чем парой языков программирования, а те, которые считаются независимыми от языка, демонстрируют недостаточно высокую точность. 

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

(00:15:00)

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

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

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

Авторские признаки исходных кодов могут быть различны по размеру. Здесь тоже удобны в применении сверточные нейронные сети, которые предназначены для распознавания локальных и глобальных признаков. 

Сверточная составляющая гибридной нейронной сети реализована сетью Google Net, которая более известна как Inception v1, и особенность данной архитектуры состоит в параллельной работе слоев со свертками разных размерностей и их дальнейшей конкатенацией в конечный результат. 

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

Хочу отметить, что гибридная нейросеть не нуждается в предварительном определении набора авторских признаков, и более того, способна находить их самостоятельно. 

Немного внимания уделим процессу обучения нейронной сети. Первый вопрос, возникающий к процедуре обучения, это данные и, в частности, формат их представления. В случае с гибридной нейросетью было решено осуществлять посимвольное One-Hot-кодирование. Тем, для кого это понятие в новинку, уточню, что это способ преобразования каждого символа исходного кода в вектор из 256 нулей и единиц на позиции кода символа с индексом, равным коду символа, в данном случае для кодировки ASCII. Минимизация ошибки, получаемая при обучении модели нейронной сети, происходит в процессе оптимизации смещения внутренних параметров и весов. Для этого использовался метод адаптивного шага обучения AdaDelta. Результат работы нейросети должен иметь эффективное ограничение, то есть соответствующее вероятностное распределение на выходе последнего слоя. Такое распределение было определено функцией активации Softmax, обобщенной логистической функцией для многомерного случая, которая позволяет трактовать выходные значения нейронов как вероятность принадлежности к какому-то целевому классу. Активатор Softmax позволяет избежать проблемы затухания градиентов, которая свойственна алгоритму обратного распространения ошибки, которая встречается, как правило, при его использовании в глубоком обучении. 

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

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

Процесс обучения любой модели и дальнейшая ее оценка подразумевает использование репрезентативных данных. Их сбор был произведен с крупнейшего хостинга IT-проектов GitHub. Были отобраны языки, входящие в топ наиболее популярных языков программирования. Репозитории для парсинга исходных кодов выбирались случайным образом. Для объективности оценки применялась десятифолдовая кроссвалидация, перекрестная проверка. Здесь приведены полученные точности по ее итогам. 

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

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

(00:20:16)

Николай Михайловский: Извиняюсь, у нас тут вопрос есть про предыдущий слайд.

Анна Куртукова: Я нее видела. Какой вопрос?

Николай Михайловский: В чате вопрос: «Колонка «исходные коды», это что?»

Анна Куртукова: Да, сейчас поясню. «Исходные коды» – это количество исходных кодов, которые были в наборе данных. Здесь нет длин в данном случае, я не приводила длины.

Николай Михайловский: Исходный код, это что за единица измерения?

Анна Куртукова: Это количество именно исходных кодов на каком-то языке программирования.

Николай Михайловский: Исходный код – это файл, строка?

Анна Куртукова: Файл, да, файл. 

Николай Михайловский: Количество исходных кодов – это количество файлов?

Анна Куртукова: Количество файлов, да.

Николай Михайловский: Спасибо.

Анна Куртукова: Вернемся к предыдущему слайду, к следующему, вернее. Итак, в рамках данного эксперимента было решено оценивать точность как для обфусцированных исходных кодов на интерпретируемых языках, в данном случае Python, PHP и JavaScript, так и на компилируемых языках, в данном случае для С и С++. В качестве обфускаторов были выбраны свободно доступные на GitHub реализации, которые подходят для автоматизированного запутывания большого количества исходных кодов. Для каждого языка программирования было необходимо использовать отдельный инструмент, который учитывает его особенности. Результаты экспериментов позволяют сделать вывод об устойчивости модели гибридной нейросети к лексической обфускации, такой, как удаление пробельных символов, преобразование строк, конвертирование, кодирование. Точность идентификации автора и лексически запутанного исходного кода оказывается ниже в среднем на 7%, чем исходного экземпляра. Напомню, что у единственного аналога модели, проверенного на обфусцированных данных, потеря составила порядка 35%. 

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

Здесь также есть интересный момент с обфускатором для С++ Obfuscator ISS. Это обфускатор, написанный моими коллегами из университета для проведения именно данного эксперимента. Идея его написания возникла из-за того, что все рассмотренные обфускаторы, как и в целом обфускаторы, осуществляют, как правило, устранение информативных признаков, то есть удаление комментариев, незначительных директив, пустых и неиспользуемых функций и других элементов кода, незначимых для работоспособности. Такой подход к запутыванию не оказывает слишком уж сильного влияния на процесс идентификации. Разработанный обфускатор осуществляет, напротив, добавление запутывающих элементов, то есть лишних комментариев, переменных, директив в случайные строки кода, создает сигнатуры функций, увеличивает вложенность кода. К такому виду обфускации, запутывания модель оказалась в целом устойчива.

Николай Михайловский: Аня, у нас есть еще один вопрос. «А когда применяем Softmax, предполагается что список возможных авторов заранее известен? Откуда мы можем взять всех возможных авторов?»

Анна Куртукова: У нас есть множество авторов... Наверно, давайте я в конце поясню этот момент, потому что это небыстро будет. Я вернусь к этому вопросу попозже.

Николай Михайловский: Спасибо.

Анна Куртукова: Совсем свежее еще исследование позволило оценить степень влияния корпоративного стиля на идентификацию автора исходного кода. Конечно, реальные корпоративные исходники получить было бы невозможно, поэтому было решено прибегнуть к хитрости и использовать открытые проекты, которые имеют рекомендации по оформлению кода. Таким образом были собраны данные из репозиториев разработчиков проекта Linux Kernel. Рекомендации, выдвигаемые к разработчикам, могут негативно сказываться на таких признаках, как выравнивание логических блоков программы, использование определенного вида пробельных символов, стиль именования переменных, классов, методов, форматирование комментариев к строкам исходного кода, и все тех же code smells, о которых я ранее уже говорила. В таком случае работа гибридной нейросети сводится к поиску неявных информативных признаков, которые позволят разделить авторов-программистов между собой.

(00:24:56)

Общее количество исходных кодов в данном эксперименте составило свыше 250 тысяч экземпляров на языке программирования С. Полученные с GitHub данные были преобразованы в различные по объему тренировочные наборы, а именно по 10, 20 и 30 файлов длиной от 1000 до 10000 символов. Такой подход был выбран, чтобы вынести методические рекомендации по минимальному объему данных, который необходим для эффективной идентификации автора исходного кода, написанного в корпоративном стиле. Полученный график демонстрирует прямую зависимость точности от объема тренировочного набора, то есть увеличение количества файлов в наборе или (и) предельной длины исходных кодов, влечет за собой рост точности идентификации. 

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

Николай Михайловский: Не более чем 20 классов, это не более чем 20 авторов?

Анна Куртукова: Да, в данном случае да. 

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

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

В принципе, на этой ноте я хочу свой доклад закончить и перейти к вопросу, на котором мы остановились до этого. Что касается Softmax и возможных авторов, речь была о чем? Наверняка в данном вопросе подразумевалось, что количество авторов, то есть обучение производится на неизвестных авторах. В общем, суть в том, что область применения основная, это в данном случае криминалистические экспертизы, подразумевает, что авторы уже известны. Есть какой-то набор потенциальных авторов, которые могут быть авторами, истинными авторами анонимного образца исходного кода, и они известны заранее, да.

Николай Михайловский: У нас есть следующий вопрос.

Анна Куртукова: Да, я сейчас прочитаю.

Николай Михайловский: Про использование двумерной свертки. Я Дмитрию сразу отвечу. Если я правильно помню слайд, там были свертки...

Анна Куртукова: Да, я поняла, про какой слайд речь. Двумерная свертка не использовалась, если речь идет про 2D-свертки, это размерность фильтра свертки, то есть 1, 3 и 5, это именно окошко свертки. Использовались 1D-свертки.

Николай Михайловский: На слайде следует читать...

Анна Куртукова: Да, это не совсем корректно, возможно, да, это фильтры, размер фильтров.

Николай Михайловский: 1 на 1, 3 на 1, 5 на 1. 

Анна Куртукова: Да. По большому счету, да. Хорошее замечание, я исправлю. Так, и еще был вопрос... А, это все один и тот же вопрос, все, поняла. «Если авторы объединились, один пишет начало...» Да, такой вопрос у меня и у самой был, но пока что этот случай не рассматривается, потому что опять же основная область применения – криминалистические экспертизы, там не предполагается такого. А именно для коммерческой среды и для определения в рамках компании авторства – это да, это надо будет исследовать еще. как раз буквально в ближайшие полгода это будет сделано, и в моих исследованиях это будет освещено, я думаю.

Николай Михайловский: Вопрос, а можно ли осуществить такой style transfer, который будет запутывать систему определения авторства? 

Анна Куртукова: По большому счету, как раз я рассказывала про обфускатор, который писали у нас в рамках проектного обучения, он как раз это и делает, по большому счету. 

(00:30:03) 

Николай Михайловский: Обфускатор, видимо, это делает программистским способом, но есть же style transfer с помощью нейронных сетей, который теоретически можно применить и к исходному коду.

Анна Куртукова: Это надо исследовать, конечно, и проверять уже, как будет работать нейронная сеть с таким случаем. 

Николай Михайловский: Вот еще нас спрашивают: «Как юридически легализовать выводы модели? Она же может ошибиться, а человека...»

Анна Куртукова: Да, конечно, об этом мы как раз говорили с заинтересованными лицами, и речь была о том, что ни при каких обстоятельствах невозможно будет полностью автоматизированную систему, то есть использовать только систему будет нельзя. Это в любом случае должно будет контролироваться экспертами какими-то, то есть интерпретация результатов, все это должно проходить через экспертов, никто модели доверять не будет в таких серьезных вопросах, как криминалистические экспертизы, например. По сути, это вспомогательный инструмент. 

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

Анна Куртукова: Я как раз, пока готовилась к этому выступлению, задумалась о том, что надо попробовать к Assembler это применить. Пока не могу, к сожалению, ответить на этот вопрос.

Николай Михайловский: Здесь же речь не только об Assembler, а мы, например, Java можем восстановить.

Анна Куртукова: Я понимаю, да, но как работает, сложно сказать, потому что я этого не делала пока что.

Николай Михайловский: Вот у нас есть еще предложение: «А вы пробовали парсить публичные репозитории, например, GitHub, для того, чтобы теоретически определить авторство программиста? В этом случае при высокой степени точности можно было бы на коммерческой основе понять, а свой ли код выслал кандидат после собеседования». 

Анна Куртукова: Да, хорошее предложение, действительно, стоит попробовать. 

Николай Михайловский: В качестве дополнительного предложения, мне представляется, что если подобные вещи надо применять к классификации на большое число классов, то есть web scale ко всем программистам, то, вероятно, надо применять какой-то вариант Triplet loss для того, чтобы в эмбеддинге развести разных авторов по разным местам. Так же, как лица определяем, вероятно, Triplet loss позволяет классифицировать подобные вещи на очень большое число классов. Но это такое предложение потенциальное.

Еще нам задают вопрос, на который, я подозреваю, у Ани ответа не будет, но тем не менее: «А как на практике круг подозреваемых определить? Может, там тоже Machine Learning?»

Анна Куртукова: Machine Learning где?

Николай Михайловский: Есть же сейчас уже сеть Facebook, которая код пишет. 

Анна Куртукова: Да, действительно. Круг подозреваемых определять – это уже не относится к возможностям этой системы, это должно быть заранее сделано уже.

Николай Михайловский: Так, у нас есть... А, у нас этот вопрос уже был у нас в QNA еще, помимо чата, есть тот же вопрос про работу на восстановленных исходных кодах. Так, коллеги, пожалуйста, еще вопросы. Если вопросов нету... А, вот еще Дмитрий Козлов спрашивает: «Сравнивали ли вы ваше решение с open source решениями в GitHub по Copy/paste detector?»

Анна Куртукова: Свое решение я сравнивала только с тем, что... о которых рассказывала.

(00:34:58)

Но конкретно с такими – нет, не сравнивала.

Николай Михайловский: Интересный вопрос Игорь задает: «Сами пробовали ли что-то обучать?»

Анна Куртукова: В плане, на реальных данных? Если так, то да, конечно, как я говорила, уже применяем в университете регулярно. А подозреваемых обычно, как мне сказали, обычно это очень узкий круг, то есть не больше десяти однозначно. Я судить не могу, я опираюсь на то, что мне эксперты говорили.

Николай Михайловский: А в случае университета – две-три группы.

Анна Куртукова: Да, обычно. Но там сначала... Тоже там не сразу применяется именно эта модель, сначала там проверяется на соответствие... то есть построчное сравнение, и если находятся какие-то похожие образцы, тогда уже применяется модель к ним, то есть сначала тоже ограничивается круг авторов. 

Николай Михайловский: Юрий Кузнецов опять задает: «А есть же система «Антиплагиат», там что используется?»

Анна Куртукова: Я не в курсе, что́ там используется, но предполагаю, что наверняка тоже алгоритмы какие-то нейронных сетей.

Николай Михайловский: Насколько я помню, там достаточно прямые поисковые алгоритмы используются, то есть в «Антиплагиате» же речь о том, чтобы выяснить источник, то есть найти дословное цитирование без упоминания... то есть найти copy/paste. Это немножечко другая задача, чем задача определения авторства. Плагиат и определение авторства – немножкечко разное.

Евгений Терентьев задает вопрос: «А делается лингвистический анализ кода с точки зрения названия переменных, например? Так можно было бы определить хотя бы страну подозреваемого или более точную геолокацию. Подтверждаю, иногда читаешь исходный код унаследованный, и там характерные русские слова в названиях переменных встречаются. В том числе, я читал, например, код, в котором несколько страниц кода было названо с переменными исключительно матерными». 

Анна Куртукова: В данном случае нет, не проводился. Здесь вообще предобработка никакая не проводилась, то есть сразу подается в исходном виде на нейронную сеть. Но идея хорошая, да.

Николай Михайловский: Вопрос: «Есть ли понимание, как можно модифицировать код, чтобы значительно увеличить ошибку?» 

Анна Куртукова: Мы, в принципе, это уже по большому счету обсудили, то, как запутать и сломать, то есть с запутыванием кода целенаправленным.

Николай Михайловский: Или, вероятно, каким-нибудь style transfer. 

Анна Куртукова: Google Net используют, именно в свертке, может, кто знает, в Inception v1 используются свертки, в дальнейшем конкатинируются, и этот результат передается на рекуррентную сеть. Так и используется. Трансформеры – нет, пока не применяла, но хочу попробовать, пока еще не успела.

Николай Михайловский: Спасибо. Еще вопросы, пожалуйста.

Анна Куртукова: Обфусцируйте, кидайте на почту, если что, почту сейчас приведу в конце, у меня есть. Нет, двоичный и скомпилированный код не анализировался. Google Net и Inception v1, имеется в виду. Инсепшенов много разных, да, здесь имеется в виду Inception v1. 

Николай Михайловский: «Пробовали ли подавать не посимвольно, а токены по словам?»

Анна Куртукова: Это, наверное, будет не совсем целесообразно, учитывая архитектуру. Как-то изначально повелось, что посимвольно, и архитектура, это какая-то была такая установка изначально, и нет, не пробовала по словам. Но я думаю, по словам имеет смысл больше в естественно-языковых текстах применять, а в исходных кодах вряд ли это будет эффективно, по крайней мере, вряд ли будет эффективнее, чем посимвольно.

Николай Михайловский: Нам поступает практическое предложение.

(00:39:55)

«Если говорить о frontend-коде, который доступен в открытом виде, то можно было бы спарсить 9 миллионов сайтов в зоне .ru, например, взять их непубличные JS-библиотеки или модули, сгруппировать по стилистике и попытаться предположить, какие из сайтов были сделаны одними и теми же людьми. Так можно увидеть, что программист левачит на конкурента». Идея забавная. Там немножечко другой классификатор в конце надо строить, может быть, не классификатор, а какой-то кластеризатор, но да, идея забавная. 

Тут спрашивают: «Когда ждать библиотеку на GitHub?»

Анна Куртукова: Сложный вопрос, потому что проект поддерживается грантом, и он коммерческий, поэтому вряд ли это на GitHub появится. Появится в виде веб-сервиса в будущем, где-то через годик.

Николай Михайловский: Да, тут надо дать пояснение, что сейчас Анна рассказывает про работу, которая выполняется не в рамках «НТР», а про свою институтскую работу.

Анна Куртукова: Да, мой собственный проект, и да, он коммерческий.

Николай Михайловский: Будем считать, что это Анина будущая диссертация.

Анна Куртукова: Так и есть. 

Николай Михайловский: Тут нам комментируют, что «ну, это прям обучение GAN , сначала щиты, потом опять копья, это если в открытый доступ выложить инструмент определения». Ну да, ну да. 

Большое спасибо всем, и до новых встреч. О новых вебинарах мы будем сообщать по email всем, кто подписан на Facebook, в Slack, и через все другие каналы коммуникации. Спасибо. До свидания. 

(00:42:02) (Конец записи)


МАТЕРИАЛЫ

СХОЖИЕ ПРОЕКТЫ

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