Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Кросс-доменные ограничения

Оригинал:The Same-Origin Policy
Авторы: Eunsuk Kang, Santiago Perez De Rosso, and Daniel Jackson,
Дата публикации: July 12, 2016
Перевод: Н.Ромоданов
Дата перевода: январь 2017 г.

Это третья часть статьи "Кросс-доменные ограничения".
Перейти к
началу статьи.

Приложения - примеры

Как мы уже видели ранее анализатор языка Alloy при выполнении команд run или check генерирует сценарий (если он существует), который согласуется с описанием системы в модели. По умолчанию анализатор произвольным образом выбирает любой один из возможных сценариев работы с системой (до указанного ограничения) и в сценарии присваивает числовые идентификаторы экземплярам сигнатур (Server0, Browser1 и т.д.).

Иногда вместо того, чтобы исследовать сценарии со случайной конфигурацией серверов и клиентов, мы можем захотеть проанализировать поведение конкретного веб-приложения. Например, представьте, что мы хотим создать приложение электронной почты, который работает внутри браузера (например, Gmail). В дополнение к основным функциям электронной почты, наше приложение может отображать баннер рекламной службы третьей стороны, которая контролируется потенциально опасным актором.

В языке Alloy с помощью ключевых слов one sig вводится сигнатура-синглетон singleton, которая содержит в себе ровно один объект; мы видели выше такой пример для Dns. Этот синтаксис можно использовать для указания на конкретные атомы. Например, чтобы сказать, что есть одна страница InboxPage (Входящие) и один рекламный баннер (AdBanner), каждый из которых представляет собой документ, мы можем написать следующее:

one sig InboxPage, AdBanner extends Document {}

Благодаря этой декларации, каждый сценарий, который генерируется с помощью языка Alloy, будет содержать, по меньшей мере, эти два объекта документа.

Кроме того, мы можем указать отдельные серверы, домены и так далее, с ограничением (которые мы назвали конфигурацией Configuration), определяющим отношения между ними:

one sig EmailServer, EvilServer extends Server {}
one sig EvilScript extends Script {}
one sig EmailDomain, EvilDomain extends Domain {}
fact Configuration {
  EvilScript.context = AdBanner
  InboxPage.domain.first = EmailDomain
  AdBanner.domain.first = EvilDomain  
  Dns.map = EmailDomain -> EmailServer + EvilDomain -> EvilServer
}

Например, последнее ограничение в fact, указывает, каким образом будет сконфигурирован DNS с тем, чтобы отображать имена доменов для двух серверов в нашей системе. Без этого ограничения, анализатор языка Alloy может генерировать сценарии, в которых домен EmailDomain отображается на сервер EvilServer, что тдля нас не интересно. На практике, такое отображение может оказаться возможным из-за атаки, которая называется DNS-спуфинг, но мы исключаем его из нашей модели, так как оно лежит за пределами класса атак, для предотвращения которых предназначены кросс-доменные ограничения.

Давайте введем два дополнительных приложения: онлайновый календарь и сайт-блог:

one sig CalendarServer, BlogServer extends Document {} 
one sig CalendarDomain, BlogDomain extends Domain {}

Мы должны обновить ограничение, относящееся к отображению DNS и приведенное выше, для того, чтобы добавить доменные имена для этих двух серверов:

fact Configuration {
  ...
  Dns.map = EmailDomain -> EmailServer + EvilDomain -> EvilServer + 
            CalendarDomain -> CalendarServer + BlogDomain -> BlogServer  
}

Кроме того, давайте предположим, что приложения электронной почты, блога и календаря разработаны все одной и той же организацией, и, таким образом, доменные имена имеют одинаковую базу. Концептуально, мы можем считать, что EmailServer и CalendarServer имеют поддомены email и calendar, а в качестве общего супердомена используют example.com. В нашей модели это можно добавить, если добавить доменное имя, которое является подсуммой subsumes других доменов:

one sig ExampleDomain extends Domain {}{
  subsumes = EmailDomain + EvilDomain + CalendarDomain + this
} 

Обратите внимание, что в подсумму subsumes в качестве члена входит this, поскольку каждое доменное имя в качестве подсуммы содержит самого себя.

Есть и другие частности, касающиеся этих приложений, которые мы здесь опускаем (полную модель смотрите в example.als). И мы будем возвращаться к этим приложениях, т. к. на протяжении оставшейся части данной главы эти приложения будут использоваться в качестве нашего рабочего примера.

Перейти к следующей части статьи.

Перейти к началу статьи.