Очень многому я учусь у моих студентов. Когда я слышу вопросы, которые они задают, и читаю работы, которые они сдают, я узнаю´, с какими трудностями они встретились, обеспечивая безопасность своих систем. Тому, что я знаю об угрозах, я обязан десятилетиям карьеры, нескольким мудрым учителям и множеству совершённых ошибок. Как я упоминал в разделе «Благодарности», появление этой книги простимулировано простым вопросом «Где я могу узнать больше об этих угрозах?».
Подобно тому, как говорят: «Я чувствую, что в нем есть что-то хорошее» – я чувствовал этот вопрос во многих разговорах. За словом «безопасность» скрывается немало сложностей и нюансов. Я собрался было сказать, что мы узнаём об угрозах благодаря постепенному осознанию, но это неправда. Мы скорее узнаём об угрозах, когда что-нибудь идет не так. Даже когда это «что-нибудь» размером меньше, чем «Звезда смерти», уроки часто бывают травматическими, иногда меняющими карьеру. Трагедия – плохой учитель.
Если мы хотим систематического исследования угроз нашим продуктам, мы должны структурировать то, как мы узнаём об угрозах и как мы учим этому.
Эта книга – для каждого инженера.
Она будет наиболее полезна тем, кто строит или использует сложные системы, насыщенные программным обеспечением. В инжиниринге иногда приходится идти на тяжелые компромиссы, которые становятся еще тяжелее, когда цели обеспечения безопасности неясны или расплывчаты. Книга сфокусирована на системах, которые включают код, но где его нет в наше время? Инженеры, которые работают в более традиционных отраслях (аэрокосмическая, химическая, гражданское строительство, машиностроение), обнаруживают, что элегантные механические системы прежних времен сейчас вытесняются. Ваши системы теперь просто обязаны иметь дело с кодом, и вы должны заниматься его безопасностью.
За последние несколько десятилетий профессия разработки программного обеспечения и эксплуатации систем изменилась. Мы поняли, что надежды со временем дооснастить системы свойствами доступности, надежности и удобства использования дорого нам обходятся и что необходимо внедрять эти свойства с самого начала. С безопасностью то же самое. Выбор, сделанный во время разработки системы, имеет последствия. Необходимо более раннее и целостное решение проблем безопасности.
Эта книга – для профессионалов и энтузиастов в сфере безопасности. Есть множество направлений в разных отраслях, которые ориентированы на безопасность и взломы. Не во всех из них существует обширная структура, помогающая организовать поток информации об угрозах, уязвимостях и эксплойтах, с которыми вы можете столкнуться. Я надеюсь, что моя книга будет полезна и в таких случаях.
Это книга – для каждого инженера, даже если он не поклонник научной фантастики, а если поклонник, то все равно, к какому фандому он принадлежит. Когда я рассказываю о своей книге, поклонники «Звездного пути» выглядывают из туманностей, чтобы спросить: «Почему?» Я тоже люблю «Путь». Мне нравится оптимистический взгляд на будущее, уважительное отношение создателей сериала к науке и профессиональной компетентности, а также сценарий и развитие характеров. Изначально в рукописи было посвящение «Смело защищать то, что еще не защищал ни один человек!» как дань уважения «Звездному пути». Моя команда сказала, что это слишком резко для начала книги, и они были правы.
Безопасность.
Более конкретно, вы достигнете понимания безопасности такими способами, которые позволят вам строить и эксплуатировать системы, способные работать несмотря на происки врагов. Подобно тому, как понимание силы (в смысле массы, умноженной на ускорение) позволяет нам думать о различных частях мира и применять ее в своих проектах, эта книга обеспечивает вас долговечной основой для прогнозирования угроз.
По традиции здесь приводят бесконечный список просчетов в безопасности в надежде мотивировать читателей. Не похоже, что это помогает, так что я даже не буду начинать. В 2023 году главный вопрос безопасности больше не «Почему?». Теперь это «Что?» и «Как?».
Эта книга написана для инженеров: людей, которые строят или эксплуатируют сложные технические системы, в особенности алгоритмы, микросхемы, датчики и исполнительные механизмы этих систем. Она написана так ясно, насколько это возможно в разумных пределах, и, если вы не технарь и просто ищете рекомендации, я хочу посоветовать вам сделать три вещи.
Во-первых, включите автоматические обновления для всего, особенно для устройств, операционных систем и веб-браузеров. Подготовленные инженерами обновления очень часто исправляют проблемы безопасности, которые могут быть использованы автоматически. Если ваш поставщик смешивает функциональные изменения и исправления, касающиеся безопасности, громко жалуйтесь. Но этот шаг – решающая защита от подобных уязвимостей.
Во-вторых, используйте менеджер паролей и доверьте ему создавать для вас сложные произвольные пароли. Одна из разновидностей нарушения безопасности – это когда с веб-сайта крадут ваш адрес электронной почты и пароль. Организаторы атак собирают эти списки и торгуют ими, а также проверяют эти комбинации на каждом сайте, до которого могут дотянуться. Они также перебирают варианты. Они знают, что мой пароль для Amazon может быть adamamazon или amazonas1, а компьютеры очень хороши в подборе такого типа комбинаций, наряду с amazon-feb и другими, о которых вы могли подумать. Используйте длинные произвольные последовательности в качестве паролей. Между прочим, я использую в качестве менеджера паролей 1Password компании Agilebits и могу его рекомендовать. (У нас нет деловых отношений с этой компанией.)
В-третьих, доверяйте вашим ощущениям. Если вы чувствуете, что сайт небезопасен, покиньте его. Найдите компанию с помощью поиска или закладки. Если вы думаете, что адрес электронной почты подозрителен, позвоните человеку или организации, от имени которой послано письмо. Используйте номер телефона на обратной стороне вашей банковской карты, чтобы позвонить в банк. В каждом из этих случаев вы сохраняете контроль и используете ресурсы, на которые атакующие не могут повлиять.
Возможно, злоумышленники смогут даже подменить банковскую карту в вашем бумажнике. Если они такие умные, обратитесь за профессиональной помощью. Это не сарказм. Если против вас шпионское агентство, у которого достаточно времени и энергии, чтобы подделать карту и засунуть ее в ваш бумажник, эти советы вас уже не спасут.
Еще два возможных шага, если хотите дополнительной безопасности. Во-первых, заведите особые адреса электронной почты для особых отношений. Заведите адрес типа hiufd-suapre8wafdsjkf@gmail.com и используйте его для банка или всех ваших банков. Это защитит вас, если атакующие завладеют вашим главным почтовым аккаунтом, и поможет отсортировать почту с фишингом. Если вы используете этот адрес только для вашего банка, то любое сообщение от банка в основном аккаунте автоматически становится подозрительным. Смотрите выше замечание о том, что стоит доверять ощущениям.
Наконец, я использую отдельный браузер и профиль пользователя в браузере для онлайн-банкинга. Программное обеспечение браузеров в наше время достаточно надежно, но со всеми этим атаками я чувствую себя более защищенным, используя для этого малоиспользуемый браузер. (В настоящее время один из моих браузеров – Firefox, а другой – Chrome. Когда-то это были два разных аккаунта в Firefox с очень разным визуальным оформлением.)
Это все. Вот мои советы. Спасибо за то, что купили эту книгу. Буду рад, если вы ее прочитаете или передадите технарю или начинающему технарю, которого знаете. В любом случае я буду предполагать, что мой читатель технически подкован, поэтому мы будем говорить на двоичных языках, которые пронизывают ткань как далекой-далекой галактики, так и нашего собственного мира.
Позвольте привлечь ваше внимание к принципу, который лежит в основе этих советов: изоляция. Менеджер паролей изолирует сайты друг от друга, то же самое делает использование двух разных почтовых аккаунтов или двух браузеров. Уход с сайта или звонок в банк позволяют покинуть место атаки. Эта изоляция, отделение частей системы друг от друга, – также причина того, что у нас есть разные учетные записи компьютеров, файрволы и другие методы защиты.
Конечно, за каждый уровень изоляции нам приходится платить удобством. Если вы не позволяете программному обеспечению беспрепятственно взаимодействовать друг с другом, это означает, что вам придется предпринимать определенные усилия, чтобы оно взаимодействовало, и злоумышленникам нужно будет как-то обманом заставить вас сделать это.
Печально, но этот совет вы услышите не от каждого. Нам недостает информации о коренных причинах и истории инцидентов, которые помогли бы нам расставить приоритеты. Об этой проблеме я пишу в другом месте и не буду углубляться в нее в этой книге.
У вас в руках книга об угрозах. Мы все узнаём угрозу, когда слышим: «Гони деньги, не то получишь!» или «Я изменил условия сделки. Молитесь, чтобы… в последний раз». Я использую термин «угроза», имея в виду некоторую будущую проблему, которую часто можно предотвратить, если принять профилактические меры.
В отрасли безопасности слово угроза используется по-разному. Мы называем злоумышленника угрозой или носителем угрозы. В той части отрасли, где занимаются защитой от вредоносного программного обеспечения, угрозой называют каждый вирус или фрагмент вредоносного кода.
Исполнение угрозы – это нападение. Каждая угроза, ее проявление и ее воздействие могут вызывать беспокойство. В законе реальная угроза рассматривается как насилие; ударить кого-то – это «избиение» в словосочетании «нападение и избиение». Это может привести к травме. В кибербезопасности мы часто беспокоимся и об угрозе, и о ее результате. Если кто-то совершает взлом под видом законного пользователя (spoofing), возможно образование по цепочке других угроз, таких как фальсификация или раскрытие информации. Особенно на этапе обучения полезно установление конкретной взаимосвязи между механизмом и воздействием. Риск – это количественное уточнение угрозы, и эти количественные измерения часто включают вероятность успеха и объем последствий, выраженный в долларах или в жизнях.
Злоумышленники используют некоторое средство для получения выгоды от использования уязвимости. Средством эксплуатации уязвимости или просто эксплойтом называют код, который дает использующему его сделать что-либо, что хозяин системы предпочел бы предотвратить. Эксплойт можно применить для намеченной цели. Уязвимость – это либо специфическая проблема (ошибка) в коде, оплошность, допущенная из-за неполного учета проектных требований, либо результат компромисса, сделанного дизайнерами или эксплутационниками. Иногда конкретика вносит ясность, в других случаях она доводит до педантизма.
В компьютерной безопасности широко используют термин доверие (trust), и он легко может сбить с толку. В обычном языке доверие означает «твердую веру в чью-нибудь надежность, честность или способность». Заслуживающий доверия означает кого-то, кто соответствует этим ожиданиям. В компьютерной безопасности доверенный означает нечто способное нарушить вашу безопасность. Профессор Росс Андерсон из Кембриджского университета приводит пример: «Шпион, пойманный на продаже секретов, был доверенным, но не заслуживающим доверия». Другие указывают на то, что это слово часто используется в пассивном залоге или с оруэлловской интонацией. Выражение доверенная система (trusted system) не может сообщить нам, кто доверяет системе. Галактическая Империя часто помечала системы как «доверенные», чтобы не обсуждать их воздействие на людей, которых они касались.
Афоризмы
Есть несколько мудрых выражений, которыми бы я хотел поделиться, поскольку они могут широко использоваться в вашей работе, связанной с безопасностью.
«Атаки становятся только лучше; они никогда не становятся хуже». Брюс Шнайер утверждает, что так поговаривают в Агентстве национальной безопаснасти (АНБ) США. Хотя защита развернута, уроки атаки никогда не забываются. Инструменты, разработанные для ее проведения, не пропадают. Они оттачиваются и шлифуются.
«Теории безопасности возникают из теорий незащищенности», – сказал Рик Прото из АНБ. Атаки становятся лучше, а совокупность атак определяет то, что мы вообще думаем о безопасности.
«Все модели неправильны; некоторые модели полезны». Слова британского статистика Джорджа Бокса.
«Компьютерная безопасность – это извращение. Когда вы хотите, чтобы что-нибудь было трудным, это легко, а когда вы хотите, чтобы что-нибудь было легко, это трудно». (Автор я.) Рассмотрим удаление файла. Когда вы действительно хотите, чтобы файл исчез, это трудно сделать, а когда вы хотите его восстановить, это на удивление сложно. Сложно заставить файл исчезнуть, потому что его удаление обычно означает просто удаление ссылок в файловой системе. Если вы попробуете переписать биты на магнитном диске, окажется, что физические записи на диске различаются по размеру и поэтому их можно прочитать и после перезаписи. А флеш-накопители вообще делают почти невозможным создание записи в том же самом физическом месте. Сходным образом легко найти случайность, когда вы хотите предсказуемости. Компьютеры кажутся непредсказуемыми, и часто встречаются гейзенбаги (ошибки, которые то появляются, то исчезают, или меняют свои свойства при попытке отладки), но вы попробуйте написать безопасный генератор случайных чисел.
«Злоумышленники будут использовать свой бюджет так, как они хотят, а не так, как вы надеетесь». (Опять я.) Вы можете надеяться, что атакующие будут себя вести неким определенным образом, но тогда они бы не были злоумышленниками.
«Безопасность – это системное свойство». Неясно, кто первым это сформулировал. Это справедливое заявление, и означает оно, что безопасность системы часто ограничена слабыми звеньями. Эта книга поможет вам удалить эти слабые звенья.
«Работает то, что доставлено». Это общее изречение в Microsoft. Все новые возможности, которые вы разработали, не имеют никакой ценности, пока не используются вашими потребителями, так что задержка ради добавления нескольких дополнительных возможностей часто неразумна. Аналогично задержка в сдаче разработки в надежде достижения идеальной безопасности означает, что никто не может использовать разработанные вами новые возможности. Я должен сейчас принять такое же решение о сдаче этой книги: я надеюсь, что ее достоинства перевешивают ее недостатки.
«Дьявол в деталях». Кто бы это ни сказал, он не думал о безопасности, а мог бы и подумать. Множество прекрасных вещей оказываются менее безопасными, как только погрузишься в них, и эксперты по безопасности с большим уважением относятся к талантливым специалистам по обратному проектированию, которые расчленяют системы, чтобы понять их внутреннее устройство, и в процессе открывают неожиданные свойства этих систем.
Эта книга начинается с аббревиатуры STRIDE, которая определяет классическое понимание угроз. STRIDE – это Spoofing, Tampering, Repudiation, Information Disclosure, Denial of Service, Expansion of Authority (спуфинг, вмешательство, отказ от ответственности, раскрытие информации, отказ в обслуживании, расширение полномочий). STRIDE – это мнемонический прием, который помогает запомнить шесть главных групп угроз, которым посвящены первые шесть глав книги. За ними следуют главы о предсказуемости, распознавании и поэтапных кибератаках.
Большинство глав этой книги следуют одному и тому же общему плану: начать с объяснения угрозы, потом показать, как она проявляется в конкретных технологиях, механизмы, которые используют злоумышленники, и, наконец, короткий раздел, посвященный защите.
Существует множество способов организации материала в такого рода книгах. Я рассматриваю разные вычислительные модели, и те пути, какими на них воздействуют разного рода угрозы. Эти модели включают интернет вещей (Internet of Things, IoT), мобильные вычисления, облачные вычисления и ИИ / машинное обучение. Подробности в соответствующих разделах служат дополнением к более широким утверждениям главы, а не заменой им: тот факт, что компьютер имеет форму плюшевого мишки, не значит, что остальная часть главы неприменима. Несколько таких разделов в других главах снабжены дополнительными подразделами, потому что природа угроз обладает интересными свойствами в специфических сценариях, которые стоит обсудить.
Единственная из развивающихся технологий, которая осталась не затронутой, – это квантовые вычисления. Большинство угроз из STRIDE будут работать для систем, окружающих квантовое ядро, и, вероятно, для самого ядра тоже. Например, потребляемая мощность зеркал в квантовой криптографии ведет к раскрытию важной для атак информации. (Квантовое криптование использует информацию о спи´не, чтобы распространять криптоключи так, что это очень сложно подслушать, но часто полагается на оптику между сайтами. Это очень отличается от использования квантовой механики для вычислений.) Первичный ранний эффект квантовых вычислений – высокая вероятность взлома большей части классической ассиметричной криптографии: перспектива вычисления секретных ключей с помощью квантовых компьютеров создает угрозу раскрытия информации. Если вам интересны квантовые вычисления, книга Law and Policy for the Quantum Age («Закон и политика квантового века») [Hoofnagle and Garfinkel, 2021] будет отличным введением в предмет.
Другой важный выбор в организации материала – это постоянное возвращение к перечню угроз. Исходя из моего опыта преподавания, когда кто-то встречает информацию в первый раз, она не сразу усваивается. Часто помогает возвращение к этой информации, чтобы посмотреть на нее под другим углом.
Стиль и условности
В книге упомянуты многие организации и продукты. Названия продуктов используются, только чтобы привести конкретный пример, не подразумевая злого умысла по отношению к создателям или владельцам торговой марки. Помечать каждый такой случай выражением «например» было бы пустой тратой времени большинства читателей, ради возможных выгод для тех немногих, которые все понимают буквально и будут все равно сбиты с толку, сколько разъяснений ни приводи.
Несколько слов от мастера джедая
Йода. …мощь джедая идет от Силы. Но бойся темной Силы. Гнев, страх, агрессия – темная сторона Силы это. Легко они приходят, дают в битве поддержку. Раз ступишь на темную тропу – навсегда она твою судьбу определит. Поглотит тебя она, как ученика Оби-Вана.
Люк. Вейдера… Темная сторона сильнее?
Йода. Нет, нет, нет. Проще и притягательней.
Люк. Но как отличить хорошую сторону от плохой?
Йода. Ты поймешь… когда ты тих, светел, спокоен. Джедай Силу использует для защиты и знания, никогда для нападения.
Темный путь – это путь игнорирования безопасности. Все легко, код льется рекой. Но как только вы вступили на этот путь, он будет вечно определять вашу судьбу. Игнорировать безопасность и сосредоточиться только на возможностях, которые будут доступны потребителям, – это легкий выбор. Современные языки позволяют выполнить полный статический анализ за счет ограничения некоторых соблазнительных возможностей указателей. За это приходится платить: темная сторона языка C – это более быстрый код, но он будет вечно доминировать над вашими рекомендациями безопасности. И двадцать лет назад, когда безопасность значила меньше, это был выбор, который сделали многие компании, часто бездумно. Это был выбор, который сделал Microsoft в зените славы.
Но Йода был прав: «Поглотит тебя она». Я работал в Microsoft почти десять лет, и я питаю огромное уважение к моим коллегам, которые вколачивали безопасность в MS Office и MS Windows, заменяя отдельные куски их внутренностей. Они достигли гораздо большего, чем, я думал, возможно таким образом достичь. Однако очень отличающиеся внутренности IoS и ChromeOS позволяют этим конкурентам сегодня двигаться быстрее.
Наконец, для вас открыт еще один путь добиться успеха в области безопасности – путь атак. Этот путь очень яркий. Он мощный: «Давайте я вам покажу, как могу получить контроль над вашей системой». И если вы хотите пойти этим путем, моя единственная просьба – делайте это этично, используя свои навыки и знания для выполнения санкционированных атак, чтобы построить более прочную защиту. Мой собственный путь начался с обнаружения уязвимости, но в последнее время я сосредоточился на создании более надежных систем. Этот путь гораздо тяжелее, но его воздействие в долгосрочной перспективе может быть гораздо большим.