Распределенные системы могут отдавать приоритет целостности операции записи (например, Amazon действительно хочет убедиться, что операция «Добавить в корзину» очень надежна) или целостности операции чтения (любой флаг «Учетная запись Алисы заблокирована» будет виден при любом чтении каждым банковским приложением), и они могут отдавать приоритет либо скорости сходимости, либо скорости действий, допуская некоторую непоследовательность.
Сообщения проходят по каналам; электронные письма передаются по каналу SMTP, а HTML-страницы – по каналу HTTP (а часто и по каналу TLS). В современном мире мы привыкли к тому, что TCP прозрачно обеспечивает нам надежную и упорядоченную доставку сегментов TCP по ненадежной IP-магистрали. Вы можете подделать и сообщение, и канал, но средства и последствия этого будут разными. Фальсификацию сообщения, как правило, легче представить себе до или после того, как оно попало в определенный канал, особенно когда канал имеет такую защиту, как TLS (рис. 2.1).
Рис. 2.1. Каналы и сообщения
Корабль принцессы Леи – «Тантив IV», и это один из двух кораблей, показанных на рисунке 2.1. По какой-то причине он общается с кораблем ботанов. Есть канал, показанный в виде трубки, и сообщения, которые проходят через него. (В этой схеме есть серьезные угрозы конфиденциальности, и мы поговорим о них в главе 4 «Раскрытие информации и конфиденциальность».) Связист ботанов может подделать сообщение 1 во время его подготовки, Империя может подделать сообщение 2, а имперский шпион, внедренный к повстанцам, может изменить сообщение 3 до того, как оно попадет к Лее.
Иногда сообщения имеют защиту целостности, например цифровую подпись. Иногда каналы имеют защиту целостности, например, каждое сообщение защищено хэшем с ключом.
Если целостность ваших сообщений не защищена, ничто не предотвратит их изменение и не поможет вам обнаружить их. Если у вас поддерживается целостность в системе обмена сообщениями, вам, вероятно, придется столкнуться со сложным процессом выбора служебных заголовков, включенных в защиту целостности. В сообщениях электронной почты, например, вы не можете включить заголовок (заголовки) «Подпись», но, что более интересно, вы не можете предсказать маршрут, по которому пойдут сообщения, и, следовательно, не можете включить строки Received, которые добавляются по пути. И очень многие из таких схем будут уязвимы для внедрения заголовков. Внедрение заголовков – это добавление новых заголовков способами, которые не анализируются получателями должным образом.
Атаки с внедрением заголовков могут использовать дополнительные ложные заголовки, в зависимости от того, как написан код. Расчет на то, что люди и автоматические синтаксические анализаторы будут «видеть» разное. Еще хуже, если проверка подписи отделена от синтаксического анализа отображения, и не прошедший проверку заголовок может отображаться у пользователя только потому, что он первый или последний, или то, что код пользовательского интерфейса решит показать именно этот из заголовков. Подробнее об этой атаке читайте в главе 8 «Распознавание и порча».
Конечно, когда вы подписываете или аутентифицируете сообщения, вам необходимо хранить ключи и управлять ими. Хранилищу ключей может угрожать подделка или раскрытие информации, а код управления подвержен угрозам подделки, раскрытия информации или угрозам расширения полномочий. Это может привести к краже ключей или их использованию за пределами их обычного пути. И то и другое нарушит целостность сообщения. Обработка исключений сложна, поэтому после того, как Повстанческий альянс украдет коды аутентификации, штурмовая группа может высадиться на луне Эндора. Что делать с просроченными ключами – раздражающая проблема (см. главу 3 «Отказ от ответственности и доказательства»).
Целостность канала может быть важна как системное свойство, защищающее группу сообщений в качестве набора или ограничителя, затрудняющего подделку конкретных сообщений. Например, может быть полезно защитить информацию о том, что некий ботан отправил три сообщения повстанцу, даже если у вас нет информации об их содержании. Если вы хотите вмешаться в работу канала, вы сможете сделать это из-за отсутствия защиты целостности или ее недостаточности, или из-за плохого управления ключами. Метаданные о сообщениях, которые канал может защитить от несанкционированного доступа, включают время, размер, направление, вход и выход участников и/или представление участников именами систем или дисплеев. Например, если вы защищаете информацию об IP-адресах, связанных с каналом, вы также можете собирать и защищать информацию о том, как эти IP-адреса сопоставляются с доменными именами, SMB-именами и другими системами именования на других уровнях. Программное обеспечение для управления системами часто изменяет эти сопоставления с течением времени и может не поддерживать нужные журналы, поддерживать их столько, сколько вы хотите, или синхронизировать их с вашими временны´ми интервалами. Возможность модификации реализована явным образом, и поэтому мы говорим «изменить», но злоумышленники могут сделать то же самое, и в этом случае мы называем это вмешательством. Кроме того, сопоставление между именами, используемыми вашей системой, и другими идентификаторами, такими как адрес электронной почты или номер телефона, часто является информацией, которую некоторые люди захотят сохранить в тайне.
Когда вы сосредоточены на целостности, может оказаться легко проигнорировать посредников, которых традиционно называют «человек посередине» (man in the middle) (MITM). MITM также расшифровывается как «обезьянка посередине» (monkey in the middle). Если вы можете настроить MITM, у вас есть и другие способы для вмешательства, помимо добавления или удаления сообщений. Эти способы включают воспроизведение подписанных сообщений, отправку их обратно (что чаще всего интересно в контексте симметричной аутентификации, например, кода проверки подлинности сообщений) или отправку подделанных сообщений с явно хорошими порядковыми номерами. Если вы передаете порядковые номера до того, как проверка подлинности сообщения будет выполнена, вы можете рассматривать будущие допустимые сообщения как недействительные, поскольку вы уже проанализировали этот порядковый номер.
Кроме того, если у вас есть канал из точки А в точку Б, насколько хорошо охраняют вход и выход? Может ли кто-то вставить сообщение на одной стороне, чтобы оно вышло на другой? Когда событие произойдет, будет ли это рассматриваться как сообщение от А к Б или В? Это может быть сбитый с толку представитель или тот, кто получил взятку.
Большинство систем имеют по крайней мере несколько мнений о значении слова «сейчас», а разногласия, недоразумения или даже атаки на время являются либо помехой для операций, либо строительным блоком для атаки. Есть системное время, которое установлено либо на расчетное время, либо на UTC (всемирное скоординированное время), и отображаемое время, которое, вероятно, учитывает часовые пояса. Телефоны и ноутбуки часто физически перемещаются в новые часовые пояса, а существование такой гадости, как летнее время, означает, что время на часах может увеличиться не только на одну секунду за раз.
Когда вы полагаетесь на время, важно понимать, что его можно изменять как со злыми, так и с благими намерениями. Мотивация не меняет проблему, а оборонительное проектирование и шаблоны реализации, которые вы захотите использовать для защиты от злонамеренных изменений, также могут сделать ваши системы более надежными.
Иногда секунда системного времени длиннее часа, например, когда виртуальная машина переходит в спящий режим. В других случаях фактическое время может меняться непредсказуемым образом. Правительство Самоа однажды решило, что одна из пятниц не нужна, поскольку они переместились по другую сторону линии перемены дат, а это означало, что произошла разница во времени между Самоа и другими странами, кроме острова Токелау. (Да, Самоа действительно сделало это в 2011 году, чтобы приблизить свои часовые пояса к важным торговым партнерам [Mydans, 2011; Sussman, 2012]). Сохранение системного времени в формате UTC, а не по местному времени, означает, что у вас будет меньше проблем, связанных с изменениями местного времени. Поэтому, если вы не находитесь в межгалактической миссии, держите системное время в UTC. (Это также относится к космическим аппаратам меньшей дальности – за исключением марсоходов.)
Бóльшая часть системного времени управляется бортовыми часами, с корреляцией с серверами времени, часто через NTP или GPS либо, возможно, через вышки сотовой связи. Дрейф часов является проблемой для сопоставления журналов даже при отсутствии злоумышленника. Злоумышленники используют эту схему, чтобы подделать системное время. Многие системы безоговорочно доверяют указаниям DHCP о том, какой NTP-сервер использовать. Удаленный злоумышленник, который может подделать NTP-пакеты, сигналы GPS или сотовые сигналы, может использовать эти инструменты, чтобы изменить представление системы о том, который час. Аналогичным образом локальный пользователь может изменить системное представление о смещении времени (между фактическим и системным временем), часовом поясе или системном времени. Для этого могут потребоваться или не потребоваться права администратора.
Злоумышленники могут воспользоваться временем, изменяя его. Его перевод назад может привести к тому, что сертификат, лицензионный ключ или другие данные будут рассматриваться как действительные после истечения срока их действия или недействительные из-за того, что дата ввода в действие еще не наступила. Перевод вперед может иметь аналогичные последствия. На локальном компьютере это может позволить вам дольше использовать дорогостоящее программное обеспечение, заблокировать доступ к сайту, потому что система считает, что сертификат этого сайта больше не действителен, или дольше играть в «Звездные войны», потому что родительский контроль не работает должным образом. Если вы сможете скорректировать представление сервера о времени, вы сможете купить билеты на концерт до того, как они поступят в продажу, или предотвратить подачу заявок вашими медлительными соперниками, закрыв окно подачи заявок раньше. Точно так же вы можете торговать акциями, когда рынок закрыт. В каждом месте, где есть окно дозволенной активности, вмешательство во время может помочь вам, навредить вашим соперникам или и то и другое вместе.