jueves, 11 de octubre de 2018

Ejecucion especulativa: ¿que es?, ¿que vulnerabilidades a generado?, ¿hay alguna solucion planteada?

¿Que es?:

Es una forma de optimización en la que un sistema informático realiza una tarea que podría no ser necesaria; la idea consiste en llevar a cabo un trabajo antes de saber si será realmente necesario con la intención de evitar el retraso que supondría realizarlo después de saber que sí es necesario. Si el trabajo en cuestión resulta ser innecesario, la mayoría de los cambios realizados por ese trabajo se revierten y los resultados se ignoran.

El objetivo de esta técnica es proporcionar una mayor concurrencia en caso de disponer de más recursos. Esta técnica se utiliza en una variedad de áreas informáticas, incluyendo la predicción de saltos en las CPU que soportan segmentación, la predicción de valores dirigida a explotar la localización de valores, la prelectura de memoria y archivos, y el control de concurrencia optimista en sistemas de bases de datos.

Los modernos microprocesadores que incluyen segmentación utilizan ejecución especulativa para reducir el coste de las instrucciones que dependen de la predicción de saltos, y lo hacen mediante técnicas que predicen la ruta de ejecución de un programa basándose en el historial de los saltos realizados anteriormente.

Con el fin de mejorar el rendimiento y optimizar la utilización de los recursos del sistema informático, las instrucciones pueden planificarse cuando todavía no se ha determinado si será o no necesario ejecutarlas, antes de un salto.

¿Que vulnerabilidades a generado?

En junio de 2017, un equipo formado por investigadores independientes, laboratorios universitarios de investigación, algunos miembros del Proyecto Cero de Google y Cyberus Technology descubrió dos vulnerabilidades de seguridad que eran posibles gracias al uso ampliamente extendido de la ejecución especulativa. El problema fue descubierto también de forma independiente por otros investigadores más o menos al mismo tiempo. Las vulnerabilidades terminaron haciéndose públicas en enero de 20189 y fueron denominadas Meltdown y Spectre (las cuales comentaremos ahora).

Meltdown:
  • La vulnerabilidad Meltdown es un agujero de seguridad en el hardware que afecta a los procesadores Intel x86, a los procesadores IBM POWER, y también a algunos procesadores basados en la arquitectura ARM​, y que permite que un proceso maligno pueda leer de cualquier lugar de la memoria virtual, aún sin contar con autorización para hacerlo.
  • Explota una condición de carrera inherente al diseño de muchas CPU actuales (esta condición se da entre los accesos a la memoria y la comprobación de privilegios durante el procesamiento de instrucciones) además, en combinación con un ataque de canal lateral a la caché de la CPU (esta vulnerabilidad permite que un proceso se salte las comprobaciones habituales de nivel de privilegio que normalmente aislarían al proceso maligno e impedirían que accediese a datos que pertenecen al sistema operativo y otros procesos concurrentes) 
  • La vulnerabilidad permite que un proceso no autorizado lea información de cualquier dirección mapeada al espacio de memoria del proceso actual. Dado que la segmentación de instrucciones reside en los procesadores afectados, la información de una dirección no autorizada casi siempre se cargará temporalmente en la caché de la CPU durante la ejecución fuera de orden, pudiendo posteriormente leerse desde la caché. 
  • Esto puede suceder incluso cuando la instrucción de lectura original falla debido a una comprobación de privilegios que da negativo, o cuando no produce un resultado legible.
Spectre:
  • es una vulnerabilidad que afecta a los microprocesadores modernos que utilizan predicción de saltos. En la mayoría de los procesadores, la ejecución especulativa que surge de un fallo de la predicción puede dejar efectos observables colaterales que pueden revelar información privada a un atacante. Por ejemplo, si el patrón de accesos a la memoria realizados por la mencionada ejecución especulativa depende de datos privados, el estado resultante de la caché de datos constituye un canal lateral mediante el cual un atacante puede ser capaz de obtener información acerca de los datos privados empleando un ataque sincronizado.

  • Spectre es una vulnerabilidad que permite a los programas alojados en el sistema operativo del usuario acceder a una dirección arbitraria del espacio de memoria de un programa.


  • En lugar de una única vulnerabilidad de fácil corrección, el documento de Spectre1​ describe una clase entera de vulnerabilidades potenciales.​ Todas esas vulnerabilidades se basan en explotar los efectos secundarios de la ejecución especulativa, una técnica empleada comunmente para combatir la latencia de la memoria y acelerar así la ejecución en los microprocesadores modernos.


  • En particular, Spectre se centra en la predicción de saltos, un caso especial de la ejecución especulativa. A diferencia de la vulnerabilidad Meltdown hecha pública la misma fecha, Spectre no depende de una característica en particular de la gestión de memoria de un procesador en concreto o de cómo proteja el acceso a esa memoria, sino que tiene un enfoque más general.


  • El punto de partida del documento de Spectre es un ataque sincronizado de canal lateral​ aplicado al sistema de predicción de saltos de un microprocesador moderno que utilice ejecución fuera de orden. Si bien al nivel arquitectónico documentado en las hojas técnicas de los procesadores los resultados de un fallo en la predicción se especifican que quedarán anulados tras darse dicha circunstancia, la ejecución especulativa resultante puede aun así dejar efectos colaterales, como líneas de caché cargadas con determinada información.


  • Estos efectos colaterales pueden posteriormente afectar a los denominados aspectos no funcionales del sistema informático. Si tales efectos colaterales resultan visibles para un programa malicioso, y puede hacerse que esos efectos dependan de información sensible en posesión del proceso que hace las veces de víctima, entonces estos efectos colatelares pueden hacer que la información sensible resulte deducible. Esto puede ocurrir aunque los sistemas de seguridad formales a nivel de arquitectura funcionen de forma correcta.

¿Hay alguna solucion planteada?

La mayoria de fabricantes recomienda que el usuario active las actualizaciones automaticas de su SO y que siempre tenga el antivirus activado

jueves, 4 de octubre de 2018

Comparacion tipos de codificacion de caracteres

ASCII:

Es un código de caracteres basado en el alfabeto latino, tal como se usa en inglés moderno. Fue creado en 1963 por el Comité Estadounidense de Estándares como una refundición o evolución de los conjuntos de códigos utilizados entonces en telegrafía. Más tarde, en 1967, se incluyeron las minúsculas, y se redefinieron algunos códigos de control.

El Código ASCII utiliza 7 bits para representar los caracteres, aunque inicialmente empleaba un bit adicional (bit de paridad) que se usaba para detectar errores en la transmisión.

ASCII fue publicado como estándar por primera vez en 1967 y fue actualizado por última vez en 1986. En la actualidad define códigos para 32 caracteres no imprimibles, de los cuales la mayoría son caracteres de control que tienen efecto sobre cómo se procesa el texto, más otros 95 caracteres imprimibles que les siguen en la numeración

tabla con el lebguaje ascii. Fuente sacada de: https://commons.wikimedia.org/wiki/File:ASCII-Table.svg

ASCII extendido:

Se denomina ASCII extendido a cualquier juego de caracteres de 8 bits, en el cual los códigos 32 a 126 coinciden con los caracteres imprimibles de ASCII, así como los caracteres comúnmente llamados "de espacio", estos son los códigos de control de 8 a 13, ambos inclusive. Las codificaciones de ASCII extendido utilizan además parte o la totalidad de los códigos superiores a 128 para codificar caracteres adicionales a los caracteres imprimibles ASCII.

tabla que muestra el lenguaje ascii extendido. Fuente sacada de: https://commons.wikimedia.org/wiki/File:Table_ascii_extended.png

BCD:

es un código estándar de 6 bits usado por ordenadores de tipo mainframe. IBM creó un código para las tarjetas perforadas de los años 1960 que se extendió entre los otros fabricantes. El código BCD (6-bit) fue la adaptación del código tarjeta perforada a código binario para poderlo cargar más fácilmente en la memoria del ordenador central. El código BCD (6-bit) es pues un código binario que representa caracteres alfanuméricos y signos de puntuación. Cada carácter está compuesto por 6 bits (2 caracteres octal), con estos 6 bits se pueden definir un total de 64 caracteres (2^6).

EBCDIC:

Es un código estándar de 8 bits usado por computadoras mainframe IBM. IBM adaptó el EBCDIC del código de tarjetas perforadas en los años 1960 y lo promulgó como una táctica customer-control cambiando el código estándar ASCII. EBCDIC es un código binario que representa caracteres alfanuméricos, controles y signos de puntuación. Cada carácter está compuesto por 8 bits = 1 byte, por eso EBCDIC define un total de 256 caracteres. Existen muchas versiones ("codepages") de EBCDIC con caracteres diferentes, respectivamente sucesiones diferentes de los mismos caracteres.

Unicode:

Es un estándar de codificación de caracteres diseñado para facilitar el tratamiento informático, transmisión y visualización de textos de múltiples lenguajes y disciplinas técnicas, además de textos clásicos de lenguas muertas. Unicode define cada carácter o símbolo mediante un nombre e identificador numérico, el code point (‘punto de código’). Además incluye otras informaciones para el uso correcto de cada carácter, como sistema de escritura, categoría, direccionalidad, mayúsculas y otros atributos. Unicode trata los caracteres alfabéticos, ideográficos y símbolos de forma equivalente, lo que significa que se pueden mezclar en un mismo texto sin utilizar de marcas o caracteres de control.

La creación de Unicode ha sido un ambicioso proyecto para reemplazar los esquemas de codificación de caracteres ya existentes, muchos de los cuales estaban muy limitados en tamaño y son incompatibles con entornos plurilingües. Unicode se ha convertido en el más extenso y completo esquema de codificación de caracteres, siendo el dominante en la internacionalización y adaptación local del software informático. El estándar ha sido aceptado en un número considerable de tecnologías recientes, como XML, Java y sistemas operativos modernos.

Pagina oficial de unicode: http://www.unicode.org/charts/

UTF-8:

es un formato de codificación de caracteres Unicode utilizando símbolos de longitud variable. Actualmente es una de las tres posibilidades de codificación reconocidas por Unicode y lenguajes web.

Sus características principales son: es capaz de representar cualquier carácter Unicode, usa símbolos de longitud variable (de 1 a 4 bytes por carácter Unicode), incluye la especificación US-ASCII de 7 bits, por lo que cualquier mensaje ASCII se representa sin cambios, incluye sincronía.

Es posible determinar el inicio de cada símbolo sin reiniciar la lectura desde el principio de la comunicación, no superposición. Los conjuntos de valores que puede tomar cada byte de un carácter multibyte, son disjuntos, por lo que no es posible confundirlos entre sí. Estas características lo hacen atractivo en la codificación de correos electrónicos y páginas web.

lunes, 1 de octubre de 2018

Generaciones de ordenadores

1ªgeneración:
  • Usaban tubos al vacío para procesar información, se usaban tarjetas perforadas para entrar los datos y los programas, se usaban cilindros magnéticos para almacenar información e instrucciones internas y se comenzó a utilizar el sistema binario para representar los datos

2ªgeneración:
  • Usaban transistores para procesar información, los transistores eran más rápidos, pequeños y más confiables que los tubos al vacío, 200 transistores podían acomodarse en la misma cantidad de espacio que un tubo al vacío, usaban pequeños anillos magnéticos para almacenar información e instrucciones, se mejoraron los programas de ordenadores que fueron desarrollados durante la primera generación y se desarrollaron nuevos lenguajes de programación como COBOL y FORTRAN, los cuales eran comercialmente accsesibles.

3ªgeneración:
  • Se desarrollaron circuitos integrados para procesar información, se desarrollaron los "chips" para almacenar y procesar la información. Un "chip" es una pieza de silicio que contiene los componentes electrónicos en miniatura llamados semiconductores, los circuitos integrados recuerdan los datos, ya que almacenan la información como cargas eléctricas, urge la multiprogramación los ordenadores pueden llevar a cabo ambas tareas de procesamiento o análisis matemáticos y emerge la industria del "software". Se invento el diskette

4ªgeneración:
  • Se desarrolló el microprocesador, se colocan más circuitos dentro de un "chip" ("LSI - Large Scale Integration circuit" y "VLSI - Very Large Scale Integration circuit"), cada "chip" puede hacer diferentes tareas, un "chip" sencillo actualmente contiene la unidad de control y la unidad de aritmética/lógica y el tercer componente, la memoria primaria, es operado por otros "chips", se reemplaza la memoria de anillos magnéticos por la memoria de "chips" de silicio, se desarrollan los microordenadores, o sea, ordenadores personales o PC y se desarrollan laos superordenadores. 20 de noviembre de 1985 creacion de microsoft windows

5ªgeneración:
  • Programacion orientada a objetos, software "amigable", comienza la inteligencia artificial (deepblue) nacimiento de internet

6ªgeneración:
  1. Expansion de redes WAM, multimedia en tiempo real, redes sociales, multiprocesadores de varios nucleos, lenguajes de programacion web: javascript, html, php; lenguajes de programacion para moviles, aparecen las tablets y los smartphones