Єдина Країна! Единая Страна!

25 найнебезпечніших програмістських помилок

Січень 14th, 2009

Я намагатимусь не публікувати тут різні новини, бо цей блоґ не для кроспостингу, однак, цього разу маю зробити вийняток, оскільки, новина цікава, важлива, до того ж, це переклад з англійської.

Так от, інститут SANS (SysAdmin, Audit, Network, Security) співпрацюючи з організацією MITRE опублікував перелік 25 найнебезпечніших помилок, які призводять до виникнення серйозних вразливостей у програмному забезпеченні. Помилки відбирались з урахуванням їх розповсюдженості, складності знаходження і простоти використання для здійснення шкідливих дій.

Небезпечна взаємодія між компонентами

Визначає проблеми, викликані небезпечною відправкою і отримання між модулями, програмами, процесами, потоками, або системами.

  • CWE-20: Неправильна перевірка вхідних даних
    Переконайтеся у тім, що ваші вхідні дані правильні. Якщо ви очікуєте число, там не повинно бути букв. Так само, як і ціна нового автомобіля не може бути бути рівною одного долара. Неправильна перевірка введених даних може призвести до вразливостей, коли зловмисник здатен змінювати введені дані несподіваним способом. Багатьох найбільш загальних вразливостей можна уникнути або хоча б скоротити за допомогою суворої перевірки введених даних.
  • CWE-116: Неправильне кодування або екранування даних, що виводяться
    Недостатнє кодування даних, що виводяться – корінь більшості атак, заснованих на ін’єкціях. Атакуючий може змінювати команди, які ви повинні пересилати іншим компонентам, що може привезвести до повної компрометації вашої програми – я вже не кажу про виконання експлїтів на інших компонентах, які зловмисник не може запустити напряму. Якщо ваша програма генерує вивід для інших компонентів у вигляді структурованих повідомлень, таких як запити, переконайтеся у тім, що управляюча інформація та метадані відокремлені безпосередньо від самих даних.
  • CWE-89: SQL Injection
    Якщо зловмисники можуть впливати на SQL, який ви відправляєте базі даних, вони можуть змінити ваші запити щоб вкрасти, пошкодити або змінити дані в ній. Якщо ви використовуєте SQL запити для управління безпекою, наприклад, аутентифікації, зловмисники можуть змінити логіку цих запитів і обійти захист.
  • CWE-79: Cross-site Scripting
    Міжсайтовий скриптинг (XSS) – результат об’єднання HTTP, який по своїй природі не зберігає стан, суміші даних і скриптів в HTML, великих об’ємів даних, переданих між веб-сайтами, різноманітних схем кодування і багатофункціональних веб-браузерів. Якщо ви недостатньо уважні, зловмисники можуть впровадити Javascript чи інший виконуваний у браузері код на сторінку, яку генерує ваш додаток. Потім вашу сторінку відвідують інші користувачі, чиї браузери виконують цей шахрайський скрипт так, ніби він прийшов від вас – адже, зрештою, він дійсно прийшов від вас! Неочікувано ваш веб-сайт надає код, який ви не писали. Зловмисники можуть використовувати різні прийоми, щоб впровадити такий код на ваш сервер безпосередньо або з використанням нічого не підозрюючих жертв в якості посередників.
  • CWE-78: OS Command Injection
    Ваша програма працює, як міст між сторонньою людиною в мережі та нутрощами вашої операційної системи. Якщо ви запускаєте інші програми в операційній системі, яка дозволяє передати сумнівні параметри в командний рядок, ви запрошуєте зловмисників до своєї операційної системи.
  • CWE-319: Передача даних простим текстом
    Інформація, що передається по мережі, проходить безліч різних вузлів на шляху до кінцевої точки. Якщо ваша програма відсилає важливу, особисту інформацію або дані аутентифікації, стережіться: зловмисники можуть перехопити її по дорозі. Все, що їм потрібно – отримати контроль над одним з вузлів на шляху до кінцевої точки, будь-яким вузлом в тій же підмережі транзитних вузлів, або підключитися по доступному інтерфейсу. Обфускація трафіку за допомогою base64 або кодування URL не дає ніякого захисту.
  • CWE-352: Cross-Site Request Forgery (CSRF)
    Підробка міжсайтових запитів – це як взяти посилку від кого попало – з тією різницею, що зловмисник змушує користувача активувати HTTP запит, який йде на ваш сайт. Користувач може навіть не здогадуватися, що запит надіслано, однак, коли той потрапляє на сервер, він виглядає так, ніби прийшов від користувача, а не зловмисника. Зловмисник маскується під легітимного користувача, і отримує всі можливі права, які має користувач. Це особливо дієво, коли користувач має привілеї адміністратора, повністю компрометуючи функціональність вашого додатка.
  • CWE-362: Стан гонки (Race Condition)
    Стан гонки підтримує множинні процеси, в яких зловмисник має повний контроль над одним із них; зловмисник використовує процес для створення хаосу, колізій або помилок. Вплив може бути локальним або глобальним, в залежності від того, що впливає на стан гонки (наприклад, стан змінних або логіку безпеки), а також виникає між кількома потоками, процесами або системами.
  • CWE-209: Витік інформації про систему в повідомленнях про помилки
    Надмірно інформативні повідомлення про помилки можуть розкрити секрети будь якому зловмиснику, який використовує вашу програму. Ці секрети можуть відноситись до широкого спектру важливих даних, включаючи персональну інформацію, дані аутентифікації та конфігурацію сервера. Ці дані можуть виглядати, як невинні секрети, зручні користувачам і адмістратором, наприклад, повний шлях встановлення вашої програми – але навіть ці маленькі таємниці можуть допомогти зловмиснику провести більш сплановану атаку.

    Ризиковане управління ресурсами

    Визначає проблеми, пов’язані з неправильним створенням, керуванням, використанням, передачою, або знищенням важливих системних ресурсів.

  • CWE-119: Порушення контролю за операціями біля меж буферу пам’яті
    Велика кількість додатків на С за десятиліття стали надзвичайно стійкими до переповнення буферу. Способи атаки і виявлення продовжують поліпшуватися, і сьогоднішні методи переповнення буферу не очевидні на перший або навіть і на другий погляд. Ви можете вважати, що повністю захищені від переповнення буферу, оскільки пишете свій код на більш високорівневих мовами, ніж С. Але на чому написаний інтерпретатор вашої улюбленої “безпечної” мови? А, як щодо Native-коду, який ви викликаєте? На яких мовах написаний API оперціонной системи? Як щодо програм, які забезпечують інфраструктуру Інтернету?
  • CWE-642: Можливість зовнішнього контролю над критичними даними про стан
    Якщо ви зберігаєте дані користувачів про стан там, де зловмисник може їх змінити, це зпростить йому життя. Дані можуть бути збережені у конфігураційних файлах, профайлах, куках, схованих полях форм, змінних оточення, ключах реєстру, або інших місцях, де вони можуть бути змінені зловмисником. У протоколах без збереження стану, таких як HTTP, деякі форми спеціальної інформації про стан можуть бути перехоплені в кожному запиті, тобто вони відкриті зловмисникові без необхідності. Якщо ви, грунтуючись на цих даних, здійснюйте будь-які критичні з точки зору безпеки операції, можете поставити на то, що хтось змінить ці дані таким чином, щоб обдурити ваш додаток.
  • CWE-73: Можливість зовнішньої зміни шляхів або імен файлів
    Якщо ви використовуєте введені дані для побудови імені файлу, шлях, що буде результатом операції, може вказувати зовсім не на призначену теку. Зловмисник може зкомбінувати декілька “..” або схожих послідовностей, щоб вибратися за межі визначеної теки. Інші атаки пов’язані з файлами, спрощуються при зовнішньому контролі імені файлу, наприклад, перехід за символьними посиланнями, що призводить до того, що ваша програма зчитує або змінює файли, до яких зловмисник не має прямого доступу. Те ж саме застосовується, коли ваш додаток запущено з надто високими привілеями, і приймає ім’я файлу в якості вхідних даних. Схожі правила вірні й для адрес URL та дозволів стороннім вказувати довільні адреси.
  • CWE-426: Надлишкова довіра до стандартних шляхів
    Ваша програма залежить від вас, або від свого оточення, в плані надання шляху пошуку (або робочого шляху) критичних ресурсів, таких як бібліотеки або конфігураційні файли. Якщо шлях пошуку знаходиться під контролем зловмисника, він може змінити його, щоб він вказував на ресурси, обрані ним.
  • CWE-94: Проблеми зі згенерованим кодом (aka ‘Code Injection’)
    Безсумнівно, складно заперечувати сексуальність динамічно генерировано коду, однак, зловмисники знаходять його не менш привабливим. Серйозна вразливість виникає, коли ваш код може бути безпосередньо викликаний неавторизованими користувачами, якщо зовнішні вхідні дані впливають на код, який буде виконуватися, або ж ці дані вбудовуються безпосередньо у сам код.
  • CWE-494: Завантаження коду без перевірки його цілісності
    Якщо ви звантажуєте код і виконуєте його, ви вірите, що джерело цього коду не шахрайське. Але зловмисники можуть змінити цей код до того, як він досягне вас. Вони можуть зламати сайт, з якого ви його звантажуєте, зімітувати його за допомогою спуфінгу DNS або «отруєнням» кешу, переконати систему зробити перенаправлення на інший сайт або ж навіть змінити код на шляху по мережуі. Цей сценарій може застосовуватись навіть до випадків, коли ваш власний продукт звантажує і встановлює оновлення.
  • CWE-404: Неправильне виділення та звільнення ресурсів
    Коли ваші системні ресурси досягають «кінця свого життя», ви просто позбуваєтесь їх: пам’ять, файли, куки, структури даних, сесії, канали зв’язку і так далі. Зловмисники можуть використовувати невірні закриття для утримання контролю над цими ресурсами, коли ви уже вважаєте, що позбулися них. Зловмисники можуть просіювати їх у пошуках важливих даних. Вони також, теоретично, можуть використовувати ці ресурс повторно.
  • CWE-665: Некоректна ініціалізація
    Якщо ви не ініціалізуєте ваші дані і змінні правильно, зловмисник може мати можливість ініціалізувати їх за вас або отримати важливу інформацію, що залишилася від минулих сесій. Якщо ці змінні використовуються в критичних з точки зору безпеки операцій, таких, як прийняття рішення про аутентифікацію, вони можуть бути змінені для обходу вашої захисту. Це – найбільш імовірна причина, чому ваш код раптом проскакує ініціалізацію при дивних помилки та умовах.
  • CWE-682: Некоректні обрахунки
    Коли зловмисники контролюють вхідні дані для чисельних обчислень, математичні помилки можуть мати наслідки для безпеки. Вони можуть змусити вас виділити значно більше ресурсів, ніж це необхідно – або значно менше. Вони можуть порушити бізнес-логіку (обчислення, які повертають негативну ціну) або викликати відмову в обслуговуванні (ділення на нуль, що призводить до краху програми).

    Ненадійний захист

    Визначає проблеми, пов’язані з неправильним використанням, ігноруванням або ж зловживанням засобами захисту.

  • CWE-285: Неправильний контроль доступу (Авторизація)
    Якщо ви не перевіряєте, що користувачі програми роблять тільки те, що їм дозволено робити, зловмисники намагатимуться використовувати невірну авторизацію і погратися з несанкціонованою функціональністю.
  • CWE-327: Використання ненадійних алгоритмів шифрування
    Самопальна криптографія – запрошення для зловмисників. Криптографія складна. Якщо геніальні математики та комп’ютерні фахівці не можуть дати їй ладу – а вони періодично визнають застарілими свої власні методи – і у вас не вийде.
  • CWE-259: Задання стандарного паролю прямо у коді
    Якщо пароль один і той же в усіх ваших програмах, кожен ваш клієнт стає вразливим, як тільки цей пароль стає відомим. А оскільки він жорстко прописаний в коді, виправити це – великий головний біль.
  • CWE-732: Неправильний котроль доступу до важливих ресурсів
    Стережіться критичних програм, сховищ даних і конфігураційних даних з читабельними дозволами за замовчуванням. Хоча ця проблема може і не розглядатися під час реалізації або розробки, вона повинна. Не вимагайте від ваших клієнтів робити ваш додаток безпечним за вас! Спробуйте забезпечити безпеку за замовчуванням, з коробки.
  • CWE-330: Використання передбачуваних випадкових чисел
    Ви можете залежати від випадковості, навіть коли не підозрюєте про це, наприклад, при генерації ідентифікаторів сесії або тимчасових імен файлів. Генератор псевдовипадкових чисел (ГПВЧ, PRNG) використовуються повсюдно, однак, багато речей може піти неправильно. Як тільки зловмисник зможе визначити, який алгоритм використовується, він зможе вгадувати наступне випадкове число досить часто для проведення успішної атаки після відносно невеликої кількості спроб.
  • CWE-250: Виконання коду з надто високими правами
    Вашій програмі можуть знадобитися спеціальні привілеї для виконання певних операцій; володіння цими привілеями довше, ніж це необхідно, ризиковане. Під час роботи з екстра привілеями, ваш додаток має доступ до ресурсів, які користувачі програми не можуть використовувати напряму. Кожен раз, коли ви запускаєте окрему програму з підвищеними привілеями, зловмисники теоретично можуть використовувати ці привілеї.
  • CWE-602: Забезпечення безпеки на клієнтській стороні
    Не довіряйте клієнту проводити перевірку безпеки від імені сервера. Зловмисники можуть проаналізувати ваш додаток і написати свій власний клієн. Наслідки залежать від того, хто захищає ваші перевірки безпеки, але основні цілі – аутентифікація, авторизація та перевірка введених даних.

Коментарі

коментарі

Powered by Facebook Comments

2 коментарі to “25 найнебезпечніших програмістських помилок”

  1. Vital Says:

    Помилка “коли ви запускає окрему програму”

  2. Oleksandr Kravchuk Says:

    @Vital, дякую.

Leave a Reply