Черниш Л.Г.,Сягровець К.В.
Національний
авіаційний університеті.
Захист програмного забезпечення. Вразливості
програмного забезпечення та засоби боротьби з ними, дослідження вихідних
текстів програмного забезпечення, захист програм, встановлених на жорсткому
диску, захист програм від вивчення.
Безпека програмного забезпечення в широкому
розумінні є властивістю даного програмного забезпечення функціонувати без
різних негативних наслідків для конкретної комп'ютерної системи. Причини, що
приводять до порушення безпеки, можуть бути різними: збої комп'ютерних систем,
помилки програмістів і операторів, дефекти в програмах. При цьому дефекти
прийнято розглядати двох типів: навмисні і ненавмисні. Перші є, як правило,
результатом зловмисних дій, другі — помилкових дій людини.
Вразливе місце — це недолік програмного
забезпечення, яким може скористатися зловмисник в своїх корисливих цілях.
Вразливі місця в програмному забезпеченні, пов'язані з системною безпекою,
варіюються від помилок в локальній реалізації і помилок міжпроцедурних
взаємозв'язків до недоліків більш високого рівня, допущених на стадії
проектування.
Помилка— це похибка в програмному забезпеченні.
Помилки програмного коду — це недоліки на рівні реалізації. Для виявлення
помилок використовуються програми сканування коду.
Прорахунок також є недоліком програмного
забезпечення, але проблема тут визначається на глибшому рівні. Прорахунки за
своєю природою є більш тонкими і непримітними недоліками, ніж прості очевидні
помилки, наприклад, прорахунок може виявлятися у способі посилання на масив або
у використанні потенційно небезпечного системного виклику. Прорахунок зазвичай
пов'язують як з програмним кодом, так і з усім проектом.
Ще складніше ситуація з вразливими місцями,
внесеними на рівні проекту. Для виявлення помилки на рівні проекту програми
потрібен величезний досвід. Тому дуже складно знайти такі помилки і ще
складніше автоматизувати процес цього пошуку. Помилки на рівні проектування
найбільш поширені, проте їм приділяється найменша увага при оцінюванні безпеки
програмного коду.
Не менш трагічно, коли на дефектний код
"здійснюють напад". Справді, дефектний код — це традиційне знаряддя,
використовуване для злому комп'ютерів. Саме наслідки використання зловмисниками
"дір" у програмному коді часто доводиться спостерігати, аналізуючи
інциденти, пов'язані з порушенням комп'ютерної безпеки.
Важко виявити помилки в програмному
забезпеченні, що впливають на правильне виконання завдання, але виявити помилки
в системі безпеки ще важче.
Вразливості захисту можуть приводити до того,
що одна програма може використовуватися для подолання обмежень захисту всієї
системи в цілому.
Вразливості захисту залежно від програмних
помилок можна класифікувати так:
Переповнювання буфера. Ця вразливість виникає
через відсутність контролю за виходом за межі масиву пам'яті під час виконання
програми. Коли при записуванні дуже великого пакету даних переповнюється буфер
обмеженого розміру, вміст сторонніх елементів пам'яті перезаписується, і
відбувається збій та аварійний вихід з програми. За місцем розташування буфера
в пам'яті процесу розрізняють переповнювання буфера в стеку, купі
і ділянки статичних даних.
Вразливості "зіпсованого введення".
Ці вразливості можуть виникати у випадках, коли дані, що вводяться
користувачем, без достатнього контролю передаються на інтерпретатор деякої
зовнішньої. В цьому випадку вхідні дані можуть бути задані так, що за запущеним
інтерпретатором виконається зовсім не та команда, яка передбачалася авторами
вразливої програми.
Вразливості рядків форматів. Даний тип
вразливостей захисту є підкласом вразливості "зіпсованого введення".
Він виникає внаслідок недостатнього контролю параметрів при використанні
функцій введення-виведення формату ргіпіїї, їїргіпіїї, зсапїї, і т.д.
стандартної бібліотеки мови Сі. Ці функції приймають в якості одного з
параметрів символьний рядок, де задається формат введення або виведення
подальших аргументів функції. Якщо користувач сам може задати вид форматування,
то ця вразливість може виникнути в результаті невдалого використання функцій
форматування рядків.
Вразливості як наслідок помилок синхронізації.
Проблеми, пов'язані з багатозадачністю, приводять до ситуацій, що називаються
"стан гонки": в програмі, не розрахованій на виконання в
багатозадачному середовищі, може бути не передбачено, що, наприклад,
використовувані файли можуть бути змінені при виконанні іншої програми. Як
наслідок, зловмисник, що вчасно підміняє вміст цих робочих файлів, може
нав'язати виконання певних дій.
За даними Університету Карнегі-Меллон, на 1000
кодових рядків зазвичай припадає від 5 до 15 помилок. Більшість цих помилок не
впливають на виконання програм і ніколи не виявляються. Але будь-яку з них
можна використати для злому захисту.
Недоліки захисту знаходять щодня. Деякі
комп'ютерні журнали, сайти спецлабораторій, блоги фахівців з комп'ютерної
безпеки періодично публікують відомості про помилки, знайдені в різних
програмах. Розробники цих програм зазвичай досить швидко виправляють помилки,
як тільки ті стають надбанням громадськості. Як правило, вслід за повідомленням
про вразливість випускається "латка". Ці "латки" (у вигляді
оновлень, нових версій, "патчів" тощо) обов'язково потрібно
встановлювати тим користувачам, які користуються програмою, в якій виявлено
"діру". Разом з тим, подібне "залатування дір" небагато-що
дає. Адже новий програмний код, напевно, знову міститиме "дірки"
(якщо не більше від попереднього, оскільки "латка" зроблена
швидкоруч).
Відшуковувати "дірки", недекларовані
властивості програмного забезпечення, "злоякісні фрагменти коду" вірусних
програм, досліджувати захист систем можна за допомогою спеціальних
відлагоджувальних засобів. Існує два підходи при дослідженні програмного
забезпечення: високорівневе дослідження (загальновизнаний підхід), що
передбачає дослідження вихідних текстів програм, описаних мовами високого
рівня, і низькорівневе дослідження (альтернативний підхід), що полягає у
дослідженні вихідних текстів програм (обернена обробка), отриманих з
виконуваних кодів шляхом дизасемблювання.
Якщо вихідний код програми відсутній, то для її
вивчення можна скористатися також різними відлагоджувачами або трасувальниками,
декомпілятор. Створені подібні програми під різні операційні системи. Деякі з
них можуть функціонувати на різних платформах. Не дивлячись на те, що існує
велика кількість подібних програмних засобів, за якими підтримується багато
форматів виконуваних файлів для великої кількості процесорів та операційних
систем, але працювати з ними — далеко не легка робота. До того ж деякі
дизасемблери функціонують з помилками. І навпаки, деякі з них
навіть можуть ставати у нагоді фахівцям в процесі розпізнавання функцій
генерації поліморфного коду в хакерських програмах.
З іншого боку, дослідження програмних кодів,
декомпіляція не завжди є правомірною справою. Розробники комерційних програмних
продуктів захищають свої програмні коди, і їх розкриття є порушенням
авторського права.
Для виявлення вразливостей захисту в програмах
застосовують наступні інструментальні засоби:
Динамічні налагоджувачі. Інструменти, за
допомогою яких можна налагоджувати програми в
процесі її виконання.
Статичні аналізатори (статичні налагоджувачі).
Інструменти, за якими використовуються дані, накопичені
в ході статичного аналізу програми.
Захист програм, встановлених на жорсткому
диску. Захист програм від вивчення
Для програм, встановлених на жорсткому диску,
можуть застосовуватися наступні заходи захисту.
Для функціонування програма потрібно, щоб у
привід було вставлено компакт-диск. Зокрема, це широко застосовується в іграх.
Але для багатьох програм такі заходи недоступні
Електронний ключ, вставлений в один з портів
комп'ютера. Перевага ключа в тому, що його можна вставляти в будь-який
комп'ютер, на якому потрібно запустити програму. Крім того, електронний ключ
швидкий і не займає привода/дисковода. Але електронні ключі дорогі (5-15
доларів), і застосовуються лише в дорогому програмному забезпеченні. Також
теоретично можливі конфлікти периферійних пристроїв з ключем. Електронний ключ
(апаратне і відповідне йому програмне забезпечення) можна поширювати за
допомогою цифрової дистрибуції. Якщо користувач проводить модернізацію
комп'ютера, захисні механізми перестають функціонувати. Однак автори багатьох
програм, захищених прив'язкою (в якості прив'язки використовуються серійний
номер), у подібних випадках готові надати новий реєстраційний код.
Сканування мережі, за яким виключається
можливість одночасного запуску двох програм з одним реєстраційним ключем на
двох комп'ютерах в межах однієї локальної мережі. Локальний брандмауер можна
налаштувати так, щоб він не пропускав пакети, що належать захищеній програмі.
Правда, налаштування брандмауера вимагає від користувача деяких навичок. Крім
того, в більшості реальних мереж, в яких "всі один одному довіряють"
(це прискорює доступ до ресурсів на інших комп'ютерах, в тому числі до мережевих
ігор), з використанням брандмауера контролюється локальний трафік.
Якщо за допомогою програми здійснюється
взаємозв'язок з якимось централізованим сервером і без нього неактуальна
(наприклад, онлайн-гра, антивірус), то за нею може передаватися серверу її серійний
номер; якщо номер неправильний, з сервера не буде проводитись підтримка
послуги. Це непоганий спосіб захисту від копіювання. Втім, пірати можуть
створити сервер, за допомогою якого не буде проводитись така перевірка.
Важливим аспектом у питаннях програмного
захисту є також ліцензування. Суть будь-якої з систем ліцензування полягає в
тому, що після встановлення програмного забезпечення на локальний комп'ютер
користувачеві необхідно отримати від виробника певний ключ або пароль. Системи
ліцензування бувають як "одна ліцензія — один комп'ютер", так і
"одна ліцензія — один користувач". Як правило, для цих цілей
використовують механізм заповнення анкети на сайті розробника (для
ідентифікації користувачів) + пересилання (на той самий сайт) спеціального
ідентифікатора комп'ютера, на основі якого і виконується генерація ключа. Як
правило, в ключі містяться зашифровані дані про користувача, продукт, число
ліцензій та інші.
Зупинимось на розгляді засобів захисту
програмних кодів (зокрема, виконуваних файлів) від вивчення сторонніми особами.
Інтелектуальну власність завжди потрібно захищати, а надто, коли вона пов'язана
з такою виснажливою справою, як програмування.
Після компіляції потрібно захищати програми
всіма можливими способами. У колах програмістів реалізацію цих способів
називають навісним захистом.
Для захисту розроблюваних програм фахівці
використовують спеціальні технології захисту, як-то упаковування,
протектування. В результаті — безпосереднє дизасемблювання таких програм стає
неможливим.
Існує кілька методів протидії дизасемблюванню:
-шифрування;
-архівування;
-використання кодів, що самі генеруються;
-"обман" дизассемблера.
Існує ще кілька способів протидії зламуванню
програм. Мова йже саме про протидію, оскільки за нижче описаними способами
можна зробити роботу налагоджувача або зовсім неможливим, або максимально
трудомістким.
Засмічення коду програми. Спосіб,
при якому до програми вносяться спеціальні функції і виклики, за якими
виконуються складні дії, відбувається звертання до накопичувачів, але за фактом
нічого не відбувається. Типовий спосіб обману. Хакера потрібно відвернути,
створивши відгалуження, яке і привертатиме увагу складними викликами, і
міститиме в собі складні та великі обчислення. Хакер рано чи пізно зрозуміє, що
його обманюють, але час буде втрачений.
Використання мультипоточності —
ефективний спосіб захисту, за яким в функції Windows виконуються паралельно. Будь-який програмний додаток може бути
побудований як лінійно, тобто інструкція за інструкцією, і легко читатися
налагоджувачем, а може відбуватись розбивання дій на кілька потоків,
виконуваних одночасно. В цьому випадку немає лінійності, тому аналіз програми
здійснювати важко. Як правило, створення 5-6 і більшої кількості потоків
спричинює складності у аналізі програм хакером. А якщо до того ж потоки
шифруються, то робота хакера ускладнюється істотно.
Придушення спроб зміни операційного середовища — за програмою кілька разів переналаштовується
середовище оточення, або взагалі відбувається відмова функціонування у
зміненому середовищі. За допомогою не всіх налагоджувачів можна на 100%
імітувати середовище системи, і якщо за "піддослідним" програмним
додатком змінюватиметься налаштування середовища, то рано чи пізно відбудеться
збій у функціонуванні "неправильного" налагоджувача.
Протидія встановленню контрольних точок. Спеціальний механізм, за допомогою якого можна
досліджувати не всю програму, починаючи з початку, а, наприклад, лише починаючи
з середини. Для цього всередині програми ставлять спеціальний виклик (точка
виклику — ВгеакРоіпі), за яким передається управління налагоджувачу. Недолік
способу криється в тому, що для здійснення переривання в код досліджуваного
програмного додатку треба внести зміну. А якщо час від часу відбувається
перевірка на наявність контрольних точок у програмі, то зробити подібне
непросто.
Зміни певних регістрів процесора, у відповідь на які відбувається неадекватне "реагування"
налагоджувачів. Якщо змінювати певні регістри мікропроцесора, які налагоджувач
не може емулювати, то можна істотно погіршити його функціонування.
Шифрування. Найпростіший і
ефективний спосіб протидії. Передбачається, що певна з частин коду ніколи не
з'являється у вільному вигляді. Програмний код дешифрується лише перед
передаванням управління до програми. Тобто вся програма або її частина
знаходиться в зашифрованому вигляді, а розшифровується лише перед виконанням.
Відповідно, щоб проаналізувати її код, треба скористатися налагоджувачем, а
його роботу можна дуже ускладнити (про методи ускладнення процесу трасування
вже йшлося).
Шифрування і дешифрування (динамічна зміна коду). Більш популярний спосіб шифрування, за яким не
просто дешифрується частина коду при виконанні, але і шифрується вона знову
після того, як було її виконано. При такому захисті потрібно використати
налагоджувач, і злом захисту затягнеться на довгий час.
Використання віртуальних машин. Це
ще одна модернізація шифрування. Спосіб полягає у тому, щоб не просто шифрувати
і дешифрувати фрагменти коду повністю, а робити це покомандно, подібно до того,
як функціонує налагоджувач або віртуальна машина: взяти код, перетворити у
машинний і передати на виконання, і так доти, поки весь модуль не буде
виконано. Цей спосіб набагато ефективніший за попередні, оскільки функції
додатку взагалі ніколи не бувають відкритими для хакера. Природно, що його
важко реалізувати, але реалізувавши, можна захистити себе від посягань
будь-яких хакерів. Однак, в цьому способі криється недолік — продуктивність,
адже на подібну трансляцію потрібно багато часу, і, відповідно, цей спосіб
хороший для захисту лише критичних ділянок коду.
Висновок.Слід сказати, що практично всі методи захисту вже зламані, сподіватися
на 100% надійний захист від зламування не можна. Проте можна і потрібно
розробляти нові ефективні системи захисту.
Література:
2. Юдін О.К., Корченко О.Г., Конахович Г.Ф.
a)Захист інформації в мережах передачі даних. – К.: МК
- Інтерсервіс., 2009,– 716 с.
3. .Ярочкин В.И. Информационная безопасность: Учебник. – М.:
Академический проект: Трикста, 2005.- 544 с.