Administración del Conocimiento – UML Simulation

AST para detectar código malicioso

Posted in OODBMS - Base de Objetos, POO by smalltalkuy on mayo 21, 2015

Problema: en la importación de archivos XPDL generados por Bizagi se importan también reglas de negocio generalmente asociadas a gateways:

bifurCondiciones de bifuracación pueden ser:

– monto > 10000

– edad > 18 y monto > 10000

– En un bloque de Smalltak es:  [:form | form edad > 18 and:[form amount > 10000]]

La implementación y ejecución de estas reglas es bastante sencilla, se crea un BlockClosure y se evalua:

block := self evaluate: ‘[:form | form edad > 18 and:[form amount > 1000]]’.

Aquí se crea un bloque de código que se puede evaluar N veces, en este caso el bloque tiene solamente un argumento “form“. Para evaluar el bloque:

block value: aFormObject.

“en este caso ejecuta –> aFormObject edad > 18 and:[aFormObject amount > 1000]”

PROBLEMA

El Problema es la injección de código malicioso dentro de Bizagi. Si en lugar de la regla previamente presentada se pone la siguiente condición:

‘[:form | MySystem removeAllProcesses]’

En este caso cuando se evalue la condición –> se eliminarán todas las instancias de procesos (un desastre !!!).

SOLUCION

La solución es usar un AST (abstract syntax tree) para evitar este tipo de situaciones.

Si bien en GemStone/S se puede usar otras opciones como la clase GsObjectSecurityPolicy voy a analizar solamente el uso de un AST. Dentro del AST usaremos solamente los mensajes más basicos y no usaremos el RBParseTreeSearcher, que es para hacer búsquedas mucho más complejas (ver Secrets of the Rewriter Tool).

parser := RBParser parseExpression: ‘[:form | MySystem removeAllProcesses].

atomicMessages := parser allChildren select: [:each | each isMessage and: [each receiver isVariable]].

argumentName := parser arguments last name.

(atomicMessages select: [:each | each receiver name ~= argumentName])
do: [:each | self addBlockWarning: ‘Message is sent to object [‘, each receiver name, ‘] that is NOT the argument of the Block.’ ].

Estas simples lineas de código evitan que dentro del bloque se envie mensajes a cualquier objeto o clase.

select: [:each | each isMessage and: [each receiver isVariable]].

De todos los nodos del código selecciona los nodos que son mensajes (isMessage) y además el receptor del mensaje (receiver) es del tipo variable (isVariable). Así obtenemos los objetos a los que se le envián mensajes.

(atomicMessages select: [:each | each receiver name ~= argumentName])

Aquí comparamos los objetos obtenidos anteriormente con el nombre del argumento del bloque (form). Si algún receptor de mensaje difiere del argumento del bloque –> estamos en problemas.

Para el caso:

‘[:form | MySystem removeAllProcesses]

Uno de los receptores de mensaje es ‘MySystem‘ y como difiere de form –> salta el error/advertencia.

Hay otros controles que se hacen pero el post sería muy largo…

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: