Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
БІКС 2015_1 / lec_2 BIKS.doc
Скачиваний:
76
Добавлен:
12.02.2016
Размер:
465.92 Кб
Скачать

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.

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