Безопасное программирование: различия между версиями
[непроверенная версия] | [непроверенная версия] |
Olegrok (обсуждение | вклад) м уточнение |
Olegrok (обсуждение | вклад) Нет описания правки |
||
Строка 20: | Строка 20: | ||
* [https://secuniaresearch.flexerasoftware.com/community/research/ Secunia] |
* [https://secuniaresearch.flexerasoftware.com/community/research/ Secunia] |
||
* [https://www.ibm.com/ru/services/iss/research.html IBM ISS X-Force] |
* [https://www.ibm.com/ru/services/iss/research.html IBM ISS X-Force] |
||
Современные [[Статический анализ кода | анализаторы кода]] и автоматизированные аудиторы могут использовать подобные базы уязвимостей (например [[PVS-Studio]] <ref name="pvsstud"> [https://habrahabr.ru/company/pvs-studio/blog/324114/ PVS-Studio: поиск дефектов безопасности] </ref>). Это повышает степень доверия к данному продукту, а также может быть важным при составлении отчётов об уязвимостях, имеющихся в программном продукте. |
|||
Встречаются и другие классификаторы. При работе с ними необходимо обращать внимание на авторов, каждая система классификации должна создаваться экспертами в данной области. |
Встречаются и другие классификаторы. При работе с ними необходимо обращать внимание на авторов, каждая система классификации должна создаваться экспертами в данной области. |
Версия от 12:28, 6 октября 2017
Безопасное программирование — практика написания исходного кода, обеспечивающего наилучшую безопасность системы и интерфейса.
Безопасное программирование — это практика разработки программного обеспечения, предотвращающая случайное внедрение уязвимостей и обеспечивающая устойчивость к воздействию вредоносных программ и несанкционированному доступу. Баги и логические ошибки являются основной причиной уязвимостей программного обеспечения.
Безопасное программирование помогает защитить данные пользователя от кражи и порчи. Небезопасная программа — потенциальная цель для злоумышленника, который может использовать уязвимости для несанкционированного доступа к информации, порчи программ и данных и получения контроля над компьютерными системами и сетями[1].
Важность
Безопасное программирование интуитивно можно определить, как процесс написания безопасной программы. Безопасная программа — программа, устойчивая ко всем возможным несанкционированным воздействиям (кроме изменения самого исполняемого файла программы). В данном случае, несанкционированными являются действия, ставящие под угрозу безопасность и использующие программу в условиях, которые не были предусмотрены при разработке. Следуя такому определению, программы, имеющие баги, не обязательно являются небезопасными. Они небезопасны лишь в случае, если имеющиеся баги позволяют злоумышленникам совершать несанкционированные действия. Так же если из-за имеющихся багов результат работы программы отличается от ожидаемого, но это не создает проблем с точки зрения информационной безопасности, то такую программу нет смысла рассматривать в качестве небезопасной.
Любое приложение является многоуровневым по своей структуре. Каждый уровень требует отдельного внимания при проектировании. Например, до реализации любой протокол должен быть разработан, должны быть разработаны и реализованы различные функции и интерфейсы. Само программирование — нижний слой проектирования приложения. Для обеспечения безопасности требуется внимание на каждом этапе проектирования приложения. Реализация безопасного протокола должна проходить с учетом требований безопасности, заложенных ещё на этапах описания и проектирования, а также не создавать новых уязвимостей, связанных с реализацией. Безопасное программирование — уровень в цепочке разработки безопасного приложения. При этом обеспечение безопасности исходного кода требует ручного анализа. Существуют специальные анализаторы, позволяющие упростить эту задачу. И всё же задача остается трудоемкой и отнимающей много времени, поэтому обеспечение безопасности — это дорогостоящая процедура, увеличивающая общую стоимость программного продукта. Однако отсутствие такого анализа повышает вероятность нахождения уязвимостей другими людьми, которые уже могут использовать их в своих корыстных целях[2].
Перечень и типы уязвимостей
Классификаторы
Любая найденная уязвимость потенциально может быть использована для взлома большого количества приложений. Для удобной работы по обеспечению безопасности и устранению проблем с ней уязвимости необходимо классифицировать. В первую очередь подобные классификаторы должны помогать специалистам и экспертам, работающим над устранением уязвимостей.
- CVE (Common Vulnerabilities and Exposures) — словарь конкретных уязвимостей конкретных продуктов.
- CWE (Common Weakness Enumeration) — база данных типов уязвимостей. Основная задача проекта — предоставить описания распространенных видов уязвимостей, способы их предотвращения, обнаружения и исправления.
- SecurityFocus BID
- OSVDB (Open Sourced Vulnerability Database) — база данных, прекратившая работу 5 апреля 2016 года. Блог продолжает работать.[3]
- Secunia
- IBM ISS X-Force
Современные анализаторы кода и автоматизированные аудиторы могут использовать подобные базы уязвимостей (например PVS-Studio [4]). Это повышает степень доверия к данному продукту, а также может быть важным при составлении отчётов об уязвимостях, имеющихся в программном продукте.
Встречаются и другие классификаторы. При работе с ними необходимо обращать внимание на авторов, каждая система классификации должна создаваться экспертами в данной области.
Виды уязвимостей
Список наиболее распространенных ошибок, ставящих под угрозу безопасность современных программ.
- Внедрение SQL-кода (англ. SQL injection)
- Уязвимости, связанные с web-серверами (XSS, XSRF, расщепление HTTP запроса (англ. HTTP response splitting))
- Уязвимости web-клиентов
- Переполнение буфера
- Дефекты форматных строк[5]
- Целочисленные переполнения
- Некорректная обработка исключений и ошибок
- Внедрение команд
- Утечка информации
- Ситуация гонки (англ. Race condition)
- Слабое юзабилити[6]
- Выполнение кода с завышенными привилегиями
- Хранение незащищенных данных
- Проблемы мобильного кода (англ. Code mobility)
- Слабые пароли
- Слабые случайные числа
- Использование небезопасных криптографических решений
- Незащищенный сетевой трафик
Ущерб
Информация об уязвимостях может быть использована злоумышленниками при написании вирусов. Например, один из первых известных сетевых червей — вирус Морриса в 1988 году использовал такие уязвимости как переполнение буфера в Unix-демоне finger для распространения между машинами. Тогда количество зараженных машин составило порядка 6 тысяч, а экономический ущерб по данным счётной палаты США составил от $100,000 до $10,000,000[7].
В 2016 компьютерные вирусы причинили мировой экономике ущерб в 450 миллиардов долларов.[8]
В 2017 ущерб от вируса WannaCry оценивают в $1 млрд. Случаи заражения были зафиксированы по меньшей мере в 150 странах[9]. Вирус использовал эксплойт EternalBlue, эксплуатирующий уязвимость в протоколе SMB, связанную с переполнением буфера[10].[11]
Примечания
- ↑ Introduction to Secure Coding Guide
- ↑ Importance of secure coding
- ↑ https://blog.osvdb.org/2016/04/05/osvdb-fin/
- ↑ PVS-Studio: поиск дефектов безопасности
- ↑ Метод поиска уязвимости форматной строки
- ↑ The Protection of Information in Computer Systems
- ↑ Апелляционный суд США оценил стоимость удаления вируса с каждой зараженной машины от $200 до $53,000. Вероятно на основании этих данных и был проведен расчет.
- ↑ Cybercrime costs the global economy $450 billion
- ↑ Ущерб от вируса WannaCry оценили в $1 млрд
- ↑ MS17-010: EternalBlue’s Large Non-Paged Pool Overflow in SRV Driver
- ↑ Экономический ущерб от вирусов
Литература
- Howard M., LeBlanc D., Viega J. 24 Deadly Sins of Software Security: Programming Flaws and How to Fix Them (англ.). — McGraw Hill Professional, 2009. — 464 p. — ISBN 9780071626767.
- Seacord R. C. Secure Coding in C and C++ (англ.). — 2. — Addison-Wesley, 2013. — 600 p. — ISBN 9780132981972.
- Касперски К. Записки исследователя компьютерных вирусов . — Питер, 2005. — P. 93, 103-104, 117-122. — 316 p. — ISBN 5469003310.
- Комаров А. Меряем уязвимости // Хакер. — 2009. — № 04 (124). — С. 48—51.
Дополнительная литература
- Seacord R. C. The CERT C Secure Coding Standard (англ.). — 2008. — P. Pearson Education. — 720 p. — ISBN 9780132702461.
- Long F. The CERT Oracle Secure Coding Standard for Java (англ.) / Carnegie-Mellon University. CERT Coordination Center. — Addison-Wesley Professional, 2012. — 699 p. — ISBN 9780321803955.