lunes, 7 de octubre de 2013

Como hacer frente a los virus del dia cero...

<  Como sabemos los antivirus trabajan de manera reactiva, esto es que, primero aparece el virus y luego, cuando el antivirus tiene conocimiento de el, el fabricante analiza el nuevo virus previo reporte de los usuarios y otros canales de retroalimentación, luego es liberada la actualización para hacer frente a dicha amenaza.

    Entre el momento en que aparece el virus y la respectiva actualización para el antivirus puede transcurrir un buen tiempo, en el cual el virus puede hacer bastante daño. A estos virus aun si clasificar les llamo “virus del día cero” en analogía a las vulnerabilidades del día cero.

    Lo cierto es que la mayoría de los antivirus tienen un módulo para la protección proactiva, pero en esencia lo que este componente hace es “vigilar” actividades sospechosas de los procesos cargados en memoria, como pueden ser acceso directo al disco duro, proceso que trate de “inyectarse” en otro proceso, proceso que trate de enviar correo sin el consentimiento del usuario o abrir una URL de internet. Sin embargo muchos virus ejecutan acciones en el sistema que a vista del antivirus pueden ser “legitimas”.

Para hacer frente a estos “virus del día cero” comparto este script a modo de plantilla para ser ajustado a cada caso en concreto. La lógica que sigue el script es la misma que seguiría el antivirus para desinfectar el sistema infectado. Para ello vamos a ver como actúa de forma general la mayoría de los virus en un sistema infectado.
  1. Garantizar la propagación (en la actualidad a través de memorias flash).
  2. Garantizar sobrevivir al próximo reinicio del sistema (escribir en la llaves correspondientes del registro de Windows).
  3. Cumplir con su verdadero objetivo como virus
Por tanto la lógica de desinfección seria:

  1. Identificar el proceso maligno y su programa de origen  
  2. Eliminar el proceso de la memoria del sistema infectado. 
  3. Borrar el o los archivos del virus del disco duro. 
  4. Eliminar los valores de las llaves del registro de Windows que garantizan la       carga del virus en el inicio del sistema y evitar el mensaje de Windows de la falta de un archivo o componente.   
 Para estas tareas de identificación y neutralización manual de programas malignos existen un conjunto de herramientas, pongo en consideración varias de ellas.

  • EL administrador de tareas de Windows 7 es útil en la fase de identificación; debe configurarse para que muestre el nombre y ruta de la imagen para saber la ubicación del ejecutable de origen en el menú ver\Seleccionar columnas). En este punto debe hacerse una inspección visual buscando nombres de programas, rutas y descripciones sospechosas. 
 

  • “autorun.exe” de la suite de Sysinternals, http://www.sysinternals.com/; esta utilidad muestra todos los programas, driver, servicios y dll que se cargan en el arranque del sistema y sirve para ubicar la llave del registro desde donde se indica la carga del posible programa maligno.
  • “Process Explorer” también parte de la suite de Sysinternals; es útil para identificar procesos dudosos.


  • AVZ Antiviral Toolkit, le llaman el arma secreta de Kaspersky, http://z-oleg.com/, es un antivirus algo rudimentario con actualización de su base de datos y todo pero su mayor fortaleza es que incluye un conjunto de herramientas y opciones para la identificación y neutralización de programas malignos. La página principal está en idioma Ruso asi que dejo aquí el link de descarga de la más reciente versión con su base de datos actualizada, http://z-oleg.com/avz4.zip y un par de instantáneas de esta magnifica herramienta.





Por supuesto la utilidad del script esta en automatizar la tarea de limpieza en varias PC e incluso a través de la LAN.

Copie el código del siguiente script en un nuevo archivo de texto con la extensión vbs

' Variables y constantes, sustituir el valor en cada caso concreto

'Nombre de la pc a limpiar, para un pc de la red NombrePC="\\PC1" o ip, para la pc actual poner un punto "."
NombrePC="PC1"  

'Nombre del proceso maligno
NProceso="Algo.exe"

'Nombre y ruta del proceso a matar
NRProceso="C:\Windows\Algo.exe"

 strComputer = NombrePC

' 1ro - Eliminar el proceso maligno

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set cProcess = objWMIService.ExecQuery("Select * from Win32_Process Where Name = '" + NProceso + "'")
For Each objProcess in cProcess
    objProcess.Terminate()
Next

'2do - Eliminar el archivo; 1ero comprobar si existe y luego borrarlo

 Set objFSO = CreateObject("Scripting.FileSystemObject")
 If objFSO.FileExists(NRProceso) Then
    objFSO.DeleteFile NRProceso,True          
 Else
    Wscript.Echo "No se encontro el archivo " + NRProceso
 End If


'3ro - Limpiar el registro


' ejemplo para el nondo HKEY_LOCAL_MACHINE pero puede ser otro como HKEY_current_User
Const HKEY_LOCAL_MACHINE = &H80000002
Const HKEY_CURRENT_USER = &H80000001

 
Set objRegistry=GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")

'Ruta a la llave del registro  
strKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer\Run"

'Valor a eliminar
strValueName = "Updates"

objRegistry.DeleteValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName
 

' Fin del script vbs
    
Este script me ha sido muy útil, espero que lo sea para otros.

3 comentarios finales:

  1. La tarea de identificación y neutralización manual de programas maligno además de los comentarios de esta entrada es cuestión de usuarios avanzados y administradores de sistemas.
  2. Las herramientas y el sitio de web de Sysinternal fueron adquiridas por MS desde el 2006 (http://technet.microsoft.com/es-ES/sysinternals/)
  3. Las herramientas aquí mostradas son freeware y portables.

miércoles, 25 de septiembre de 2013

Alternativa de desarrollo de software multiplataforma con herramientas libres


En esta ocasión quiero compartir mi estrategia o alternativa de desarrollo de software multiplataforma con herramientas de software libre. De antemano debo anotar 2 cosas; una, que tengo muy pocos conocimientos en el mundo del software libre y dos que reconozco que la propuesta puede ser bastante polémica, al menos en uno de sus elementos.
Esta propuesta tiene sus antecedentes, y es que durante unos años he hecho algunos desarrollos utilizando herramientas MS (Visual FoxPro, Visual Basic, Access, Excel, SQL Server), por supuesto para el SO Windows. Ahora en la empresa que trabajo me exigen que los desarrollos sean sobre software libre y que funcionen en el SO Linux, de modo que para que el cambio no fuera tan traumático analice varias variantes de migración y la que más se adaptó a mi gusto y a mis necesidades fue esta que aquí propongo.
La propuesta se divide en varias partes:
  1. Lenguaje de Programación.
  2. Entorno de desarrollo (IDE).
  3. Sistema de Gestión de Bases de Datos (SGBD).
  4. Mecanismo de conexión a la base de datos
  5. Generación y presentación de informes
  6. Uso de estándares y recomendaciones para la escritura de código


  1. Lenguaje de Programación (C#)
C# (C sharp) es un lenguaje de programación orientado a objetos desarrollado y estandarizado por Microsoft como parte de su plataforma .NET.
Este lenguaje esta estandarizado por la ECMA e ISO respectivamente
  • Estandar ECMA desde diciembre 2001 a través de la norma 334
  • Estandar ISO a través de la ISO/IEC 23270:2006
Aunque C# forma parte de la plataforma.NET de MS, es un lenguaje de programación independiente y multiplataforma. Existen compiladores libres y gratuitos para este lenguaje de programación tanto para Windows (SharpDevelop, MonoDevelop) como para Linux (MonoDevelop, DotGNU).
Este lenguaje de programación es una evolución del C++ y a su vez del C que está muy ligado al Sistema Operativo Unix, C# ha estado influenciado por los lenguajes de programación Java y Delphi (Object Pascal).
C# es un lenguaje de programación muy sencillo, potente y entretenido, es escogido en esta propuesta porque es el lenguaje de programación de Microsoft con mejor soporte en Linux a través del proyecto MONO.
Agregar en este punto que el CLI (Common Language Infrastructure) que vendría siendo como la máquina virtual sobre la que se ejecutan las aplicaciones .NET también esta Normalizado/Estandarizado por ECMA e ISO


2 - Entorno de desarrollo (IDE) (SharpDevelop, MonoDevelop)
SharpDevelop es un entorno de desarrollo integrado (IDE) libre para los lenguajes de programación C#, Visual Basic.NET y Boo para el sistema operativo Windows bajo la licencia LGPL, entre sus características más relevantes se encuentran:
  • Abrir proyectos de Visual Studio.NET
  • Diseñador de Windows forms.
  • Completado de código.
  • Depurador incorporado.
  • Conversor bidireccional entre C# y Visual Basic .NET
  • Escrito enteramente en C#.
El sitio oficial de SharDevelop es http://www.icsharpcode.net/OpenSource/SD
MonoDevelop es un IDE libre y gratuito bajo la licencia GPL, diseñado primordialmente para C# y otros lenguajes .NET, es mantenido por el Proyecto Mono (http://www.mono-project.com/) que a su vez es impulsado por Novell
Este IDE incluye manejo de clases, ayuda incorporada, completamiento de código, y un depurador integrado. Incluye un instalador para Windows y se distribuye en los repositorios para Debian y Ubuntu. A partir de la versión 2.4 es capaz de abrir proyectos de Visual Studio.NET. Actualmente los repositorios de Ubuntu 12.04 distribuyen la versión 2.8
En este punto se incluyen dos propuestas porque ambas se complementan entre sí, por un lado SharpDevelop no tiene presencia en Linux pero incluye un diseñador windows forms mucho más acabado que MonoDevelop, este es un elemento importante en el diseño visual de aplicaciones con interface gráfica.

3 - Sistema de Gestión de Bases de Datos (SGBD) (PostgreSQL)
PostgreSQL es un sistema de gestión de base de datos relacional orientada a objetos y libre, publicado bajo la licencia BSD, es ampliamente soportado en las plataformas Windows y Linux. A pesar de su similitud con muchos gestores de bases de datos presenta características que lo convierten en unos de los más potentes, entre ellas:
  • Alta concurrencia
  • Amplia variedad de tipos de datos: Textos de largo ilimitado, Figuras geométricas, Direcciones IP, Direcciones MAC, Tipos de datos espaciales, arreglos y otros.
  • Varios lenguajes para Procedimientos Almacenados y Funciones: Pueden escribirse en PL/PgSQL, C, C++, Java y otros.
  • Soporte para Replicación.
  • Varias herramientas para la administración de las Bases de Datos: PGAdmin, PhpPgAdmin, PgAccess y otros.
  • Driver para la API ODBC, .NET, OLE DB y otros
PostgreSQL presenta muchas otras características innovadoras. Los desarrolladores que una vez usaron MS Access y MS SQL Server se sentirán muy cómodos en la transición hacia este SGBD. Resulta completamente viable y sencillo a través de ODBC migrar una base de datos SQL Server a PostgreSQL, a excepción de los procedimientos almacenados y funciones escritas en el lenguaje Transact-SQL.


4 - Mecanismo de conexión a la base de datos (ODBC)
Open DataBase Connectivity (ODBC), Conectividad Abierta a Bases de Datos es un estándar de acceso a Bases de datos desarrollado por Microsoft, el objetivo de ODBC es hacer posible el acceder a cualquier dato desde cualquier aplicación, sin importar qué Sistema Gestor de Bases de Datos (SGBD) almacene los datos. Para que esto funcione tanto la aplicación como el SGBD deben ser compatibles con ODBC. De modo que ODBC es independiente del lenguaje de programación, del SGBD y del Sistema Operativo. Linux cuenta con soporte para ODBC a través del proyecto UnixODBC (http://www.unixodbc.org).
UnixODBC proporciona un completo gestor de controladores ODBC, incluyendo la completa API de ODBC, todas las funciones de la utilidad del controlador, instalador, desinstalador y biblioteca de configuración para controladores ODBC, un administrador en interfaz gráfica de usuario, una utilidad de administración de la línea de comandos.
Panel de administración ODBC Ubuntu 10.04 invocado a través del comando ODBCConfig


Panel de administración ODBC en Linux Mint 13 a través del comando ODBCManageDataSourcesQ4

Panel de administración ODBC Windows 7, a través de Inicio\Herramientas Administrativas\Orígenes de datos ODBC


Utilizar ODBC como capa intermedia entre la aplicación y la base de datos nos da las siguientes posibilidades, entre muchas otras:
  • El nombre de la base de datos es transparente para la aplicación, de modo que desde una única instalación del programa se pueden manejar varias bases de datos, trabajando con las cadenas de conexión DSN.
  • Gestión de la seguridad más funcional y flexible, la aplicación puede incluir su propio mecanismo de seguridad y la seguridad de la base de datos es administrada por el administrador de la base de datos a través de los DSN de usuarios.

5 - Generación y presentación de informes (NReports)
NReports 0.8.1 es un reporteador open source y multiplataforma, distribuido bajo la licencia de Creative Commons. Utiliza el formato de archivos RDL que lo convierte en una buena opción para migrar reportes diseñados en Microsoft Reporting Services y toda la reporteria de Microsoft. El autor distribuye el código fuente del reporteador que está escrito completamente en C# (http://nreports.codeplex.com/).
Entre sus características tiene un diseñador y visor de informes usando windows forms para representación en Windows, y un diseñador y visor de informes usando Gtk y Cairo para representación en Linux. Es capaz de exportar los reportes en formato PDF, el cual es un formato abierto, estandarizado y multiplataforma. En las pruebas realizadas mostro una buena y adecuada integración en Mono en Linux.
Este reporteador es un fork de fyireporting (www.fyireporting.com) un proyecto open source de la especificación RDL de MS. A su vez también existe un fork de NReports llamado ReportingCould.
En un próximo artículo lo dedicaré a este reporteador entre otras cosas de como pasar parámetros al reporte y el mecanismo que utilizo para vincular los reportes al origen de datos en tiempo de ejecución.

  1. - Uso de estándares y recomendaciones para la escritura de código. (Escritura de codigo para aplicaciones multiplataforma)
  • No hacer llamadas a APIs o funciones propias del Sistema Operativo (SO).
  • Utilizar las funciones propias del lenguaje de programación para el trabajo con el sistema de archivos, hay que tener presente que cada SO tiene sus particularidades en el manejo de archivos y directorios.
  • No utilizar controles o bibliotecas de terceros a menos que se haya probado que funcionan en las plataformas de destino de la aplicación.
  • Uso del lenguaje SQL a través de ODBC para cualquier interacción con la base de datos (Selección, Inserción, Actualización y Eliminación). Mono expone a través de ADO el espacio de nombres System.Data.ODBC el cual incluye un conjunto de clases para la manipulación de datos a través de ODBC.
  • Diseñar clases que permitan enlazar los controles visuales a los datos en tiempo de ejecución. El diseño visual de entorno de datos (Dataset) no es soportado en Mono (al menos no he visto cómo hacerlo).
  • Uso de archivos XML para intercambio de información o exportación de datos en caso que fuera necesario a través de los métodos WriteXML o ReadXML de los dataset en ADO.
  • Compresión de archivos, en caso que fuera necesario utilizar el Algoritmo Deflate, que es un algoritmo estándar en el sector para la compresión y descompresión de archivos sin pérdidas. El formato se puede utilizar con facilidad de una manera no protegida por patentes. Los detalles del formato aparecen en la RFC 1951. En Linux es implementado a través de la utilidad Gzip. El espacio de nombres System.IO.Compression disponible en Mono, incluye la clase GZipStream la cual proporciona métodos y propiedades para comprimir y descomprimir archivos.

Referencias:
http://standards.iso.org










miércoles, 18 de septiembre de 2013

Buscar en varios campos de una tabla de una base de datos utilizando un único criterio de búsqueda


 Recientemente alguien pidió sugerencia de como buscar en varios campos de una tabla de una base de datos utilizando un único criterio de búsqueda, esto con independencia de los tipos de datos de los campos. El asunto era presentar a un usuario un campo de texto en un formulario o pagina web para realizar una búsqueda pero que la búsqueda se realizara en cualquier campo de la tabla de la base de datos.
Vamos a ilustrar el ejemplo. Supongamos que tenemos una tabla de estudiantes con datos hipotéticos.

Tabla Estudiantes
Campo
Tipo de dato
Nombre
String
Apellidos
String
Edad
Integer


Los datos de la tabla pudieran mostrarse más o menos así

Nombre
Apellidos
Edad
Juan
Pérez
21
José
Rodríguez
20
Enríquez
Martínez
22


El caso común para buscar en esta tabla seria encuestar al usuario de la aplicación sobre el criterio de búsqueda y luego formular una consulta SQL para realizar la búsqueda. En el caso que la busqueda se vaya a realizar por nombre la consulta quedaría asi:

Select * From estudiantes Where Nombre=”<criterio>”

Y asi para los restantes campos. Pero el caso que nos ocupa es que queremos implementar la búsqueda para que el usuario indique cualquier cosa como parámetro de búsqueda y esta se realice en cualquiera de los campos de la tabla
Mi sugerencia fue concatenar los campos (con su respectiva conversión a string en caso de que sea necesario) y utilizar el operador LIKE sobre esta concatenación.


Sería una construcción SQL más o menos así
Select * From estudiantes Where (Nombre +”-“ + Apellidos + “-“ + Edad) Like “%<criterio>%”
Por supuesto, necesitamos convertir a string el campo Edad y teniendo en cuenta que esta construcción SQL puede variar entre un gestor de base de datos y otro, veremos el caso en concreto.
SQL Server:
Select * from estudiantes Where (Nombre+'-'+Apellido+'-'+cast(Edad as char)) Like '%<criterio>%'
 
PostgreSQL:
Select * from estudiantes Where (Nombre ||'-' ||Apellido || '-' || cast(Edad as char)) Like %<criterio>%'
 
Como podemos apreciar para concatenar campos se usan diferentes caracteres entre un SGBD y otro…
Finalmente anotar que este tipo de consulta pudiera tornarse un poco lenta en dependencia de la cantidad de campos a buscar y de la cantidad de información almacenada en la tabla…