Как одна строчка в коде поставила под угрозу безопасность на всех устройствах Apple

"Ошибка" - термин, который заставляет большинство разработчиков бояться ночи, и причина, по которой они постоянно прекращают работу и смотрят в космос, когда вы " говорим с ними. Хотя это и печально, и правда, в действительности все не так уж плохо. Ошибки постоянно выявляются в программном обеспечении, и их невозможно избежать просто потому, что мы люди и делаем ошибки. Большинство ошибок устраняются путем тщательного тестирования программного обеспечения, но некоторые проскальзывают через сеть. Но те, которые действительно становятся вирусными, являются глупыми, но вредными. Одной из таких ошибок была печально известная ошибка кода Apple, неофициально называемая goto fail или официально CVE-2014–1266. .

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

SSL - как компьютеры проверяют и доверяют другим компьютерам в Интернете.

Прежде чем мы поймем, что пошло не так, нам нужно понять «SSL» - Secure Sockets Layer: механизм, который позволяет компьютерам доверять и проверять веб-сайты в Интернете. Ваш браузер делает это за вас каждый раз, и вот как это выглядит:

В наши дни все веб-сайты используют HTTPS (т. Е. HTTP с SSL) для безопасного подключения. Это заставляет посещаемый вами веб-сайт предъявлять сертификат, подтверждающий его подлинность. Затем ваш компьютер проверяет это по набору предварительно загруженных ключей в браузере, чтобы узнать, имеет ли он цифровую подпись органом по сертификации. Эта цифровая подпись использует математику асимметричной криптографии. Если эта математика сработает и сертификат окажется подписанным одним из ключей центра сертификации (ЦС) в браузере - это даст вам зеленый свет, и все будет бестолково . Никто не может обнюхать ваши данные или захватить ваши веб-сеансы.

Но когда на другом конце находится самозванец, ваш браузер останавливает вас. Вот пример, который я создал на python, выдавая себя за сервер wikipedia.org:

Браузер знает об этом, потому что у меня нет сертификата, подписанного одним из органов, по которому браузер проверяет. Фактически, я сам подписал сертификат, сказав: 'Я - wikipedia.org' (не лучший из взломов), но SSL знает это. и защищает вас от этого. Примечание - «самоподписанный корневой сертификат»:

Код подтверждения SSL от Apple не работает

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

Код языка C с ошибкой показан ниже (упрощенный для краткости). Ваш iPhone / MAC вызывает эту функцию каждый раз, когда вы посещаете веб-страницу, и вот что с ней произошло:

Итак, этот фрагмент кода проверяет подлинность сертификатов веб-сайта. Процесс включает серию проверок с несколькими операторами ‘if’ . Но, как ни странно, вы можете увидеть, что есть лишняя строка - «goto fail; » (отмечен оранжевым), который стал безусловным утверждением . Это потому, что он находится за пределами оператора ‘if’ (C не управляется отступами, как Python). В языке C это означало, что он всегда пропускал следующие строки (отмечены синим) и перескакивал на строку 'fail' внизу, чтобы вернуть переменную ' ошибка '. Таким образом, если переменная «err была успешной до этого момента, вся проверка будет успешной без каких-либо дополнительных проверок (отмеченных синим).

Если вы кричите: Используйте фигурные скобки {} для операторов if!, вы правы. Мы уже не в 80-х, пытаясь сэкономить несколько байтов, избегая фигурных скобок на маленьком EPROM.

Короче говоря, все устройства Apple (iPhone, MAC, планшеты) потеряли возможность выполнять проверку SSL - стандартную защиту Интернета от подслушивания и взлома сети. Эта уязвимость была впервые опубликована в середине 2014 года в базе данных Common Vulnerabilities and Exposures - здесь.

Это было исправлено Apple в обновлении iOS 7.0.6:

https://support.apple.com/en-gb/HT202934
iOS 7.0.6
Data Security
Available for: iPhone 4 and later, iPod touch (5th generation), iPad 2 and later
Impact: An attacker with a privileged network position may capture or modify data in sessions protected by SSL/TLS
Description: Secure Transport failed to validate the authenticity of the connection. This issue was addressed by restoring missing validation steps.

Кстати, эта ошибка применялась только к версиям SSL ниже TLS 1.2, но не к TLS 1.2 . Однако версия TLS может быть согласована между компьютерами, и удаленный сервер может выбрать TLS1.1, если пожелает. Это означало, что уязвимость оставалась открытой.

Человек в средней атаке

Атака MITM (человек посередине) была наиболее распространенным способом использования ошибки, которая позволяла хакерам проникать посередине и подслушивать весь трафик между вами и реальным веб-сайтом. Это означало, что они получили от вас практически все - ваши пароли, данные кредитной карты, ваше местоположение и т. Д.

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

Википедия

Ретроспектива

«Человеку свойственно ошибаться», но именно поэтому мы следим за процессами в нашей жизни. Мы все совершаем ошибки, но существующие программные процессы должны были их идентифицировать.

  • Почему его не обнаружили модульные тесты?
  • Почему не было проверки партнерского кода?
  • Почему это не удалось обнаружить с помощью процесса тестирования программного обеспечения или автоматизированных тестов?
  • Конвейеры CICD запускают автоматические тесты сборки и развертывания программного обеспечения. Почему это не сработало?

Хотя некоторые ошибки кода невероятно сложны и незаметны, есть также очевидные и глупые, но наносящие серьезный ущерб. Последней была пресловутая ошибка кода Apple "goto fail;", напоминание как в программном обеспечении, так и в жизни: тестировать, тестировать, тестировать перед запуском .