какие приложения и какой связью могут быть связаны между собой

Взаимосвязь между прикладными и управляющими программами

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

Прикладные программы, фактически выполняющие обработку данных в СРВ, не имеют прямого контакта с внешним миром. Они получают данные от управляющих программ, обрабатывают данные и возвращают их управляющим программам. Тем не менее, они могут составлять наибольшую часть всех программ.

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

какие приложения и какой связью могут быть связаны между собой

Рис. 2.3. Взаимосвязь между прикладными и управляющими программами

Правила взаимосвязи программ

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

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

2. Сохранение логической мощности. Когда какая-либо программа выполняется процессором, должна сохраняться эффективная логическая мощность, доступная этой программе. На практике же всегда происходит некоторое уменьшение доступности средств, например, для программы может оказаться невозможным использовать все индексные регистры.

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

4. Автоматическое управление работой. Команды оператору должны исходить от управляющей системы. О неисправностях оборудования и возможных ошибках в программах или ошибках оператора она должна сообщать стандартным образом.

5. Гибкое распределение емкости ЗУ и времени. Распределение емкости ОП и памяти на дисках, приписывание программам блоков ввода-вывода и управление разделением времени должны основываться на потребностях выполняемых программ.

Источник

Связь между приложениями

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

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

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

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

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

Источник

Безопасная передача данных между двумя приложениями

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

Задача

У нас есть 2 приложения, которые обращаются к одному API. Клиенты могут обращаться в API по токену доступа (sessionId). Необходимо реализовать бесшовный переход из одного приложения в другое. Для этого между ними нужно что-то пошарить, для примера пусть это будет sessionId.

Вариант #1: QUERY DEEPLINK

Самый очевидный вариант — передавать токен в Query DeepLink. Выглядеть это будет примерно так:
slave://main?sessionId=686A885A4FB644053C584B9BE2A70C7D
В этом случае реципиент сможет извлечь sessionId и пользоваться им, не запрашивая у пользователя авторизацию. Со стороны разработчика выглядит, что задача выполнена, но давайте копнем немного глубже.

DeepLink Hijacking

Поскольку любое приложение может зарегистрировать схему tinkoff://, OS может открыть не то приложение. Это возможно из-за того, что нет никакой регистрации и ограничений на использование схем. Вредоносное приложение может зарегистрировать схему tinkoff:// и перехватить запрос к приложению Tinkoff и запустить себя. В этом случае sessionId попадет к злоумышленникам, и ваш аккаунт будет скомпрометирован. Кроме того, DeepLink Hijacking позволяет проводить фишинг, например, отображая поля для ввода логина и пароля.

Концептуально процесс выглядит так:

какие приложения и какой связью могут быть связаны между собой

Есть 2 решения этой проблемы. Первое — AppLinks-технология больше не позволяет разработчикам настраивать схему, вместо этого используются http/https. В этом случае OS берет ссылку slave.com/profile и связывается с хостом slave.com для проверки. Второе — Intent URL — вместо вызова slave:// вызывается intent://, куда передается уникальный идентификатор приложения, которое нужно запустить. Выглядит это так:

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

Session Fixation

Это атака, при которой злоумышленник вынуждает клиента установить сеанс с целевым ПО, используя sessionId, предоставленный злоумышленником. Как только пользователь аутентифицируется, злоумышленник сможет использовать этот, уже привилегированный, идентификатор в своих целях. Атака использует тот факт, что целевое ПО использует тот же sessionId после повышения привилегий.

какие приложения и какой связью могут быть связаны между собой
Как это выглядит в нашем случае:

3rd Party Leakage

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

Вариант #2: CONTENT PROVIDER

Как будем делать? Определим у master Content-Provider и заставим slave сходить в этот Content-Provider за токеном.

какие приложения и какой связью могут быть связаны между собой

Таким образом, мы избавляемся от риска передачи не тому приложению токена в случае DeepLink Hijacking и делаем невозможным атаку Session Fixation. Но у нас появляются другие проблемы — в текущем варианте вообще любое приложение может запросить токен в любой момент времени, даже если мы не инициировали его запуск.

Protection Level

В большинстве случаев вам нужно проверить, что slave подписано тем же ключом, что и master, то есть принадлежат одному автору. Для этого случая в менеджере пакетов есть метод checkSignatures, который проверяет подписи приложений. Чтобы воспользоваться этой функцией необходимо добавить permission с protectionLevel=«signature» у Content-Provider в манифесте приложения:

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

Permission Race Condition

Есть одна очень неприятная особенность в том, что имена у permission не уникальные, чем может воспользоваться вредоносное приложение и зарегать permission с нашим именем и protectionLevel=«normal» до нас. В этом случае, при установке нашего приложения, в OS уже будет существовать permission и он не перезапишется. Следовательно, наш content-provider останется без защиты и с разрешенным доступом от любого приложения.

Different Signatures

К сожалению, далеко не всегда приложения подписаны одним ключом, например, какое-то из приложений куплено, или «так исторически сложилось», но бесшовный переход все равно нужен. В этом случае мы берем проверку подписи на себя.
Как это можно реализовать:
У Content-Provider есть метод getCallingPackage(), по которому мы можем получить packageId обратившегося за данными приложения, а по packageId можем получить список подписей и проверить их с встроенными.

какие приложения и какой связью могут быть связаны между собой

Кажется, что мы сделали все идеально, но нет.

Fake id vulnerability

Проблема заключается в том, что когда Android создает chain-of-trust, процесс проверки сравнивает только subject, а не проверяет подпись в поле certificate’s signer. В результате злоумышленник может построить chain-of-trust без фактической подписи.

Из-за этой ошибки генерируется неправильная цепочка сертификатов, которая может включать в себя легитимные сертификаты, встроенные в APK, но фактически не использовавшиеся для подписи приложения. В конце оставлю ссылку на коммит, который исправляет данную уязвимость. Проблема исправлена в версии android 4.4, так что нам остается повысить API Level до 19.

Выводы

Сегодня мы разобрали, как должен проходить анализ фич при разработке.
Также разобрали варианты передачи секрета между двумя приложениями, в процессе которого разбирали проблемы каждого варианта и придумывали способы их избежать.

Источник

Взаимодействие программных систем

какие приложения и какой связью могут быть связаны между собой

В этой статье я поговорю об связях между программами. Связи между программами или, выражаясь иначе, взаимодействие программ друг с другом в подавляющем большинстве случаев заключается в получении данных одной программой от другой. Например, программа электронных торгов может запрашивать у какой-то другой программы курс валют. Или текстовому редактору может передавать введенный пользователем текст операционная система, используя драйвер клавиатуры. Программы могут предоставлять набор функций для взаимодействия – API. Или даже иметь целые механизмы взаимодействия, называемые протоколами, когда используется множество последовательных вызовов функций, например, для сложного согласования каких-либо параметров. Большим шагом вперед является создание универсальных структур – XML и Json. Программы могут взаимодействовать с другими программами и «невежливым» способом — без протоколов и открытых API: парся данные страницы в случае грабберов, внедряясь в исполняемые файлы как вирусы или, наоборот, убивая их в случае антивирусов.

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

Кроме этого, по характеру взаимодействующих программ взаимодействие может быть двух видов: взаимодействуют разные части или одинаковые. Наблюдения показывают, что в первом случае, их количество может быть относительно небольшим – например, с десяток органов в организме или несколько составляющих компьютера, а если слагаемые одинаковые, то обычно их очень много: клеток в органе, транзисторов в процессоре, людей в цивилизации, программы тоже состоят из миллионов машинных команд нескольких десятков видов. При этом каждая машинная команда, клетка, каждый транзистор или каждый нейрон в нейронной сети выполняет очень простую функцию. Можно предположить, что в основе любой вещи, любой системы в самом основании лежат именно такие простые базовые составляющие.

Отличие от живой природы в том, что системы на разных уровнях достаточно независимы и могут продолжать работать при смене нижележащего слоя на другой: так, веб-сайт будет продолжать открываться если Вы смените витую пару Ethernet на Wifi.

В общем случае, взаимодействие программных систем может быть нескольких видов:

Часто программы позволяют расширять свою функциональность: текстовые редакторы и электронные таблицы позволяют создавать макросы, браузеры – добавлять расширения, все CMS – дополнять их сторонними компонентами и плагинами. Некоторые программы идут дальше по этому пути и по сути являются платформами для запуска других приложений: например, браузеры или ibm lotus notes.

Сама операционная система – это программа, единственное назначение которой — существование других программ. Она упрощает их существование, изолирует от железа, предоставляет возможность использования графического интерфейса и даёт доступ к сети, её цель – обеспечить работу другим программам.

При этом и операционные системы, и платформы, и даже CMS, которые ставят из-за единственного компонента, во многих случаях гораздо сложнее той программы, ради которой их используют, они могут включать множество самых различных обеспечивающих работу функций: разделять ресурсы, предоставлять механизм авторизации, упрощать обращение к базе данных. Это происходит и за счёт своей универсальности (например, операционная система Windows содержит несколько подсистем Win32, OS/2) для обеспечения работы для всех возможных программ.

Универсальность всегда приводит к дополнительной сложности. Это касается и тех компонент, которые программисты используют при написании программы, они гораздо сложнее и обладают гораздо большим набором функций, многие из которых не требуются и не используются. Программы часто вынуждены обеспечивать обратную совместимость – так, в Windows можно было запускать DOS-приложения. При взаимодействии систем, возможно возникновение нескольких интересных эффектов.

Первый из них называется синергия и его идея в том, что слагаемое больше, чем просто сумма слагаемых. То есть если Вы к одной технологии добавите какую-то другую, то при синергии получившаяся технология будет превосходить как первую, так и вторую. И это может быть качественно другой продукт. То есть, если Вы к компьютеру с программой добавите железный скелет, то получите робота, который больше и чем железка, и чем компьютер. Взаимодействие большого количества простых вещей может приводить к каким-то сложным взаимодействиям. Сумма простых вещей даёт сложную – набор транзисторов создаёт компьютер, набор атомов создаёт предмет, клетки в организме создают органы. Сумма людей – цивилизация – это не просто семь млрд. человек, это что-то большее.

Вторую мысль озвучил Питер Норвиг в докладе Everything is Miscellaneous. Она показалась мне удивительной: если Вы посмотрите на отдельно взятого шимпанзе и отдельно взятого человека, то увидите, что между ними много общего. Ну, то есть понятно, что шимпанзе немного сильнее, человек немного умнее, но в целом, их внешний вид немного похож, их физические и даже пусть с большой натяжкой интеллектуальные возможности сопоставимы. Но теперь если Вы взглянете на культуру шимпанзе и культуру человечества, то увидите колоссальную разницу. Цивилизацию людей даже нельзя сопоставить с цивилизацией шимпанзе. Почему-то это напомнило мне о том, что 0.99 и 1.01 вроде бы не сильно отличаются, но при возведении в какую-нибудь большую степень одно число будет стремиться к нулю, а другое – к бесконечности.

Для тех, кто просто пролистал до конца: взаимодействие программ может быть различных типов и его результат может приводить к принципиально новому уровню программной системы. Целое не всегда отражает то, что происходит в составных частях. Спасибо за внимание!

Источник

Какую связь между приложениями я должен выбрать?

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

Есть ли какой-нибудь готовый к использованию механизм для Android?

Я посмотрел намеренные трансляции, но кажется, что я собираю данные как возможные. У меня нет встроенной функции фильтрации. Мне всегда придется отправлять все данные в один раз, а затем распаковывать и извлекать малая часть, от которой меня интересует (?)

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

Может быть, сложный вопрос для ответа, но я даю ему шанс; Какой механизм я должен использовать, или мне самому написать его?

Есть ли какой-нибудь готовый к использованию механизм для Android?

Я посмотрел намеренные трансляции, но кажется, что я собираю данные как возможные. У меня нет встроенной функции фильтрации. Мне всегда придется отправлять все данные в один раз, а затем распаковывать и извлекать малая часть, от которой меня интересует (?)

Однако для более произвольных видов подписки (например, «отправьте мне все сообщения, которые имеют определенные значения в определенных JSON-закодированных объектах» ) вам придется реализовать фильтрацию самостоятельно.

Может ли ContentProvider нажимать сообщения на зарегистрированного получателя, используя запрос в качестве фильтра?

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *