Curso MIT "Seguridad de sistemas informáticos". Lección 20: Seguridad del teléfono móvil, Parte 1

Instituto de Tecnología de Massachusetts. Conferencia Curso # 6.858. "Seguridad de los sistemas informáticos". Nikolai Zeldovich, James Mickens. Año 2014


Computer Systems Security es un curso sobre el desarrollo e implementación de sistemas informáticos seguros. Las conferencias cubren modelos de amenazas, ataques que comprometen la seguridad y técnicas de seguridad basadas en trabajos científicos recientes. Los temas incluyen seguridad del sistema operativo (SO), características, gestión del flujo de información, seguridad del idioma, protocolos de red, seguridad de hardware y seguridad de aplicaciones web.

Lección 1: "Introducción: modelos de amenaza" Parte 1 / Parte 2 / Parte 3
Lección 2: "Control de ataques de hackers" Parte 1 / Parte 2 / Parte 3
Lección 3: “Desbordamientos del búfer: exploits y protección” Parte 1 / Parte 2 / Parte 3
Lección 4: “Separación de privilegios” Parte 1 / Parte 2 / Parte 3
Lección 5: “¿De dónde vienen los sistemas de seguridad?” Parte 1 / Parte 2
Lección 6: “Oportunidades” Parte 1 / Parte 2 / Parte 3
Lección 7: “Sandbox de cliente nativo” Parte 1 / Parte 2 / Parte 3
Lección 8: "Modelo de seguridad de red" Parte 1 / Parte 2 / Parte 3
Lección 9: "Seguridad de aplicaciones web" Parte 1 / Parte 2 / Parte 3
Lección 10: “Ejecución simbólica” Parte 1 / Parte 2 / Parte 3
Lección 11: "Ur / Lenguaje de programación web" Parte 1 / Parte 2 / Parte 3
Lección 12: Seguridad de red Parte 1 / Parte 2 / Parte 3
Lección 13: "Protocolos de red" Parte 1 / Parte 2 / Parte 3
Lección 14: "SSL y HTTPS" Parte 1 / Parte 2 / Parte 3
Lección 15: "Software médico" Parte 1 / Parte 2 / Parte 3
Lección 16: "Ataques de canal lateral" Parte 1 / Parte 2 / Parte 3
Lección 17: "Autenticación de usuario" Parte 1 / Parte 2 / Parte 3
Lección 18: "Navegación privada en Internet" Parte 1 / Parte 2 / Parte 3
Lección 19: "Redes anónimas" Parte 1 / Parte 2 / Parte 3
Lección 20: "Seguridad del teléfono móvil" Parte 1 / Parte 2 / Parte 3

Hoy hablaremos sobre la seguridad de Android. Puede considerarlo como un ejemplo interesante de un sistema diseñado principalmente teniendo en cuenta la seguridad. Es posible que, a diferencia de muchos de los sistemas que hemos examinado hasta ahora, como Unix o navegadores web, donde la seguridad estaba en la mayoría de los casos "bloqueada" después de que se creó el sistema y su diseño no se centró en estos problemas, los desarrolladores de Android inicialmente fueron muy preocupado por clases de ataque específicas y construcciones de aplicaciones.



Se les ocurrió una mejor manera de estructurar las aplicaciones de Android que nos permitirán aplicar mejor las políticas de seguridad. Lo mejor es que este es un sistema bastante utilizado, a diferencia de algunos trabajos de investigación que solo pueden ofrecer una nueva arquitectura, este sistema se usa en la práctica, y cada vez hay más dispositivos que usan el sistema operativo Android.

Hoy hablaremos sobre cómo algunas cosas funcionaron o fallaron. Consideraremos qué partes del diseño consideraron importantes y qué se perdieron, y cuál es el resultado en la práctica. Esto es muy interesante En cierto sentido, los desarrolladores utilizaron los sistemas existentes de los que hablamos, por lo que Android se basa en UNIX, de hecho, es solo el kernel de Linux que se ejecuta en el teléfono en su conjunto.

Entonces, de muchas maneras, usan algunos de los mecanismos familiares que recuerdas de Lab 2, donde usaste identificadores de usuario y grupos de Unix y otras cosas para separar las aplicaciones entre sí. Pero en el caso de Android, tienen una forma completamente diferente de establecer ID de usuario y permisos de archivos que en un sistema Linux típico.

Comencemos discutiendo cuál es el nivel de amenaza aquí. ¿Qué molesta a estos chicos en el teléfono? ¿Qué está pasando aquí? ¿De qué están tratando de protegerse? ¿Qué es un modelo de amenaza en un dispositivo móvil?



Estudiante: ¿ aplicaciones que podrían ser dañinas?

Profesor: sí, les preocupa que las aplicaciones que se pueden instalar en el teléfono puedan ser maliciosas. Creo que existen aplicaciones francamente maliciosas diseñadas para obtener control sobre usted o robar sus datos personales. Por lo tanto, debe preocuparse por sus datos y por las cosas que cuestan dinero: mensajes SMS, llamadas telefónicas, conexión a Internet, etc.

Por lo tanto, a la derecha están las cosas que desea proteger en su teléfono, y a la izquierda hay cosas que pueden hacer que funcionen de manera diferente. Como hay aplicaciones maliciosas, los usuarios de Android no quieren que los usuarios puedan instalar aplicaciones escritas por desarrolladores de las que Google nunca ha oído hablar. Además, tales aplicaciones pueden ser dañinas, no porque el desarrollador lo quisiera, sino porque simplemente se olvidó de hacer algo. Y sería bueno ayudar a estos tipos a crear aplicaciones que sean seguras, ya que a menudo el desarrollador de la aplicación no es un experto en el campo de las vulnerabilidades que un atacante puede usar en su aplicación.



Como Android está muy extendido, podemos ver informes de vulnerabilidad. Hay una base de datos CVE que cataloga muchas vulnerabilidades en los sistemas operativos, y esto es realmente interesante. Por supuesto, hay mensajes de error de Android allí, muchos de los cuales se encontraron en conferencias. Los desbordamientos del búfer aún son posibles en algunas partes de Android, hay una mala elección del sistema criptográfico predeterminado, la gente olvida inicializar el generador de números aleatorios y crear claves predecibles. Todo esto sigue sucediendo, porque el software no está a salvo de ninguno de los problemas conocidos.

Lo interesante es que parece que estos problemas están aislados y surgen de vez en cuando. En general, pueden eliminarse, y el sistema permanece bastante seguro después de corregir estos errores. Entonces, en muchos sentidos, el diseño de Android funciona bastante bien. Por lo tanto, más adelante examinaremos con más detalle qué partes del diseño funcionan mejor y cuáles peores. Pero en general, esta es una solución de software bastante bien pensada, o al menos más pensada que las aplicaciones Unix de escritorio que has visto hasta ahora.

Por lo tanto, una de las formas de descubrir cómo proteger los datos y diversos servicios que pueden costarle dinero con aplicaciones maliciosas es entender primero cómo se ve la aplicación para el sistema Android. Luego, hablaremos sobre cómo se configuran y aplican varios permisos o privilegios en esta aplicación. Las aplicaciones de Android son muy diferentes de lo que ha visto hasta ahora en aplicaciones de escritorio o en aplicaciones de Internet.

En lugar de componer la parte indivisible del código con la función principal que comienza a ejecutar, las aplicaciones de Android son más modulares. En el caso de usar Android, puede presentar una aplicación como un conjunto de componentes. El artículo de la conferencia describe 4 tipos de componentes que el marco de Android proporciona al desarrollador. El primer componente es Actividad, o actividad. Esto es una cosa que representa la interfaz de usuario y le permite al usuario interactuar con la aplicación, le muestra información y recibe pulsaciones de teclas de él, y así sucesivamente.

Desde el punto de vista de la seguridad, la actividad tiene una propiedad interesante: la entrada del usuario se reduce a una acción a la vez. El marco de Android realmente garantiza que solo es posible un tipo de actividad a la vez, es decir, si ejecuta una aplicación bancaria, ninguna aplicación funcionará en segundo plano para interceptar el código PIN de la aplicación bancaria a través de clics táctiles. Por lo tanto, el marco proporciona el uso de algunas características de seguridad con respecto a la entrada del usuario. Por lo tanto, la actividad es un componente de la interfaz de usuario.

Otros tres tipos de componentes ayudan a la lógica de la aplicación a interactuar con otros componentes. Entonces, el segundo componente se llama Servicio o servicio. Estas cosas funcionan en segundo plano. Por ejemplo, puede tener un servicio que rastrea su ubicación, como en la aplicación que estos tipos describen en el artículo. Es posible que tenga servicios que recuperen información de la red en segundo plano, etc.
El tercer componente es el componente del proveedor de contenido, proveedor de contenido. Se puede representar como una base de datos SQL en la que puede definir varias tablas con un esquema, etc. Puede acceder a consultas SQL con todos los datos almacenados en esta aplicación. Este componente le permite controlar el acceso a la base de datos, indicando quién puede acceder a ella.
En "Android" hay algo más inusual que no está en otros sistemas. Este es el cuarto componente: receptor de transmisión o receptor de transmisión. Se utiliza para recibir mensajes de otras partes del sistema. Por lo tanto, hablaremos sobre cómo las aplicaciones interactúan entre sí en términos de mensajes.



Por lo tanto, esta es una idea muy lógica de lo que son las aplicaciones de Android. Pero en realidad, todas estas son solo clases de Java o código Java escrito por un desarrollador.

Solo implementa una determinada interfaz estándar para la actividad, los servicios, el receptor de difusión y el proveedor de contenido, y está claro que esto es solo código Java. Y todos los componentes colocados en el rectángulo son solo un tiempo de ejecución de Java que se ejecuta en su teléfono, es solo un proceso de kernel de Linux que se ejecuta en su teléfono. Y todos estos componentes son diferentes clases o fragmentos de código que se ejecutan en el proceso de tiempo de ejecución de Java. Así es como se puede reducir a procesos tradicionales, más comprensibles para usted.

Otra cosa que interactúa con la aplicación se llama manifiesto. El desarrollador de la aplicación escribe o compila el código para todos los componentes, pero además de esto, también hay un manifiesto en el sistema que está fuera de los componentes de la aplicación. Es un archivo de texto o XML que describe todos estos componentes y cómo otras partes del sistema deberían interactuar con los componentes de esta aplicación.



En particular, este manifiesto habla de las llamadas etiquetas de Lables, de las que hablaremos en un segundo, que determinan los privilegios de esta aplicación en términos de lo que está permitido hacer, y también determinan las restricciones sobre quién más puede interactuar con varios componentes de este aplicaciones. ¿Quieres preguntar cómo funciona?

Estudiante: ¿la etiqueta es algo que define "esta aplicación no puede hacer una llamada telefónica" o "esta aplicación puede enviar un mensaje"?

Profesor: sí, estas marcas establecen si esta aplicación puede hacer una llamada, enviar SMS o usar Internet. Hay dos tipos de etiquetas, las dibujaré aquí. Cada aplicación tiene una lista de etiquetas que describen los privilegios que tiene la aplicación. Esto es algo así como permisos para marcar un número de teléfono, habilitar la conexión a Internet, etc. Más tarde te contaré cómo funcionan.

Por lo tanto, estos son los privilegios que tiene la aplicación. Además, también puede adjuntar etiquetas a componentes individuales, y allí adquieren un significado diferente: estos son privilegios para una aplicación en particular. Si tiene un componente con una etiqueta, para interactuar con él, cualquier otro componente también debe tener una etiqueta correspondiente.
Por ejemplo, puede tener una etiqueta con el privilegio Ver amigos que puede usar para ver la ubicación de sus amigos. Este es un privilegio que puede tener una aplicación. Pero para garantizar este privilegio, debe adjuntar esta etiqueta a un componente específico, en este caso, al componente Proveedor de contenido, a su base de datos, donde hay información sobre la ubicación de sus amigos. Y ahora, cualquiera que quiera acceder a esta base de datos debe tener la misma etiqueta en sus privilegios.



Así es como se configuran los permisos. Puede considerarlo como ID de usuario o ID de grupo en Unix, con la excepción de cadenas arbitrarias que los hacen un poco más flexibles. Es decir, nunca se quedará sin estas identificaciones y no se preocupará de que alguien las extrañe.

Resulta que los desarrolladores de Android no fueron particularmente cuidadosos al determinar el alcance de estas etiquetas. Puede tener dos aplicaciones que elijan etiquetar lo mismo. Por lo tanto, estas etiquetas están parcialmente definidas por la aplicación. Supongamos que tiene dos aplicaciones en su teléfono: Facebook y Google+, y ambas declaran que desean una nueva línea de permiso para la función "Ver amigos" en la red social. Usted dice: "no hay problema, esta es la misma línea".

Por supuesto, en realidad esta línea con la lista de Etiquetas es mucho más larga de lo que dibujé. Hay un dominio de estilo de aplicación Java que define el nombre en minúscula de la etiqueta. Por ejemplo, el permiso de llamada DIALPERM que pinté se parece a com.google.android.dialperm. Pero en términos generales, estas son las líneas que aparecen en los permisos. Por lo tanto, si tiene aplicaciones bien intencionadas, no entrarán en conflicto con estas líneas de permiso.

Pero resulta que, desafortunadamente, en el sistema operativo Android nada obliga a la aplicación a tal comportamiento, y esto crea problemas potenciales. No sé por qué no fueron reparados. Veremos qué sucede si tenemos dos aplicaciones que entran en conflicto con los nombres de las etiquetas.

Entonces, así es como se ve la aplicación: es un conjunto de programas Java que forman componentes, un manifiesto que describe los permisos para las aplicaciones y las restricciones necesarias para todos los componentes. La interacción entre las aplicaciones se lleva a cabo utilizando lo que inventaron los desarrolladores de Android y se llama Intent - Intention. La intención es un mensaje estructurado, y en un segundo veremos cómo se usa. Por ahora, diré que Intent tiene tres cosas clave. Por supuesto, la intención contiene otros campos, pero lo más importante es el nombre del componente Componente al que desea enviar un mensaje. Esto es seguido por la acción Acción que el componente necesita realizar y los datos de datos junto con el tipo MIME que desea enviar al otro componente.



Como ejemplo abstracto, puede imaginar que este componente es com.android.dialer / Dial: así es como se indica el nombre del componente en Android, este es un tipo de nombre de dominio Java. Entonces, com.android.dialer es el nombre de la aplicación en su conjunto, a la que desea enviar la intención, y a través de una barra diagonal, escribe el nombre del componente de la aplicación de destino a la que envía este mensaje - / Marcar. De esta forma, nombra el componente específico al que se dirige el mensaje. La acción representa un conjunto específico de acciones que pueden parecerse a android.intend.Dial.

Esta es una cadena predefinida que las aplicaciones colocan en el campo de acción Acción si desean que el marcador telefónico llame a un número específico. Por ejemplo, si desea ver algún tipo de documento en el teléfono, en el campo Acción inserte una línea de acción como android.intend.ViewDoc. Esto le dice al componente receptor que solo desea ver el contacto llamado antes de marcar su número de teléfono.
Finalmente, los datos de datos son básicamente una URL arbitraria o la URL de los datos que desea enviar con este mensaje. Puede ser algo como un número de teléfono o una URL HTTP que desea ver o abrir, o cualquier otra aplicación que se indique mediante una URL en el sistema.



Así es como se envían mensajes que se envían a través del sistema utilizando el propio tiempo de ejecución de Android, que se encuentra debajo de todas estas aplicaciones. Por lo tanto, el tiempo de ejecución de Android se puede percibir como un cruce entre las aplicaciones y el núcleo. Esto no es del todo correcto, pero intentaremos dibujar algún tipo de imagen para aclarar cómo se ve la arquitectura de esta cosa.

Digamos que tenemos una aplicación que se ejecuta en Android y otra aplicación. Estos rectángulos son App1 y App 2, y cada uno representa lo que se muestra en la imagen superior: componentes, manifiesto, etiquetas.



Todos estos son procesos que se ejecutan sobre el núcleo de Linux, lo que proporciona cierto grado de aislamiento entre aplicaciones. También hay lo que el artículo de la conferencia llama el Monitor de referencia. Mediará todas las interacciones intencionales entre diferentes aplicaciones. Por lo tanto, si el Apéndice 1 desea enviar un mensaje al Apéndice 2, primero envía un mensaje al monitor de enlace.
Por lo tanto, la forma en que envía todas las intenciones de Intención a Android es que crea uno de estos mensajes de intención y lo dirige a través de algún canal a este Monitor de referencia.



El sistema Android tiene su propia implementación de canales para enviar tales intenciones, que se llama Binder o Bundle. Cada aplicación de Android, por acuerdo, abrirá Binder, conectándose a un monitor de enlace para que pueda recibir intenciones de esta aplicación, así como enviar mensajes a esta aplicación.

, 1 Intent 2 , , , 2. 2 - , SQL 1.



: – Reference Monitor?

: , — , . , , , RM, ? ? , 1. ?

: , - , , .

: , . , , , . , , . . , 2?

: , PKI. .

: , , . , , , , RM , App 1. PKI . . , , , . , , . , ?

: , , .

: . , «» , . , , , . , Labels. ?

: , , . , , , , « ».

: , , . , RM , . , - . .

, 2 , . – , . , , , . .

, . , . — , , . , , , . , , - .

Android , , , , . , , , «» . , Google Voice, VoIP, Skype , . : « , - ». , , — , PDF JPEG .



. , PDF , , . RM .

: « , , , , ». , , .

: ?

: . , , . , , . , , .

Android RPC. , , Bind intent, , : « ». , , .



, - , , Bind intent.

: , ?

: , 2. , , 2. , - .

, 2 bind, - , . , , .



, , , , Service, . , , .
: , , . , .

: , , , . . , bind. RPC , .

, . , , RM . , RPC , , , , , RPC .

, , RPC, RPC, RPC .

27:40

Curso MIT "Seguridad de sistemas informáticos". 20: « », 2


.

, . ? ? , 30% entry-level , : VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1Gbps $20 ? ( RAID1 RAID10, 24 40GB DDR4).

VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1Gbps , .

Dell R730xd 2 ? 2 Intel Dodeca-Core Xeon E5-2650v4 128GB DDR4 6x480GB SSD 1Gbps 100 $249 ! . c Dell R730xd 5-2650 v4 9000 ?

Source: https://habr.com/ru/post/es432616/


All Articles