- •5.1. Передумови виникнення вразливостей у комп'ютерних системах
- •5.2. Класифікація вад захисту
- •5.2.1. Класифікація вад захисту за причиною їх появи
- •5.2.2. Класифікація вад захисту за їх розміщенням у системі
- •5.2.3. Класифікація вад захисту за етапами їх появи
- •5.3. Класифікація помилок, що виникають у процесі програмної реалізації системи
- •5.4. Помилки переповнення буфера
- •5.4.1. Переповнення буфера у стеку
- •5.4.2. Переповнення буфера у статичній або динамічній пам'яті
- •5.4.3. Помилка переповнення в один байт
- •5.5. Помилки оброблення текстових рядків
- •5.5.1. Використання конвеєра
- •5.5.2. Переспрямування введення-виведення
- •5.5.3. Спеціальні символи
- •5.6. Люки
- •5.6.1. Режим debug у програмі sendmail
5.5. Помилки оброблення текстових рядків
У цьому підрозділі буде розглянуто типові помилки оброблення текстових рядків. Такі помилки траплялися дуже часто і були причиною вразливості багатьох комп'ютерних систем, підключених до глобальної мережі. Ми не будемо зосереджуватися на тому, які саме програмні продукти і під керуванням яких ОС були найбільш уразливими. Подібні помилки і нині трапляються майже на всіх системах, а також у глобальних і локальних мережах. Узагальнити характер цих помилок можна таким визначенням: некоректне оброблення непередбачених даних. Сприятлива для порушника ситуація, як і у випадку переповнення буфера, створюється тоді, коли вразлива програма виконується в системі з привілеями, вищими, ніж має користувач, від якого ця програма приймає дані.
Наявності цих помилок сприяє використання бібліотечних функцій, завдяки яким здійснюються введення й аналіз текстового рядка. Іноді програміст навіть не підозрює, що функція, яку він застосовує, у спеціальний спосіб обробляє певні символи. Розглянемо кілька типових прикладів.
5.5.1. Використання конвеєра
Конвеєри звичайно пов'язують із системою UNIX. Насправді ж це стандартний засіб організації обміну даними між програмами. Конвеєри підтримують різні ОС, де передбачено засоби інтерпретації командних рядків і переспрямування потоків введення-виведення (починаючи з однозадачної MS-DOS). Стандартним спеціальним символом організації конвеєра є вертикальна риска (|). За допомогою конструкції
progl I prog2
системі дається вказівка запустити дві програми — progl і prog2, причому перша прийматиме дані від користувача у звичний спосіб (якщо вона взагалі здатна приймати дані), а результат її роботи буде передаватися на вхід другої програми, яка здійснюватиме його оброблення відповідно до свого алгоритму функціонування. Така конструкція є зрозумілою, всім відомою та цілком передбачуваною — передусім, якщо вона з'являється у командному рядку. Але є ще й такі конструкції:
I prog
Або prog І
Якщо вони з'являться в командному рядку, може виникнути помилка, про що інтерпретатор повідомить користувача. Проте цілком імовірно, що, коли такі конструкції з'являться у полі, де передбачено введення текстового параметра, їх буде оброблено [60].
Така ситуація виникає через те, що хоча інтерпретація текстового рядка, який дає вказівку створити конвеєр, є справою командного інтерпретатора, деякі програми роблять це самостійно. Особливо небезпечними з огляду на це є функції роботи з файлами різних мов програмування. Для прикладу розглянемо функцію open () інтерпретатора Perl. Коли такій функції як параметр-ім'я файлу передати prog, то вона відкриє файл prog (якщо це коректне ім'я доступного файлу), і програма зможе обробити його вміст. Якщо ж функції open () передати конструкцію prog І, файл prog буде запущено на виконання, і программа оброблятиме результати його роботи. Після застосування конструкції I prog файл prog також буде запущено на виконання, але результати його роботи не оброблятимуться програмою, а будуть спрямовані у стандартний потік виведення (за умовчанням — на термінал).
Такі особливості оброблення рядків можуть проявитися навіть під час введення ідентифікаційної інформації, паролів або адрес електронної пошти. Тоді користувач, що не пройшов авторизацію, отримає можливість виконувати будь-які команди (він може навіть запустити командний інтерпретатор) від імені програми, з якою він взаємодіє (наприклад, демона чи root'a в UNIX або SYSTEM у Windows). Раніше таких помилок було багато. Конкретні приклади буде розглянуто в розділах 12,13,16,17.
Пошуки таких помилок мають проводити всі програмісти (у своїх продуктах) і тестувальники програм, інакше порушники це зроблять за них. Найневибагливі-ший спосіб пошуку помилок підставляти розглянуті вище конструкції в усі поля введення.
