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

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. В противном случае, вы рискуете не только репутацией своего ПО, но и вполне осязаемыми деньгами.

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

©  vc.ru