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

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

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

0
19 комментариев
Написать комментарий...
Данил Василевский

"Известные инциденты, случавшиеся с Sony, Nokia, Heartland Payment Systems и ДАЖЕ С САЙТОМ Леди Гага..."
Вот от Гаги такого не ожидал, это ж самый технологичный сайт в мире, не то, что всякие Sony, Nokia и т.д.

Ответить
Развернуть ветку
SocialWarrior

Круче Гаги только Тейлор Свифт

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Ivan Litvinov

Покажите хоть как выглядит это "верхнее подчеркивание"

Ответить
Развернуть ветку
Данил Василевский

В целях цензуры пропустил кое-чё

Ответить
Развернуть ветку
Максим Чистов

Хай?

Ответить
Развернуть ветку
Bela Lugosi's Dead

Заодно бесят люди, которые пишут "нижнее подчеркивание" (как будто оно бывает каким-то, кроме нижнего)

Ответить
Развернуть ветку
Nikita

Писал человек явно далекий от "этих ваших программирований". Не стыдно такое выкладывать образовательному IT-порталу, на котором обучают "ведущие IT-специалисты"? Почти каждое предложение в этом опусе содержит или ошибку, или неточность.

Ответить
Развернуть ветку
Гала Перидоловна

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

Ответить
Развернуть ветку
Евгений Пронягин

по мне так эта статья больше для хабра, чем для vc

Ответить
Развернуть ветку
Андрей Крылатов

На хабре за такую статью порвали бы в клочья: "верхнее подчёркивание", "исправлениями всерьез занялись только Windows и Mozilla, а Google отделался лишь оперативным выпуском патча" — это, может, для "предпринимателей нового поколения" и потянет, а на хабре не простили бы.

Ответить
Развернуть ветку
Алексей Андрианов

vc в хабр превращается

Ответить
Развернуть ветку
Константин Григорьев

Надо бы свою статью написать, как минимум про очистку токенов действий и недоверие к данным с фронтенда.

Ответить
Развернуть ветку
Кирилл Шнуров

"компьютера с запущенным процессом OpenSSL"

Статью явно писала журналистка для домохозяек. На Хабре бы за такое забанили навечно.

Ответить
Развернуть ветку
Anton Smets

Так что они блоки кода не тестировали, перед тем как на Венеру аппарат пускать?

Ответить
Развернуть ветку
iLeonidze

В основном все какое-то такое т.к. такое позволительно джунам совершать. Но вот «Описка в коде из-за схожести символов» это интересный и частый кейс. Например при конвертации файлов между разными системами могут появляться невидимые символы, отчего некоторые компиляторы начинают «чудить». Тоже можно было бы осветить про такие невидимые чудо-символы, сколько с ними времени было потрачено вникуда :)

Ответить
Развернуть ветку
Angel Vivaldi

Да ладно вам, какой сеньор себе с ногу не стрелял?

Ответить
Развернуть ветку
Alexander Shakun

Кто себе в ногу не стрелял, тот не сеньор!

Ответить
Развернуть ветку

Комментарий удален модератором

Развернуть ветку

Комментарий удален модератором

Развернуть ветку
Владимир Киреев

Heartbleed с переполнением стека никак не связан.

алгоритм хэширования SHA-1 устарел и легко взламывается современными хакерами

Успешная атака (shattered) оценивается в ~$110000 по ресурсам на GPU и 1 год по времени

Ответить
Развернуть ветку
16 комментариев
Раскрывать всегда