GeekBrains _
7 275
Блоги

Учись на чужих факапах: разбираем громкие ошибки в программировании и их решения

GeekBrains о серьезных ошибках в программировании, от которых зависят миллиардные состояния, репутация и будущее бизнесов и проектов. Чек-лист для разработчика и стартапера перед запуском нового продукта или бета-тестированием.

Поделиться

В избранное

В избранном

1. Переполнение буфера

Исторически одна из самых опасных ошибок. Именно благодаря ей на свет появились черви Морриса и Nimda. Червь Морриса, например, в какой-то момент поразил все узлы зарождающейся всемирной паутины — ARPANET — и полностью парализовал ее работу. Сумма ущерба составила почти $100 млн.

Как исправляли: создатель червя Морриса сам явился с повинной и объяснил механизм действий. Его распространение стало возможно из-за неправильного вычисления позиций записи в память. Ошибку исправили, ограничив запись данных только «пределами» буфера.

2. Незащищенный SQL-запрос

Еще одним глобальным факапом в программировании можно считать ошибку в обработке баз данных, когда ПО собирает данные пользователя и отправляет их на SQL-запрос, но не обеспечивает необходимый уровень безопасности. Благодаря этому пробелу стала возможной SQL инъекция — хакерская атака, позволяющая получить прямой доступ к базе данных. Используя простую конкатенацию SQL-команд, злоумышленники считывают базы данных, удаляют и добавляют данные, устанавливают собственные ссылки.

Известные инциденты, случавшиеся с Sony, Nokia, Heartland Payment Systems и даже сайтом Леди Гага, произошли благодаря успешным SQL-атакам, компрометирующим информацию, хранящуюся в базах данных приложения. LulzSec, одна из известных хакерских групп, сделала SQL-инъекции своим основным оружием.

Как исправляли: автоматической проверкой, фильтрацией входных параметров — чисел, строк, дат, данных в специальных форматах; настройкой второго уровня защиты — определения признаков, характерных для работы хакерских утилит типа Sqlmap; созданием и регулярным пополнением черного списка хостов, с которых проводились SQL-инъекции.

3. Переполнение стека памяти

В 2014 году мировому ИТ-сообществу была представлена ошибка под названием Heartbleed, возникающая в библиотеке OpenSSL протокола TLS. Данный баг, вызванный переполнением стека памяти, позволяет практически любому человеку, подключённому к интернету, считать пользовательскую информацию объёмом до 64 кБ с компьютера с запущенным процессом OpenSSL. По приведённым в отчёте данным, около 17% всех защищенных сайтов использовали данный протокол и, как следствие, имели уязвимость Heartbleed.

Как исправляли: в итоге исправлениями всерьез занялись только Windows и Mozilla, а Google отделался лишь оперативным выпуском патча. Таким образом, где-то в интернете до сих пор бродит баг Heartbleed, злоумышленники до сих пор с его помощью извлекают личные данные, а ущербы от их действий продолжают расти.

4. Описка в коде из-за схожести символов

В отличие от остальных пунктов нашего обзора, эта ошибка не носит системный характер, а просто имеет место быть из-за пресловутого человеческого фактора и случается как с новичками, так и с профессионалами. По сути, от нее никто не застрахован.

Она заключается в том, что программист при составлении кода может допустить «грамматическую» ошибку, то есть, попросту говоря, перепутать символы. Самым ярким примером такой ошибки служит знаменитый факап с запуском к Венере аппарата «Маринер-1» стоимостью $18,5 млн, который взорвался спустя несколько минут после взлета. В случившемся принято винить специалиста, который при программировании аппарата вместо верхнего подчеркивания ввел дефис, что и привело к глобальному сбою системы.

Как исправляли: перед полетом аппарата «Маринер-2» были много раз скрупулезно проверены все коды, используемые при запуске ракеты. Мораль: даже если речь не идет о подобного рода масштабных проектах, где сбой в коде может привести к непредсказуемым последствиям, а запускаете вы «всего лишь» какой-нибудь приятный интернет-сервис — все равно проверьте код еще раз.

5. Инъекции команд ОС

Некоторое ПО используют встроенные команды операционной системы, например, для извлечения данных компьютера или запуска приложения. В этом случае здесь может возникнуть схожая ошибка — инъекции команд вашей ОС.

Так всего месяц назад самый популярный Linux для бизнеса был атакован через Twitter. Ошибка в DHCP-клиенте Red Hat Enterprise Linux позволяет выполнять произвольные команды на атакуемых машинах с правами «суперпользователя». Пробный эксплойт для бага уже существует и активно распространяется через Twitter.

Как исправляли: выпустили экстренные обновления, позволяющие проводить проверку данных.

6. Рискованные алгоритмы

При работе с персональными данными необходимо надёжно их защищать. Не стоит полагаться на собственные силы, ведь в мире существует множество готового ПО и алгоритмов, которые работают куда лучше вашего неопытного мозга. Впрочем, даже к их использованию надо подходить с умом. Так алгоритм хэширования SHA-1 устарел и легко взламывается современными хакерами.

В 2016 году был взломан Dropbox. В ходе взлома хакеры получили данные более 68 млн. пользователей. Больше половины украденных паролей были хешированы алгоритмом SHA-1.

Как исправить: стоит отдать предпочтение SHA-2 или SHA-3. В противном случае, вы рискуете не только репутацией своего ПО, но и вполне осязаемыми деньгами.

Это далеко не все факапы, которые требуют отдельного внимания. В следующей подборке поговорим про указатель на освобожденную память, переполнение числовых типов, неправильную оценку размера массива, использование ресурсов без ограничений, отсутствие инициализации. В общем, не бойтесь ошибок, их всегда можно исправить.

{ "author_name": "GeekBrains _", "author_type": "self", "tags": [], "comments": 19, "likes": 17, "favorites": 26, "is_advertisement": false, "section_name": "blog", "id": "41912", "is_wide": "" }
{ "is_needs_advanced_access": false }

Комментарии Комм.

Популярные

По порядку

0

Прямой эфир

Подписаться на push-уведомления
[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "bscsh", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-223676-0", "render_to": "inpage_VI-223676-0-1104503429", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=bugf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudx", "p2": "ftjf" } } }, { "id": 16, "label": "Кнопка в шапке мобайл", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byzqf", "p2": "ftwx" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvc" } } }, { "id": 19, "label": "Тизер на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "p1": "cbltd", "p2": "gazs" } } } ]