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

5.5. Помилки оброблення текстових рядків

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

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

5.5.1. Використання конвеєра

Конвеєри звичайно пов'язують із системою UNIX. Насправді ж це стандартний засіб організації обміну даними між програмами. Конвеєри підтримують різні ОС,

де передбачено засоби інтерпретації командних рядків і переспрямування по­токів введення-виведення (починаючи з однозадачної MS-DOS). Стандартним спеціальним символом організації конвеєра є вертикальна риска (|). За допомогою конструкції

prog1 | prog2

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

| prog

або

prog |

Якщо вони з'являться в командному рядку, може виникнути помилка, про що інтерпретатор повідомить користувача. Проте цілком імовірно, що, коли такі кон­струкції з'являться у полі, де передбачено введення текстового параметра, їх буде оброблено [60].

Така ситуація виникає через те, що хоча інтерпретація текстового рядка, який дає вказівку створити конвеєр, є справою командного інтерпретатора, деякі про­грами роблять це самостійно. Особливо небезпечними з огляду на це є функції роботи з файлами різних мов програмування. Для прикладу розглянемо функцію open() інтерпретатора Perl. Коли такій функції як параметр-ім'я файлу передати prog, то вона відкриє файл prog (якщо це коректне ім'я доступного файлу), і про­грама зможе обробити його вміст. Якщо ж функції open () передати конструкцію prog |, файл prog буде запущено на виконання, і программа оброблятиме резуль­тати його роботи. Після застосування конструкції | prog файл prog також буде запущено на виконання, але результати його роботи не оброблятимуться програ­мою, а будуть спрямовані у стандартний потік виведення (за умовчанням — на термінал).

Такі особливості оброблення рядків можуть проявитися навіть під час вве­дення ідентифікаційної інформації, паролів або адрес електронної пошти. Тоді ко­ристувач, що не пройшов авторизацію, отримає можливість виконувати будь-які ко­манди (він може навіть запустити командний інтерпретатор) від імені програми, з якою він взаємодіє (наприклад, демона чи root'a в UNIX або SYSTEM у Windows). Раніше таких помилок було багато. Конкретні приклади буде розглянуто в роз­ділах 12, 13, 16, 17.

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