Mostrando entradas con la etiqueta ruby. Mostrar todas las entradas
Mostrando entradas con la etiqueta ruby. Mostrar todas las entradas

rats, auditando código fuente

rats es una de esas utilidades que no se suelen emplear y que puedan dar muy buenos resultados en poco tiempo a la hora de programar. La verdad es que yo no conocía este tipo de herramientas (debe ser por la falta de costumbre de programar), pero son muy útiles, ya que permiten detectar fallos triviales en el código, de forma automática. Los típicos con las variables no inicializadas, cast's entre tipos de datos diferentes sin límites, etc.
rats tiene soporte para 5 lenguajes de programación, c, perl, ruby, python y php, con una amplia base de datos de fallos comunes, especialmente c, con 334 entradas. La forma de funcionar típica, es indicarle el tipo de lenguaje de programación (sino lo autodetecta) y los ficheros de entrada. También se le puede decir que saque la salida en formato xml o html. Por defecto, los fallos si no se indica nada, los saca desde la consola.
Al termina de analizar, ofrece unos resultados y el tiempo que tardó en procesar todos los ficheros. Los resultados los agrupo por el tipo de vulnerabilidad que tiene (alta, medio o baja), indicando las líneas en las que se encuentra el fallo, así como información de mismo.
Un ejemplo de ejecución puede ser el que sigue, con sus correspondientes resultados.
shell> rats --language c --input *.c --html > salida.html
Y los resultados obtenidos (copiado del formato html),
------------
Entries in perl database: 33
Entries in ruby database: 46
Entries in python database: 62
Entries in c database: 334
Entries in php database: 55

Analyzing checks_agent.c
Analyzing checks_aggregate.c
Analyzing checks_calculated.c
Analyzing checks_db.c
Analyzing checks_external.c
Analyzing checks_internal.c
Analyzing checks_ipmi.c
Analyzing checks_simple.c
Analyzing checks_snmp.c
Analyzing checks_ssh.c
Analyzing checks_telnet.c
Analyzing poller.c

RATS results

Severity: High
Issue: fixed size global buffer
Extra care should be taken to ensure that character arrays that are allocated on the stack are used safely. They are prime targets for buffer overflow attacks.
    File: checks_agent.c
    Lines: 49
    File: checks_aggregate.c
    Lines: 297
    File: checks_calculated.c
    Lines: 311
    File: checks_internal.c
    Lines: 46 47
    File: checks_ipmi.c
    Lines: 772 862
    File: checks_simple.c
    Lines: 28 29 30 31
    File: checks_snmp.c
    Lines: 248 468 838 839 840 841 842 843
    File: checks_ssh.c
    Lines: 86 343
    File: checks_telnet.c
    Lines: 319 394 516
    File: poller.c
    Lines: 347 447
Severity: Medium
Issue: read
Check buffer boundaries if calling this function in a loop and make sure you are not in danger of writing past the allocated space.
    File: checks_telnet.c
    Lines: 72

Inputs detected at the following points

Total lines analyzed: 5449
Total time 0.007437 seconds
732687 lines per second
------------
La verdad es que es una herramienta interesante si el lenguaje de programación está soportado para controlar los tipos de fallos más comúnmente conocidos y poder corregirlos. Sin duda, ayudará a mejorar la seguridad del código final. Por supuesto, al ser código libre, las bases de datos de vulnerabilidades se pueden seguir mejorando, así como emplear otras conocidas y compatibles (opción --database).
Leer más

Ruby: fallo de seguridad criptográfica


Justo antes de ir a dormir me entero vía unaaldía y el canal svn  de Ruby que se acaba de publicar un importante fallo de seguridad en los sistemas de cifrado de Ruby. Concretamente en la librería que se encarga de generar las claves de los algoritmos RSA. Esto deja al sistema un poco indefenso ante ataques de fuerza bruta a la hora de adivinar la clave RSA, ya que dejan de ser todo lo aleatorias que debería. Algo similar al fallo CVE-2008-0166 de Debian en OpenSSL.
El anuncio oficial se dio en el canal SVN de Ruby:
ext/openssl/ossl_pkey_rsa.c (rsa_generate): [SECURITY] Set RSA exponent value correctly. Awful bug. This bug caused exponent of generated key to be always '1'. By default, and regardless of e given as a parameter.

!!! Keys generated by this code (trunk after 2011-09-01) must be re-generated !!! (ruby_1_9_3 is safe)
Ya hay una nueva release que corrige el fallo detectado, por lo que es muy recomendable actualizar y generar nuevamente las claves RSA si la versión usada está afectada y se han generado claves con ella.

Más info:
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=33633
http://unaaldia.hispasec.com/2011/11/horrible-fallo-de-seguridad.html
Leer más

Ruby: consulta a BD multithread

Con todo lo aprendido hasta ahora relacionado con ruby y la apertura de socket's y manejo de bases de datos, vamos a unirlo todo en un pequeño programa ejemplo, que ilustrará la simpleza de código ruby.
Partimos de la siguiente tabla de la base de datos.
mysql> show create table users;
+-------+-----------------------------------------------+
| Table | Create Table                                  |
+-------+-----------------------------------------------+
| users | CREATE TABLE `users` (                        |
|       | `id` int(5) unsigned NOT NULL AUTO_INCREMENT, |
|       | `nombre` text NOT NULL,                       |
|       | `login` varchar(15) NOT NULL,                 |
|       | `passwd` varchar(33) NOT NULL,                |
|       | `is_admin` smallint(1) DEFAULT '0',           |
|       | `email` varchar(100) DEFAULT NULL,            |
|       | PRIMARY KEY (`id`) ) ENGINE=InnoDB            |
+-------+-----------------------------------------------+
1 row in set (0.00 sec)

Con el siguiente código nos conectamos a una base de datos y dejamos un servicio multithread a la escucha, que le devuelve a los clientes el resultado de una query. Aunque es sencillo, el código es muy simple y permitiría montar fácilmente un web service multithread rápidamente.
Leer más

Ruby: Acceso a MySQL

Ruby tiene conectores para diversas bases de datos, entre ellas, como no,  MySQL. En sistemas debian/ubuntu, el driver a instalar para conectase es libdbd-mysql-ruby.
shell> apt-get install libdbd-mysql-ruby

Y el código para permitir accesos a base de datos, sería:
#!/usr/bin/ruby -w

require 'mysql'

begin
   dbh = Mysql.real_connect("localhost", "USER", "PASSWD", "DB")
   puts "Server version: " + dbh.get_server_info
   query = dbh.query("SELECT login, email FROM users")
   query.each_hash do |row|
      row["login"] = "NULL" if row["login"].nil?
      row["email"] = "NULL" if row["email"].nil?
      printf "%s, %s\n", row["login"], row["email"]
   end
   puts "Number of rows returned: #{query.num_rows}"
   query.free
   rescue Mysql::Error => e
      puts "Error code: #{e.errno}"
      puts "Error message: #{e.error}"
   ensure
   dbh.close if dbh
end
Leer más

Ruby: abrir un socket mulithread

En un post anterior, vimos como abrir un socket para una única conexión entrante. Es interesante poder enviar datos y recibirlos de un equipo, pero mucho más interesante es poder hacer un servidor en condiciones que permita escuchar y responder a varias conexiones al mismo tiempo.
Continúa leyendo para ver el código de un servidor multihilo.
Leer más

Ruby: abrir un socket

Hoy voy a comenzar un una seria de post's sobre programación en ruby. En su día aprendí un poco este lenguaje y ahora, poco a poco hay que ir avanzando en él, para así poder hacer cosas más complejas y útiles.
El siguiente código muestra cómo abrir un socket tcp en un servidor a la escucha de una única conexión entrante.
/usr/bin/ruby -w

require 'socket'

server = TCPServer.open(4096)
loop {
     client = server.accept
     client.puts "Conexion abierta"
     print(client, " aceptado\n") 
     client.write(Time.now.ctime) 
     sleep 3
     client.write("\nCerrando la conexion\n")
     client.close
     print(client, " cerrado\n")
}

Y a continuación el código del cliente para conectarse con el servidor. Este código es también ruby, pero el socket escucha cualquier tipo de cliente.
/usr/bin/ruby -w

require 'socket'

host = '192.168.1.33'
port = 4096
server = TCPSocket.open(host, port)

while line = server.gets
  puts line.chop
end
server.close

Tras el salto, cómo se usa.
Leer más

Formulario de contacto

Nombre

Correo electrónico *

Mensaje *

Últimos comentarios