En informática , un sistema de tipos se puede describir como un marco sintáctico que contiene un conjunto de reglas para asignar una propiedad de tipo (int, boolean, char, etc.) a diversos componentes de un programa, como variables o funciones. Un sistema de tipos de seguridad funciona de manera similar, centrándose principalmente en la seguridad del programa mediante el control del flujo de información . Así, a los distintos componentes del programa se les asignan tipos o etiquetas de seguridad. El objetivo de dicho sistema es verificar que un programa determinado cumple con las reglas del sistema de tipos y satisface el principio de no interferencia . Los sistemas de tipos de seguridad son una de las muchas técnicas de seguridad utilizadas en el ámbito de la seguridad basada en lenguajes y están estrechamente relacionados con el flujo de información y las políticas de flujo de información.
En términos sencillos, un sistema de seguridad puede utilizarse para detectar si existe algún tipo de violación de la confidencialidad o la integridad de un programa; es decir, el programador quiere detectar si el programa cumple o no con la política de flujo de información.
Una política sencilla de flujo de información

Supongamos que hay dos usuarios, A y B. En un programa, se introducen las siguientes clases de seguridad (SC):
SC = {∅, {A}, {B}, {A,B}}, donde ∅ es el conjunto vacío .
La política de flujo de información debe definir la dirección en la que se permite que fluya la información, lo cual depende de si la política permite operaciones de lectura o escritura . Este ejemplo considera operaciones de lectura (confidencialidad). Se permiten los siguientes flujos:
→ = {({A}, {A}), ({B}, {B}), ({A,B}, {A,B}), ({A,B}, {A}), ({A,B}, {B}), ({A}, ∅), ({B}, ∅), ({A,B}, ∅)}
Esto también puede describirse como un superconjunto (⊇). En otras palabras: se permite que la información fluya hacia niveles de confidencialidad más estrictos. El operador de combinación (⊕) puede expresar cómo las clases de seguridad pueden realizar operaciones de lectura con respecto a otras clases de seguridad. Por ejemplo:
{A} ⊕ {A,B} = {A}— la única clase de seguridad que puede leer de ambos{A}es{A,B}.{A}{A} ⊕ {B} = ∅— ni{A}ni{B}tienen permitido leer de ambos{A}y{B}.
Esto también puede describirse como una intersección (∩) entre clases de seguridad.
Una política de flujo de información puede representarse mediante un diagrama de Hasse . Esta política también debe ser una red , es decir, debe tener un límite inferior máximo y un límite superior mínimo (siempre existe una combinación entre las clases de seguridad). En el caso de la integridad, la información fluirá en sentido contrario, por lo que la política se invertirá.
Política de flujo de información en sistemas de seguridad
Una vez establecida la política, el desarrollador de software puede aplicar las clases de seguridad a los componentes del programa. El uso de un sistema de tipos de seguridad suele combinarse con un compilador que puede verificar el flujo de información según las reglas del sistema de tipos. Para simplificar, se puede utilizar como ejemplo un programa informático muy sencillo, junto con la política de flujo de información descrita en la sección anterior. El programa sencillo se presenta en el siguiente pseudocódigo :
if y{A} = 1 then x{A,B} := 0 else x{A,B} := 1
Aquí, se realiza una comprobación de igualdad en una variable y a la que se le asigna la clase de seguridad {A}. Una variable x con una clase de seguridad inferior ( {A,B}) se ve afectada por esta comprobación. Esto significa que se está filtrando información de una clase {A}a otra {A,B}, lo que constituye una violación de la política de confidencialidad. Esta filtración debería ser detectada por el sistema de tipos de seguridad.
Ejemplo
El diseño de un sistema de tipos de seguridad requiere una función (también conocida como entorno de seguridad) que crea una asignación de variables a tipos o clases de seguridad. Esta función se puede denominar Γ, de modo que Γ(x) = τ, donde xes una variable y τes la clase o tipo de seguridad. Las clases de seguridad se asignan (también llamado "criterio") a los componentes del programa, utilizando la siguiente notación:
- Los tipos se asignan a las operaciones de lectura mediante: .
Γ ⊢ e : τ - Los tipos se asignan a las operaciones de escritura mediante: .
Γ ⊢ S : τ cmd - Las constantes pueden ser de cualquier tipo.
La siguiente notación ascendente se puede utilizar para descomponer el programa: supuesto 1 ... supuesto n / conclusión . Una vez que el programa se descompone en juicios triviales, mediante los cuales se puede determinar fácilmente el tipo, se pueden derivar los tipos para las partes menos triviales del programa. Cada "numerador" se considera de forma aislada, analizando el tipo de cada instrucción para ver si se puede derivar un tipo permitido para el "denominador", basándose en las "reglas" del sistema de tipos definido.
Normas
La parte principal del sistema de tipos de seguridad son las reglas. Estas indican cómo se debe descomponer el programa y cómo se debe realizar la verificación de tipos. Este programa de ejemplo consta de una prueba condicional y dos posibles asignaciones de variables. Las reglas para estos dos eventos se definen de la siguiente manera:
Aplicando esto al programa simple presentado anteriormente se obtiene: