Методи виявлення плагіату в програмуванні
Можливість легкого копіювання інформації, представленої в електронному вигляді, породила безліч проблем, пов'язаних з порушенням авторських прав. У паперових і електронних виданнях часто можна зустріти публікації про чергове протистояння піратів і власників авторських прав на поширювані цими піратами твори. Як правило, в таких випадках єдиним (але не завжди дієвим) способом залагодження конфліктів є судові розгляди. При цьому потерпілій стороні добути необхідні докази часто не складає великих труднощів, оскільки пірати рідко намагаються приховати той факт, що поширювані ними твори не є ліцензійними. У даній статті розглядаються методи, що дозволяють виявити і довести факт порушення авторських прав у випадках, коли метою протизаконних дій є розробка програмного забезпечення, що містить в собі нелегально запозичені фрагменти чужих програм.
Необхідно сказати, що, крім описаних в статті, існує і безліч інших методів. Також ніщо не заважає розробити власні прийоми, спрямовані на виявлення плагіату.
Аналіз характеристик програми
Будь-яка програма має певну ієрархію структур, які можуть бути виявлені, виміряні і використані в якості характеристик програми. Що стосується доведенню факту запозичення ці характеристики повинні слабо змінюватися в разі зміни файлів або включення фрагментів однієї програми в іншу. Імена процедур і змінних, текстові рядки тощо можуть бути легко змінені зловмисником і тому не повинні використовуватися для отримання характеристик. Для цієї мети краще підійде послідовність операторів програми, що внесення змін до цієї послідовності вимагає глибокого розуміння логіки функціонування програми і є дуже трудомістким процесом.
Ознайомлення з аналізом характеристик програми проведемо на прикладах аналізу частот появи операторів і розміщення операторів в тілі програми.
Розглянемо частоти появи операторів в певному фрагменті програми. Частота визначається як кількість появ конкретного оператора, поділене на кількість появ всіх операторів. Частоти можна зобразити у вигляді гістограми. На малюнку 1 зображена гістограма деякої програми. На абсцис відкладені порядкові номери операторів, а на ординате - частоти (у відсотках) появ цих операторів.
При маскуванні нелегально запозиченого фрагмента зловмисник може змінити деякі оператори і додати нові, але в цілому зміни, ймовірно, будуть малі, і очікується, що розподіл частот залишиться практично тим же. Звичайно, близькі частоти під фрагментах різних програм ще не є доказом факту запозичення, але зате дають привід це підозрювати.
Перейдемо тепер до аналізу розміщення операторів в тілі програми. Візьмемо дві послідовності операторів і порівняємо їх для того, щоб отримати взаємну кореляцію операторів цих послідовностей.
Порівняння буде проводитися наступним чином. Перший оператор однієї послідовності порівнюється з першим оператором іншій послідовності. Якщо оператори однакові, то лічильник збігів збільшується на одиницю. Далі беруться другі оператори, порівнюються, і при збігу лічильник знову инкрементируется. Цей процес триває до тих пір, поки не будуть обрані всі оператори. У тому випадку, коли довжини послідовностей різні, порівняння проводиться по довжині коротшою послідовності.
Після того, як всі оператори обрані, кількість збігів запам'ятовується, а потім проводиться повторне порівняння, але перед цим коротша послідовність зсувається так, що її перший оператор порівнюється з другим оператором довшою, другий - з третім, і так далі. Коли буде отримано ще одне число, що характеризує кількість збігів, воно також запам'ятовується, одна з послідовностей знову зсувається, знову проводиться порівняння, і так до тих пір, поки коротша послідовність не зрушиться циклічно стільки раз, скільки операторів в довшою. Отримана інформація зображується у вигляді гістограми, на абсциссе якої відкладається величина зміщення однієї послідовності операторів щодо іншої, а на ординате - кількість збігів операторів при такому зміщенні.
На малюнку 2 представлена гістограма взаємної кореляції двох коротких програм.
Пік, що спостерігається на сьомій позиції, виник через те, що в цих програмах зустрічаються однакові фрагменти. Крім закономірною, може виникнути помітна випадкова кореляція, тому кожен випадок високого значення кореляції слід аналізувати іншими методами.
Як уже зазначалося, близькі значення характеристик двох різних програм не означають, що в одній програмі присутні фрагменти іншого. Дана обставина є недоліком описаного методу. Однак необхідно відзначити, що він дозволяє легко автоматизувати процес виявлення підозрілих ділянок програмного коду і при використанні спільно з іншими методами може дати значні результати.
Аналіз стилю програмування
При розгляді стилю програмування часто використовується термін "родимі плями" ( "birthmarks"), введений у вжиток в Британському суспільстві обчислювальної техніки (British Computer Society) для позначення особливостей, які притаманні стадії розробки програми і які стають надалі невід'ємною частиною цієї програми. Визнано, що родимі плями існують об'єктивно. Ця обставина дозволяє використовувати аналіз стилю програмування для доведення факту запозичення.
Значна кількість родимих плям з'являється в програмі завдяки індивідуальним особливостям програмування, властивим кожному програмісту. Як приклади таких особливостей можна назвати заготовки, напрацьовані програмістом в процесі роботи, частини коду з більш ранніх версій програми, фрагменти, написані при розробці програми, але не видалені після того, як вони стали непотрібними.
Як родимих плям також розглядаються помилки. Відтворення помилки може служити доказом запозичення, оскільки малоймовірно, щоб одна людина самостійно і незалежно повторив ту ж помилку, що і інший. Слід зазначити, що деякі помилки можуть бути притаманні різним людям. Ця обставина було виявлено в цілому ряді нових технологій, в основі яких закладені важкорозв'язні концепції. При використанні цих технологій розробникам виявляються властиві однотипні помилки, проте ясно, що якщо помилка очевидна, то малоймовірно, щоб інші могли її повторити.
Стильові особливості не очевидні автору через те, що це його власні неконтрольовані особливості, тому для полегшення виявлення плагіату можна вводити в програму додаткові родимі плями. Це можуть бути помилки, які не позначаються на працездатності програми, або надлишковий код, який може включатися з пропозицією про введення зловмисника в оману (зокрема, для того, щоб змусити його виконувати зайву роботу по з'ясуванню, чи є даний код дійсно надмірною або ж він призначений для виклику в деяких виняткових ситуаціях).
Аналіз стилю програмування є ефективним методом, оскільки усунення стильових особливостей призводить до переписування програми і виявлення неефективних частин програми, які могли з'явитися через використання програмістом не самих ефективних алгоритмів. У той же час, якщо програма, в якій використана частина вихідного тексту іншої програми, представлена в машинному коді, то процедура пошуку родимих плям може стати дуже складною. Це обумовлено тим, що компілятори усувають надмірність коду і згладжують стильові особливості.
Завершуючи частина, присвячену аналізу стилю програмування, слід зазначити одна важлива перевага описаного методу, а саме те, що з його допомогою можна встановити авторство фрагмента програми, навіть якщо розробка і поширення програми були виконані до прийняття заходів по захисту від нелегального копіювання.
Аналіз ідентифікаційних міток
Терміном "ідентифікаційна мітка" ( "fingerprint") в цій статті буде позначатися інформація, що кодує певний посвідчення авторства способом, досить неймовірним, щоб його розпізнати випадково, і яка є доказом того, що посвідчення авторства дійсно присутній.
Ефективність використання ідентифікаційних міток обумовлена невизначеністю і несподіванкою їх розташування. У деяких випадках має сенс інформувати про те, що вони присутні. Тоді, виявивши частина міток, зловмисник не буде впевнений в тому, що знайшов їх все, і це може змусити його відмовитися від спроб запозичення. Звичайно, зловмисник міг би в принципі ввести додаткові ідентифікаційні мітки, щоб заплутати автора програми в разі судового розгляду, але збереження вихідного тексту повинно усунути будь-які сумніви стосовно справжньому автору.
Розробляючи ідентифікаційні мітки, необхідно пам'ятати, що вони добре захищені від модифікації або видалення тільки в тому випадку, якщо невідомий принцип їх побудови. Розголошення цього принципу позбавляє сенсу його використання, з цієї причини описаний в наступному абзаці приклад не рекомендується використовувати на практиці.
У частині, присвяченій ідентифікації програмного коду на основі аналізу стильових особливостей програмування, був згаданий такий тип родимих плям, як навмисні помилки. При цьому передбачалося, що вони не можуть з'явитися в інших програмах, якщо тільки не скопійовані з оригіналу. Помилки можуть використовуватися для кодування посвідчення авторства. Наприклад, код програми, що видає на виході послідовність чисел, може модифікувати ці числа так, щоб дві останні цифри на межі округлення кодували літери алфавіту і таким чином неявно виводили, скажімо, прізвище розробника даного коду. Ясно, що при цьому вносяться помилки не повинні спотворювати суть виконуваних операцій.
Якщо введення спотворень неприпустимо, то можна діяти по-іншому. Оскільки зміна порядку проходження сусідніх і незалежних один від одного операторів не впливає на працездатність програми, то ця обставина можна використовувати для створення ідентифікаційних міток. Звичайно ж, розробити мітку, пов'язану з послідовністю операторів, дуже складно, тому можна просто включити в програму код, який ніколи не буде виконуватися. Однак, таке розміщення команд можуть принести плоди лише в тому випадку, якщо при запозиченні фрагментів програми зловмисник не буде досконально розбиратися в їх роботі.
На закінчення необхідно сказати ще кілька слів про посвідчення авторства. Знання зловмисником імені автора, назви компанії або іншої інформації подібного роду є потужним ключем до проблеми виявлення і видалення ідентифікаційних міток. З цієї причини інформацію, що міститься в мітках, рекомендується шифрувати. Однак не варто захоплюватися - чим складніше процедура шифрування, тим менше довіри до зашифрованої мітці, оскільки зі збільшенням складності алгоритму шифрування може збільшуватися можливість підтасування розшифрованих даних.
Сергій ІВАНЧЕГЛО, [email protected]