Безпечне кодування

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

Безпечне програмне забезпечення — програмне забезпечення, розроблене з використанням сукупності заходів, спрямованих на запобігання появи і усунення вразливостей програми[1].

Завдання безпечного програмування — захист даних користувача від крадіжки і псування, збереження контролю над системою. Небезпечна програма — потенційна мета для зловмисника, який може використовувати наявні уразливості для перегляду, зміни або видалення наявної інформації, впливу на роботу програм і сервісів (запуск або зупинка), впровадження шкідливого коду в систему[2].

Термінологія

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

Defensive programming (Оборонне, захисне, безпечне програмування) — принцип розробки ПЗ, при якому розробники намагаються врахувати всі можливі помилки і збої, максимально ізолювати їх і при можливості відновити працездатність програми в разі неполадок. Це повинно робити програмне забезпечення більш стабільним і менш уразливим. Наприклад, апаратною реалізацією даного принципу є сторожовий таймер, обчислення контрольної суми — для виявлення помилок при пакетній передачі даних[3].

Secure coding (Безпечне програмування/кодування) — методика написання програм, стійких до атак з боку шкідливих програм і зловмисників. Безпечне програмування допомагає захистити дані користувача від крадіжки або псування. Крім того, небезпечна програма може надати зловмисникові доступ до управління сервером або комп'ютером користувача; наслідки можуть бути різні: від відмови в обслуговуванні одному користувачеві до компрометації секретної інформації, втрати обслуговування або пошкодження систем тисяч користувачів[2].

Важливість

Питання забезпечення безпеки і працездатності системи є невід'ємною частиною етапу її проектування (дизайну системи)[4]. Вимоги до безпеки конкретних продуктів і систем ІТ встановлюються виходячи з наявних і прогнозованих загроз безпеки, проведеної політики безпеки, а також з урахуванням умов їх застосування[5]. Впровадження рішень для забезпечення безпеки після того, як система вже розроблена, є складною і дорогою процедурою. Тому слід з самого початку враховувати вимоги до безпеки протягом всього життєвого циклу системи[4].

Інформаційна система поділяється на фізичний і логічний рівень. Розуміння того, що саме має бути захищене від зовнішніх чинників, допомагає з найбільш ефективним вибором і застосуванням захисних заходів. Чітка межа між рівнями повинна визначатися політикою безпеки, яка регулює певний набір інформації та інформаційних технологій, що має фізичні кордони. Подальше ускладнення полягає в тому, що на одному комп'ютері або сервері може розміщуватися як загальнодоступна, так і конфіденційна інформація. В результаті кілька політик безпеки можуть застосовуватися до однієї машини або в межах однієї системи. Тому при розробці інформаційної системи кордону безпеки повинні враховуватися і описуватися у відповідній документації і політиках безпеки системи[4]. Її розробники повинні вміти забезпечити безпеку системи при проектуванні, розробці, управлінні і конфігурації, інтеграції, правильно провести тестування[4].

Аналіз (ручний або автоматичний) і забезпечення безпеки — дорога процедура, яка збільшує загальну вартість програмного продукту. Раніше повне усунення ризиків було спільною метою забезпечення безпеки. Сьогодні визнається, що усунення всіх ризиків не є економічно ефективним. Для будь-якої запропонованої системи контролю слід провести аналіз витрат і вигод. У деяких випадках переваги більш безпечної системи можуть не виправдовувати прямих і непрямих витрат. Вигоди включають не тільки запобігання грошових втрат; варто враховувати, наприклад, і репутаційні втрати. Прямі витрати включають витрати на придбання та установку даної технології; непрямі витрати включають зниження продуктивності системи і додаткове навчання співробітників[4].

Принципи

В даний час існують різноманітні технології розробки безпечного програмного забезпечення. Але є набір принципів, що враховуються при будь-якому підході[6]:

  • безпека (англ. security) — можливість захисту від зовнішніх загроз, атак і збереження працездатності після їх виявленняі усунення;
  • надійність (англ. reliability) — передбачувана, коректна і безвідмовна роботу в разі некоректних вихідних даних;
  • конфіденційність (англ. privacy) — забезпечення безпечної та коректної роботи з конфіденційною інформацією;
  • забезпечення цілісності і коректності бізнесу (англ. business integrity) — чітка організація супроводу програми, контроль прозорості, законності, правильності роботи користувача.

Чотири останніх якості стали основою Trustworthy computing (TwC) (англ. Trustworthy computing) («Обчислення, які заслуговують на довіру») — ініціативи корпорації Microsoft, головне завдання якої — звернути увагу розробників на важливість забезпечення зазначених вимог на кожному з етапів розробки ПЗ[6].

Існує безліч принципів забезпечення безпеки ПО, здебільшого схожих один на одного. Їх узагальненням можна вважати наведені вище принципи[7].

Класифікація та види вразливостей

Класифікатори

Використання стандартизованих описів вразливостей спрощує роботу фахівців з інформаційної безпеки. В даний час існує декілька популярних класифікаторів[8]:

  • CVE (Common Vulnerabilities and Exposures) — словник конкретних вразливостей конкретних продуктів;
  • CWE (Common Weakness Enumeration) — база даних типів вразливостей. Основне завдання проекту — надати опису поширених видів вразливостей, способи їх запобігання, виявлення та виправлення;
  • SecurityFocus BID;
  • OSVDB (Open Sourced Vulnerability Database) — «відкрита база даних вразливостей», створена трьома некомерційними організаціями. Припинила роботу 5 квітня 2016 року. Блог продовжує працювати[9];
  • Secunia — стрічка вразливостей відомої датської компанії Secunia в області комп'ютерної та мережевої безпеки;
  • IBM ISS X-Force.

Сучасні аналізатори коду і автоматизовані аудитори можуть використовувати подібні бази вразливостей. Це підвищує рівень довіри до продукту, а також може виявитися важливим при складанні звітів про уразливість, наявних в програмному продукті[8].

Зустрічаються й інші класифікатори. При роботі з ними слід звертати увагу на авторів, так як кожна система класифікації повинна створюватися експертами в цій галузі[8].

Метрики

Кожна програма є потенційною метою для зловмисників. Після знаходження вразливостей в додатках або сервісах вони будуть намагатися використовувати їх для крадіжки конфіденційної інформації, псування даних, управління комп'ютерними системами і мережами[2]. Для опису властивостей уразливості фахівцями використовується система підрахунку ризиків вразливостей CVSS. Вона являє собою шкали, на основі яких виставляються бали. Система метрик розроблена для поділу пріоритетів над виправленням вразливостей. Кожна шкала відноситься до певного змістового розділу, який називається метрикою. Таких метрик три[8][10][11]:

  • Базова (англ. Base) — характеристики уразливості, які не залежать від часу і середовища виконання. Служить для опису складності експлуатації уразливості, потенційного збитку для конфіденційності, цілісності та доступності інформації;
  • Тимчасова (англ. Temporal) — метрика, що враховує часовий чинник, наприклад, час на виправлення уразливості;
  • Контекстна (англ. Environmental) — метрика, що враховує інформацію про середовище функціонування програмного забезпечення.

Останні дві метрики носять допоміжний характер і використовуються лише для коригування показників базової метрики з урахуванням різних специфік[11].

Види вразливостей

Список поширених помилок, що ставлять під загрозу безпеку сучасних програм[12]:

  • уразливості, пов'язані з web-серверами (XSS, XSRF, розщеплення HTTP запиту (англ. HTTP response splitting));
  • уразливості web-клієнтів (DOM XSS);
  • дефекти форматних рядків[13] (англ. Uncontrolled format string);
  • впровадження команд (командна ін'єкція, англ. Command injection);
  • витік інформації (англ. Information Exposure);
  • стан гонитви (англ. Race condition);
  • слабке юзабіліті[14] (англ. Insufficient Psychological Acceptability);
  • виконання коду з завищеними привілеями (англ. Execution with Unnecessary Privileges);
  • зберігання незахищених даних (англ. Protection Mechanism Failure);
  • проблеми мобільного коду (англ. Mobile Code Issues);
  • слабкі паролі;
  • слабкі випадкові числа;
  • невдалий вибір криптографічних алгоритмів;
  • використання небезпечних криптографічних рішень;
  • незахищений мережевий трафік (англ. Cleartext Transmission of Sensitive Information);
  • неправильне використання PKI (англ. Improper Certificate Validation);

Перелічити всі відомі уразливості неможливо, враховуючи, що кожен день з'являються нові. В даному списку наведені проблеми, які часто зустрічаються, допустити які легко, але наслідки яких можуть бути катастрофічними. Наприклад, причиною поширення хробака Blaster стала помилка всього в двох рядках коду[15].

Захист

Правильною стратегією захисту від помилок і вразливостей є їх попередження та запобігання. Це вимагає від розробника постійної перевірки вхідних даних. Наприклад, найкращий спосіб захисту від атак переповнення буфера — перевірка того, чи вхідні дані не перевищують розміру буфера, в якому вони зберігаються. Дані, призначені для відправки в БД вимагають перевірки для захисту від атаки типу впровадження SQL-коду. Якщо дані відправляються на web-сторінку, то слід їх перевіряти для захисту від XSS. Однак, надмірне число перевірок ускладнює розробку вихідного коду програми і може привести, в свою чергу, до появи нових помилок, тому слід комбінувати цю стратегію з іншими[15].

Механізми для захисту від помилок може надавати компілятор або операційна система. Компілятор GCC дозволяє за допомогою функції _builtin_object_size () отримувати розмір об'єкта за вказівником на цей об'єкт, так що її використання робить процедуру копіювання безпечніше. MSVC при використанні прапора / RTCs дозволяє на етапі компіляції перевірити переповнення локальних змінних, використання неініціалізованих змінних, пошкодження покажчика стека, викликане невідповідністю угод про виклики. Використання технології CRED (C range error detector) і спеціальних вставок перед розділом стека, який захищається (StackGuard, SSP) частково дозволяє виявляти і запобігати атакам, пов'язаних з виходом за межі масиву і руйнуванням стека.

Операційна система також може контролювати процес виконання програми. Дана стратегія може бути корисною у разі, якщо вихідний код цієї програми невідомий. Технологія ASLR (рандомізація схеми адресного простору) є функцією безпеки операційних систем, призначеної для запобігання змоги виконувати довільний код. В даний час ASLR підтримується і в Linux, і в Windows. Підвищення рівня безпеки досягається застосуванням технологій нездійсненних стеків: W ^ X, PaX[15].

Типовими атаками на web-сервіси є впровадження SQL-коду, XSS, CSRF, clickjacking. Сучасні фреймворки допомагають розробникам у створенні безпечних web-додатків. Використання готових рішень дозволяє не займатися численними перевірками вхідних даних: від заголовків HTTP-запитів до їх змісту. Також надається більш безпечний метод роботи з БД ORM[16][17].

Збитки

Монітор комп'ютера, зараженого вірусом Petya

Інформація про уразливість може бути використана зловмисниками при написанні вірусів. Наприклад, один з найперших відомих мережевих черв'яків (вірус Моріса) в 1988 році використовував такі уразливості як переповнення буфера в Unix-демоні finger для поширення між машинами. Тоді кількість заражених машин склало близько 6 тисяч[18], а економічний збиток за даними рахункової палати США склав від 10 до 100 млн доларів.[19]

З 2016 комп'ютерні віруси завдали світовій економіці збитків в 450 млрд доларів[20][21].

У 2017 збиток від вірусу WannaCry оцінили в 1 млрд доларів. Випадки зараження були зафіксовані щонайменше в 150 країнах[22][23]. Вірус застосовував експлойт EternalBlue, що використовує уразливість в протоколі SMB, пов'язану з переповненням буфера[24][25][26][27].

У 2017 році відбулась масштабна хакерська атака з боку Росії проти України та ще 59 країн[28]. Причиною стала компрометація системи оновлення програми M.E.Doc з встановленням бекдору та вірусу NotPetya. Збитки підприємств по всьому світу склали 8 млрд доларів[29].

Примітки

  1. Информационные технологии. Системная и программная инженерия. Требования и оценка качества систем и программного обеспечения (SQuaRE). Модел. webportalsrv.gost.ru. Процитовано 9 квітня 2018.
  2. Introduction to Secure Coding Guide. developer.apple.com (англ.). Процитовано 9 квітня 2018.
  3. Defensive Programming. Dr. Dobb's. Архів оригіналу за 13 листопада 2017. Процитовано 9 квітня 2018.
  4. Stoneburner G., Hayden C., Feringa A. Engineering Principles for Information Technology Security (A Baseline for Achieving Security) / National Institute of Standards and Technology. — Revision A. — 2004. — 33 p.
  5. Руководящий документ. Приказ председателя Гостехкомиссии России от 19 июня 2002 г. N 187 - ФСТЭК России. fstec.ru (ru-ru). Процитовано 9 квітня 2018.
  6. Сафонов В. О. Современные технологии разработки надежных и безопасных программ // Компьютерные инструменты в образовании: Журнал. — 2008. — № 06. — P. 25—33.
  7. Secure Programming HOWTO - Information on Creating Secure Software. www.dwheeler.com. Процитовано 9 квітня 2018.
  8. Комаров А. Меряем уязвимости // Хакер: Журнал. — 2009. — № 04 (124). — P. 48—51.
  9. OSVDB: FIN. OSVDB (амер.). 6 квітня 2016. Архів оригіналу за 28 травня 2016. Процитовано 9 квітня 2018.
  10. Mell P., Scarfone K., Romanosky S. Common Vulnerability Scoring System (англ.) // IEEE Security & Privacy: article. — 2006. — Vol. 4. — P. 85—89. — ISSN 1540-7993
  11. CVSS v3.0 Specification Document. FIRST — Forum of Incident Response and Security Teams. Процитовано 9 квітня 2018.
  12. Howard, Michael; LeBlanc, David; Viega, John (22 вересня 2009). 24 Deadly Sins of Software Security: Programming Flaws and How to Fix Them (англ.). McGraw Hill Professional. ISBN 9780071626767.
  13. Вахрушев И. А., Каушан В. В., Падарян В. А., Федотов А. Н. Метод поиска уязвимости форматной строки // Труды ИСП РАН. — 2015. — Т. 27, № 4. — С. 23—38. — P. 25—33.
  14. Saltzer J.H., Schroeder M.D. The Protection of Information in Computer Systems (англ.): article / Saltzer J. H.. — 1975.
  15. Seacord R. C. Secure Coding in C and C++. — 2. — Addison-Wesley, 2013. — 600 p. — ISBN 9780132981972.
  16. Security in Django | Django documentation | Django. docs.djangoproject.com (англ.). Процитовано 9 квітня 2018.
  17. Ruby on Rails Security Guide — Ruby on Rails Guides. guides.rubyonrails.org (англ.). Процитовано 9 квітня 2018.
  18. Kric., Kasperski, (2006). Zapiski issledovateli︠a︡ kompʹi︠u︡ternykh virusov. Moskva [Russia]: Piter. ISBN 5469003310. OCLC 70916777.
  19. Malware History / BitDefender. — 2010. — P. 23—24. — 71 p.
  20. Graham, Luke (7 лютого 2017). Cybercrime costs the global economy $450 billion: CEO. CNBC. Процитовано 9 квітня 2018.
  21. Sun, David. Cybercrime cost world economy $620 billion last year (англ.), Singapore: The New Paper (5 July 2017).
  22. Збиток від вірусу WannaCry оцінили в мільярд доларів. osvita.mediasapiens.ua. Процитовано 9 квітня 2018.
  23. The damage from the virus WannaCry exceeded $ 1 billion Архівовано 15 жовтня 2017 у Wayback Machine. (англ.), US: 6abc (25 May 2017)
  24. William Gamazo Sanchez (Vulnerability Research). MS17-010: EternalBlue's Large Non-Paged Pool Overflow in SRV Driver (англ.). http://blog.trendmicro.com/. Trend Micro (2 June 2017)
  25. WannaCry ransomware used in widespread attacks all over the world (англ.). https://securelist.com/. ЗАО «Лаборатория Касперского» (12 May 2017)
  26. Боровко, Роман. Экономический ущерб от вирусов, Москва: CNews Analytics (2003).
  27. Net Losses: Estimating the Global Cost of Cybercrime (англ.). https://www.mcafee.com/. McAfee (2014).
  28. Rbc.ua. Хакерська атака на Україну: подробиці. РБК-Украина (укр.). Процитовано 9 квітня 2018.
  29. Збитки від атаки вірусу Petya.A у світі сягають 8 мільярдів доларів - експерт (укр.). Процитовано 9 квітня 2018.
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.