Почему каждое приложение для Android работает на разных процессах Dalvik VM?

10

Я читал, что каждое приложение для Android работает на разных процессах Dalvik VM (все разветвленные от zygote).

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

Но я также читал, что это не было сделано из соображений безопасности (например, изоляции) - на самом деле dalvik vm не должен рассматриваться как граница безопасности, говорит Google.

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

AndroidSec
источник

Ответы:

11

В Android каждое приложение работает как отдельный пользователь. В ядре Linux каждый процесс принадлежит одному пользователю, поэтому невозможно запустить несколько приложений Dalvik в одном процессе Linux.

Затраты на запуск нескольких экземпляров Dalvik VM невелики, поскольку fork()системный вызов Linux является копированием при записи, запись на общую страницу COW вызовет «сбой страницы», и эта страница будет скопирована; таким образом, хотя большая часть области памяти виртуальной машины в оперативной памяти является общей, между виртуальными машинами нет «общего состояния».

Форкинг процессов обеспечивает только изоляцию состояний, но не изоляцию привилегий.

dalvik vm не следует считать границей безопасности

Это потому, что виртуальная машина не может обеспечить границы безопасности. Виртуальная машина работает в пользовательском режиме (в том же режиме, что и программа, которую она выполняет), что означает, что ошибка в ВМ может позволить приложению изменять состояние ВМ способом, который не предназначен; ядро, однако, работает в привилегированном режиме и может обеспечивать границы безопасности.

Ли Райан
источник
4

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

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

Другой способ смотреть на него это - было там быть один общий uidдля всех приложений, то вредоносное приложение действительно может привести к хаосу, то заглядывая в своих настройках, отменяют, перехватывают работает код другого приложения и делать всякие плохие вещи ТМ к этому применение.

t0mm13b
источник
3

Dalvik VM не обеспечивает границы безопасности, но ядро является обеспечение границы безопасности с точки зрения процесса VM работает. Вот почему, например, это не большое дело для андроид приложение для запуска машинного кода, который (более или менее) по определению работает вне виртуальной машины. Он все еще находится в процессе, и ядро ​​гарантирует, что процесс не сможет нанести вред другим приложениям, независимо от того, выполняет ли процесс код в виртуальной машине или нет.

danfuzz
источник