El flujo de información en un contexto teórico de la información es la transferencia de información de una variable a una variable en un proceso dado . Puede que no todos los flujos sean deseables; por ejemplo, un sistema no debe filtrar ningún secreto (parcialmente o no) a los observadores públicos. [ ¿por qué? ]
Introducción
Asegurar los datos manipulados por los sistemas informáticos ha sido un desafío en los últimos años. Actualmente existen varios métodos para limitar la divulgación de información, como listas de control de acceso , firewalls y criptografía . Sin embargo, aunque estos métodos imponen límites a la información que es liberada por un sistema, no brindan garantías sobre la propagación de la información . [1] Por ejemplo, las listas de control de acceso de los sistemas de archivos evitan el acceso no autorizado a los archivos, pero no controlan cómo se utilizan los datos posteriormente. De manera similar, la criptografía proporciona un medio para intercambiar información de forma privada a través de un canal no seguro, pero no se ofrecen garantías sobre la confidencialidad de los datos una vez que se descifran.
En el análisis de flujo de información de bajo nivel, a cada variable se le suele asignar un nivel de seguridad. El modelo básico comprende dos niveles distintos: bajo y alto, es decir, respectivamente, información públicamente observable e información secreta. Para garantizar la confidencialidad, no se debe permitir que la información fluya de las variables superiores a las inferiores. Por otro lado, para garantizar la integridad, se deben restringir los flujos a las variables altas. [1]
De manera más general, los niveles de seguridad pueden verse como una red con información que fluye solo hacia arriba en la red. [2]
Por ejemplo, considerando dos niveles de seguridad y (bajo y alto), si , fluye de a , de a , y a se permitiría, mientras fluye desde a no lo haría. [3]
A lo largo de este artículo, se utiliza la siguiente notación:
- variable (bajo) denotará una variable observable públicamente
- variable (alto) denotará una variable secreta
Dónde y son los únicos dos niveles de seguridad en la celosía que se están considerando.
Flujos explícitos y canales laterales
Los flujos de información se pueden dividir en dos categorías principales. El más simple es el flujo explícito, donde algún secreto se filtra explícitamente a una variable observable públicamente. En el siguiente ejemplo, el secreto de la variable h fluye hacia la variable l observable públicamente .
var l, hl: = h
Los otros flujos entran en la categoría de canal lateral . Por ejemplo, en el ataque de sincronización o en el ataque de análisis de potencia , el sistema filtra información a través, respectivamente, del tiempo o la potencia que se necesita para realizar una acción en función de un valor secreto.
En el siguiente ejemplo, el atacante puede deducir si el valor de h es uno o no para el tiempo que tarda el programa en finalizar:
var l, h si h = 1 entonces (* hacer un trabajo que requiera mucho tiempo *)l: = 0
Otro flujo de canal lateral es el flujo de información implícito, que consiste en la fuga de información a través del flujo de control del programa. El siguiente programa (implícitamente) revela el valor de la variable secreta h a la variable l . En este caso, dado que la variable h es booleana, se revelan todos los bits de la variable de h (al final del programa, l será 3 si h es verdadera y 42 en caso contrario).
var l, h si h = verdadero entonces l: = 3demás l: = 42
No interferencia
La no interferencia es una política que exige que un atacante no pueda distinguir dos cálculos de sus salidas si solo varían en sus entradas secretas. Sin embargo, esta política es demasiado estricta para ser utilizada en programas realistas. [4] El ejemplo clásico es un programa de verificación de contraseñas que, para ser útil, necesita revelar alguna información secreta: si la contraseña ingresada es correcta o no (tenga en cuenta que la información que un atacante aprende en caso de que el programa rechace la contraseña es que la contraseña intentada no es la válida).
Control de flujo de información
Un mecanismo para el control del flujo de información es aquel que hace cumplir las políticas de flujo de información. Se han propuesto varios métodos para hacer cumplir las políticas de flujo de información. Se han empleado mecanismos en tiempo de ejecución que etiquetan datos con etiquetas de flujo de información a nivel del sistema operativo y del lenguaje de programación. También se han desarrollado análisis de programas estáticos que garantizan que los flujos de información dentro de los programas estén de acuerdo con las políticas.
Se han desarrollado análisis tanto estáticos como dinámicos para los lenguajes de programación actuales. Sin embargo, las técnicas de análisis dinámico no pueden observar todas las rutas de ejecución y, por lo tanto, no pueden ser a la vez sólidas y precisas. Para garantizar la no interferencia, terminan las ejecuciones que podrían liberar información confidencial [5] o ignoran las actualizaciones que podrían filtrar información. [6]
Una forma destacada de hacer cumplir las políticas de flujo de información en un programa es mediante un sistema de tipo de seguridad: es decir, un sistema de tipo que refuerza las propiedades de seguridad. En tal sistema de tipo sólido, si un programa verifica el tipo, cumple con la política de flujo y, por lo tanto, no contiene flujos de información inapropiados.
Sistema de tipo de seguridad
En un lenguaje de programación aumentado con un sistema de tipos de seguridad , cada expresión lleva un tipo (como booleano o entero) y una etiqueta de seguridad.
A continuación se muestra un sistema de tipo de seguridad simple de [1] que refuerza la no interferencia. La notación significa que la expresión tiene tipo . Similar, significa que el comando se puede escribir en el contexto de seguridad .
Los comandos bien escritos incluyen, por ejemplo,
- .
Por el contrario, el programa
está mal escrito, ya que revelará el valor de la variable dentro .
Tenga en cuenta que la regla es una regla de subsunción, lo que significa que cualquier comando que sea de tipo de seguridad puede también ser . Por ejemplo, Pueden ser ambos y . A esto se le llama polimorfismo en la teoría de tipos . Del mismo modo, el tipo de expresión que satisface Pueden ser ambos y de acuerdo a y respectivamente.
Desclasificación
Como se mostró anteriormente, la política de no interferencia es demasiado estricta para su uso en la mayoría de las aplicaciones del mundo real. [7] Por lo tanto, se han ideado varios enfoques para permitir la liberación controlada de información. Estos enfoques se denominan desclasificación de información.
La desclasificación sólida requiere que un atacante activo no pueda manipular el sistema para aprender más secretos de los que los atacantes pasivos ya conocen. [4]
Los constructos de desclasificación de información se pueden clasificar en cuatro dimensiones ortogonales: qué información se divulga, quién está autorizado a acceder a la información, dónde se divulga la información y cuándo se divulga la información. [4]
Qué
A lo controles de políticas de desclasificación que la información (parcial o no) pueden ser liberados a una variable observable públicamente.
El siguiente ejemplo de código muestra una construcción de desclasificación de. [8] En este código, el programador permite explícitamente que el valor de la variable h fluya hacia la variable l observable públicamente .
var l, h si l = 1 entonces l: = desclasificar (h)
OMS
Una política de desclasificación de quién controla qué directores (es decir, quién) pueden acceder a una determinada información. Este tipo de política se ha implementado en el compilador Jif. [9]
El siguiente ejemplo le permite a Bob compartir su secreto contenido en la variable b con Alice a través de la variable comúnmente accesible ab .
var ab (* {Alice, Bob} *) var b (* {Bob} *) si ab = 1 entonces ab: = desclasificar (b, {Alice, Bob}) (* {Alice, Bob} *)
Dónde
A donde la política de desclasificación regula donde la información puede ser liberado, por ejemplo, mediante el control en el que líneas de la información del código de fuente pueden ser liberados.
El siguiente ejemplo hace uso de la construcción de flujo propuesta en. [10] Esta construcción toma una política de flujo (en este caso, las variables en H pueden fluir a variables en L) y un comando, que se ejecuta bajo la política de flujo dada. .
var l, h flujo HL en l: = h
Cuándo
A cuando la política de desclasificación regula cuándo se puede divulgar la información. Las políticas de este tipo se pueden utilizar para verificar programas que implementan, por ejemplo, la divulgación controlada de información secreta después del pago, o secretos encriptados que no deben divulgarse en un tiempo determinado dada la potencia computacional polinomial.
Enfoques de desclasificación para flujos implícitos
Un flujo implícito ocurre cuando el código cuya ejecución condicional se basa en información privada actualiza una variable pública. Esto es especialmente problemático cuando se consideran múltiples ejecuciones, ya que un atacante podría aprovechar la variable pública para inferir información privada al observar cómo cambia su valor con el tiempo o con la entrada.
El enfoque ingenuo
El enfoque ingenuo consiste en hacer cumplir la propiedad de la confidencialidad sobre todas las variables cuyo valor se ve afectado por otras variables. Este método conduce a información parcialmente filtrada debido a que en algunas instancias de la aplicación una variable es Baja y en otras Alta.
Sin actualización sensible
Ninguna actualización sensible detiene el programa siempre que una variable Alta afecta el valor de una variable Baja y previene eficazmente la fuga de información. Dado que simplemente busca expresiones en las que podría ocurrir una fuga de información sin mirar el contexto, puede detener un programa que, a pesar de tener una posible fuga de información, en realidad nunca filtra información.
En el siguiente ejemplo, x es alto e y es bajo.
var x, yy: = falsosi h = verdadero entonces y: = verdaderovolver verdadero
En este caso, el programa se detendría ya que usa el valor de una variable Alta para cambiar una variable Baja a pesar de que el programa nunca filtra información.
Actualización permisiva
La actualización permisiva introduce una clase de seguridad adicional P que identificará las variables de fuga de información. Cuando una variable Alta afecta el valor de una variable Baja, esta última se etiqueta P. Si una variable etiquetada P afecta a una variable Baja, el programa se detendrá. Para evitar la interrupción, las variables Low y P deben convertirse en High utilizando una función de privatización para garantizar que no se produzcan fugas de información. En instancias posteriores, el programa se ejecutará sin interrupción.
Inferencia de privatización
La inferencia de privatización extiende la actualización permisiva para aplicar automáticamente la función de privatización a cualquier variable que pueda filtrar información. Este método debe usarse durante las pruebas, donde convertirá la mayoría de las variables. Una vez que el programa pasa a la producción, la actualización permisiva debe usarse para detener el programa en caso de una fuga de información y las funciones de privatización pueden actualizarse para evitar filtraciones posteriores.
Aplicación en sistemas informáticos
Más allá de las aplicaciones al lenguaje de programación, las teorías de control del flujo de información se han aplicado a SO, [11] Sistemas distribuidos [12] y Cloud Computing. [13] [14]
Referencias
- ^ a b c Andrei Sabelfeld y Andrew C. Myers. Seguridad del flujo de información basada en el idioma. Revista IEEE sobre áreas seleccionadas en comunicaciones, 21 (1), enero de 2003.
- ^ Dorothy Denning. Un modelo de celosía de flujo de información seguro. Comunicaciones de la ACM, 19 (5): 236-242, 1976.
- ^ Smith, Geoffrey (2007). "Principios del análisis seguro del flujo de información". Avances en seguridad de la información . 27 . Springer EE. UU. págs. 291-307.
- ^ a b c Andrei Sabelfeld y David Sands. Dimensiones y principios de la desclasificación. En Proc. del Taller de Fundamentos de Seguridad Informática del IEEE, 2005.
- ^ Thomas H. Austin y Cormac Flanagan. Análisis eficiente del flujo de información puramente dinámico, Proc. del Cuarto Taller ACM SIGPLAN sobre Lenguajes de Programación y Análisis para la Seguridad, ACM, 2009.
- ^ JS Fenton. Subsistemas sin memoria, Computación. J. 17 (2): 143-147 (1974)
- ^ S. Zdancewic. Desafíos para la seguridad del flujo de información. En Taller sobre Interferencia y Dependencia del Lenguaje de Programación (PLID'04) 2004.
- ^ A. Sabelfeld y AC Myers. Un modelo de divulgación de información delimitada. En Proc. del Simposio Internacional sobre Seguridad del Software (ISSS) 2003.
- ^ Jif: flujo de información de Java
- ^ A. Almeida Matos y G. Boudol. Sobre la desclasificación y la política de no divulgación. En Proc. Taller de Fundamentos de Seguridad Informática del IEEE 2005.
- ^ M. Krohn, A. Yip, M. Brodsky, N. Cliffer, M. Kaashoek, E. Kohler y R. Morris. Control de flujo de información para abstracciones de SO estándar. En el Simposio del Grupo de Interés Especial sobre Sistemas Operativos (SIGOPS) de ACM sobre principios de sistemas operativos 2007.
- ^ N. Zeldovich, S. Boyd-Wickizer y D. Mazieres. Protección de sistemas distribuidos con control de flujo de información. En el Simposio USENIX sobre Diseño e Implementación de Sistemas en Red 2008.
- ^ J. Bacon, D. Eyers, T. Pasquier, J. Singh, I. Papagiannis y P. Pietzuch. Control de flujo de información para una computación segura en la nube. En IEEE Transactions on Network and Service Management 2014.
- ^ Pasquier, Thomas; Singh, Jatinder; Eyers, David; Tocino, Jean (2015). "CamFlow: intercambio de datos administrado para servicios en la nube". Transacciones IEEE en Cloud Computing . 5 (3): 472–484. arXiv : 1506.04391 . Código bibliográfico : 2015arXiv150604391P . doi : 10.1109 / TCC.2015.2489211 .