Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Безпека.docx
Скачиваний:
130
Добавлен:
31.08.2019
Размер:
6.2 Mб
Скачать

помилки, виявлені у програмах-демонах finger і sendmail, і наслідки, до яких вони призвели. Також наведемо аналогічні вразливості систем Windows, які виникають через вади захисту в реалізації системних сервісів.

Помилки, які спричиняють вади захисту в прикладному програмному забезпеченні, як правило, не здатні завдати помітної шкоди функціонуванню системного програмного забезпечення і призводять лише до збоїв процесу, що містить такі помилки. Але ті вади захисту, що є результатом навмисного впровадження шкідливих функцій у прикладні програми, вкрай небезпечні. Адже переважна більшість вірусів, «троянських коней», програмних закладок і спеціалізованих засобів атак функціонують саме як прикладні програми. Різниця полягає у тому, що спеціально впроваджені шкідливі функції використовують відомі вразливості у програмному забезпеченні, що дає їм змогу діяти з більшими повноваженнями, ніж повноваження прикладного процесу та користувача, який його ініціював.

5.2.3. Класифікація вад захисту за етапами їх появи

Наявність класифікації вад захисту за етапами їх появи має велике значення для здійснення аналізу передумов виникнення помилок та запобігання їм. Така класифікація тісно пов'язана з етапами життєвого циклу програмного забезпечення. Оскільки є різні моделі життєвого циклу та технології розроблення ПЗ, класифікації також можуть різнитися.

У цьому підрозділі подано не надто детальну класифікацію, яка фактично охоплює лише найвищий рівень подання життєвого циклу (рис. 5.2) але може бути у пригоді для аналізу ймовірності виникнення вад захисту на відповідних етапах.

Рис. 5.2. Класифікація вад захисту за етапами їх появи

Життєвий цикл програмних систем складається з таких трьох основних

етапів: розроблення, впровадження й експлуатація.

На першому етапі (якщо процес створення програмної системи розглядати спрощено) здійснюють:

  • розроблення технічних вимог і специфікацій;

  • розроблення алгоритмів;

  • кодування.

У технічних вимогах визначають, що має робити програма. У специфікаціях описують, яким чином програма виконуватиме зазначені дії. Реалізація певних дій потребує розроблення алгоритмів. Відповідно до розроблених специфікацій і алгоритмів, створюють вихідні тексти програми та компілюють їх у програмний код. Іноді розроблення та компіляцію програм розглядають окремо, через наяв­ність імовірності внесення специфічних помилок на кожному із цих етапів. Ре­альний процес кодування, як правило, проходить циклічно, тобто після написання чергового фрагмента вихідного тексту здійснюють його компіляцію і тестування, після чого робота триває.

Етап упровадження детально не розглядатимемо, лише зауважимо, що на цьому етапі відбуваються інсталяція системи, її налагодження у конкретному програм­ному й апаратному оточенні, а також випробування і (за потреби) атестація.

Етап експлуатації системи передбачає її супроводження і застосування (що можна розглядати як окремі процеси і як один).

Під супроводженням системи мають на увазі її модифікацію та удосконалення шляхом виправлення наявних помилок, упровадження додаткових функцій та оновлення застарілих версій програм. Застосування системи — це експлуатація конкретної версії системи в певних умовах.

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

Розроблення технічних вимог і специфікацій

На цьому етапі навмисне внесення помилок малоймовірне, оскільки технічні ви­моги і специфікації можна легко перевірити. Проте й тут виникають дві пробле­ми, які можуть спричинити появу вад захисту в кінцевому програмному продукті. Перша — це протиріччя між вимогами безпеки і загальними вимогами до функ­ціональності системи. Виконати всі вимоги можна, лише приймаючи певні ком­промісні рішення, що сприяють послабленню безпеки. Типові приклади таких компромісів — спрощення процедур ідентифікації й автентифікації, розширення прав користувачів, збільшення квот на використання пам'яті, процесорного часу, дискового простору, кількості одночасних запитів користувачам і процесам тощо.

Друга проблема — невідповідність реальної системи технічним вимогам і роз­робленим на їх основі специфікаціям (а точніше, середовища, в якому система функціонуватиме). Така невідповідність виникає, коли стандартні проектні рішен­ня тиражуються на різні системи і коли середовище системи зазнає змін на етапі його проектування. Найтиповішою і найнебезпечнішою з таких змін є підклю­чення системи до глобальної мережі чи поява додаткових підключень в обхід за­проектованих. Такі невідповідності можуть призвести до того, що всі обрані рі­шення із захисту втратять свою ефективність.

Розроблення алгоритмів

Алгоритми, що реалізують функції безпеки, також є потенційним джерелом над захисту. Оскільки алгоритми підлягають перевірці, внесення навмисних помилок на цьому етапі малоймовірне, але ненавмисні помилки, наприклад, в алгоритмах роботи системи розмежування доступу цілком імовірні.

Кодування

Процедура створення вихідних текстів програм на основі розроблених специфікацій і алгоритмів надає широкий простір для виникнення вад захисту. На цьому етапі часто припускаються помилок. Більшість таких помилок можна виявити, проаналізувавши вихідні тексти програм разом зі специфікаціями. Про те дуже важко, майже неможливо, виявити ці помилки тестуванням скомпільованої програми, навіть якщо застосовувати для цього технологію «зворотної інженерії», тобто декомпіляцію.

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

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

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

Вади захисту виникають на етапі розроблення тексту програм також через на вмисне внесення недокументованих функцій — програмних закладок. Найчастіше програмісти за допомогою закладок створюють так звані люки, або чорні ходи (Backdoors), з метою спрощення процедур тестування і налагодження програми, а інколи і задля того, щоб у подальшому можна було скористатися ресурсами сис­теми. Іноді вони вносять нешкідливі програмні закладки, які за виконання пев­них умов демонструють, наприклад, інформацію про розробників. Але є й такі програмні закладки, які здійснюють шпигунську місію, приховано надсилаючи з системи конфіденційну інформацію, або виконують руйнівні дії. Зауважимо, що останнє фактично унеможливлюється у разі використання програмного забезпе­чення, розробленого «на замовлення» відомими розробниками, але цілком імо­вірне у програмах, отриманих із сумнівних джерел.

Компіляція

Окремо розглянемо помилки, що виникають у коді програм на етапі їх компіляції. За допомогою сучасних компіляторів можна робити численні настроювання, які мають відповідати розробленим специфікаціям і вихідним текстам програм. Таким чином можна обирати модель використання пам'яті, змінювати розмір сегментів (особливо стека), формат змінних за умовчанням і встановлювати до­даткові перевірки параметрів під час виклику процедур, компіляції та у разі підключення додаткових модулів.

Компілятори також можуть містити недокументовані функції. Як приклад варто навести ідею Кена Томпсона — автора мови програмування С, — яку він ви­словив у своїй класичній доповіді, присвяченій питанням довіри до програмного забезпечення, на церемонії вручення йому премії Т'юрінга у 1983 році [59].

Кен Томпсон запропонував увести в компілятор С програмну закладку, яка розпізнає вихідний код утиліти login, що виконує автентифікацію користувача в операційній системі UNIX і в процесі компіляції додає до цієї утиліти недоку ментовану функцію, яка після введення спеціального таємного пароля надає ко­ристувачу привілейований доступ. Оскільки компілятор — це також програма, причому написана тією самою мовою програмування С, Кен Томпсон запропо­нував упровадити в компілятор С ще одну програмну закладку, яка розпізнає вихідний текст компілятора і під час його компіляції додає до вихідного тексту обидві закладки.

Проаналізуємо можливі наслідки реалізації цієї пропозиції. Внесену компіля­тором програмну закладку майже неможливо виявити без трудомісткого аналізу машинних кодів. Оскільки вихідні тексти системних і прикладних програм UNIX були доступними, майже весь аналіз коду і пошук помилок виконувався не у відкомпільованих кодах, а у вихідних текстах. Окрім того, всі нові версії компіляторів, реалізовані з використанням попередніх версій, також мали вносити ту саму про­грамну закладку. Таким чином, впроваджений люк із великою ймовірністю міг існувати протягом тривалого часу на всіх системах UNIX.

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

Впровадження

На етапі впровадження системи виконується її налагодження в конкретному про­грамному та апаратному оточенні. На цьому етапі вади захисту можуть бути впроваджені через помилки в адмініструванні системи. Їх спричиняє відсутність повної документації на систему, яка мала б надавати вичерпну інформацію про параметри, що можуть змінюватися під час інсталяції системи, та недостатній досвід персоналу в адмініструванні конкретної системи.

Супроводження

Під час супроводження системи також можуть бути внесені випадкові помилки, які спричиняють вади захисту. Такі помилки виникають переважно через недос­татню обізнаність програмістів, що вносять зміни в систему, в деяких аспектах її функціонування. Внесення будь-яких змін потенційно загрожує безпеці системи. Єдиним ефективним способом захисту від цієї загрози є всебічне тестування сис­теми після здійснення будь-яких її модифікацій (щоразу як нової системи).

Експлуатація

Цей етап має два джерела виникнення вад захисту. Перше — це помилки в адміні­струванні системи. Добре спроектована система захисту зазвичай відстежує такі

помилки адміністрування, як відключення окремих захисних функцій, звуження кола контрольованих об'єктів, надання підвищених привілеїв користувачам чи процесам. Адміністратори часто не зважають на попереджання системи і діють на свій розсуд, ігноруючи вимоги безпеки задля спрощення процедур адміністрування.

Розглянемо такий приклад. У системі UNIX, щоб надати окремим користувачам право на запуск певної програми, яка вимагає повноважень суперкорнстувача, потрібно або встановити на цю програму атрибут SUID, або повідомити всім цим користувачам пароль root'a, або налаштувати програму sudo (конфігурацій

ний файл /etc/sudoers) на виконання визначеними користувачами заданої про грами (можна також надати всім цим користувачам права root'a, встановивши для них UID=0, але таку одіозну ситуацію розглядати не варто). У першому випадку програма автоматично запускається від імені суперкористувача, у другому — ко ристувачам доведеться, виконуючи команду su root або входячи в систему як root, вводити пароль root'a, у третьому — користувачам під час виконання команди sudo потрібно вводити власний пароль.

Перший спосіб найзручніший для користувачів і найпростіший для адміністратора, але абсолютно неприйнятний із міркувань безпеки. Другий — є небажаним через високу ймовірність розголошення пароля root'a, крім того, використання su root є прийнятним з міркувань безпеки, а входження в систему різних користувачів як root'a — ні (через особливості реалізації системи аудита). І лише використання sudo є цілком виправданим із міркувань безпеки, хоча й найскладнішим і для користувачів, і для адміністратора.

Другим джерелом появи вад захисту під час експлуатації системи є дія шкідливого програмного забезпечення, розробленого спеціально, щоб упроваджувати в систему програмні закладки. До таких програм належать, зокрема, комп'ютернівіруси, «троянські коні», мережні хробаки (докладніше про них йтиметься в роз ділі 6). Здебільшого запуск шкідливого програмного забезпечення здійснює пер­сонал (авторизовані користувачі системи) через свою необачність або необізнаність. Іноді вади захисту цілеспрямовано впроваджують користувачі-порушники.