Comment fonctionne un malware sans fichier sur Linux?

10

Je comprends la définition d'un malware sans fichier:

Un code malveillant qui n'est pas basé sur un fichier mais existe uniquement en mémoire… Plus particulièrement, un code malveillant sans fichier… s'ajoute à un processus actif en mémoire…

Quelqu'un peut-il expliquer comment cela s’ajoute à un processus actif en mémoire?

De plus, quelle protection / durcissement (noyau) est disponible contre de telles attaques?

Martin Vegter
la source
Par exemple, en exploitant un débordement de tampon dans une application réseau, puis en téléchargeant du code malveillant qui s'exécute à l'intérieur de l'application et se propage via le réseau. Aucun fichier impliqué. La seconde partie de la question est très large, elle revient essentiellement à "quelles contre-mesures existent contre les malwares"?
dirkt
Il serait préférable de répondre à cette question sur /security// .
rubynorails
@rubynorails - Je ne m'intéresse qu'aux réponses spécifiques à Linux. SecuritySE est général. Si j'y demande une réponse spécifique à Linux, ils m'enverront ici.
Martin Vegter

Réponses:

6

Un malware sans fichier attaque la cible en exploitant une vulnérabilité, par exemple dans le plugin Flash d'un navigateur ou dans un protocole réseau.

Un processus Linux peut être modifié à l'aide de l'appel système ptrace(). Cet appel système est généralement utilisé par les débogueurs pour inspecter et gérer l'état interne du processus cible et est utile dans le développement de logiciels.

Par exemple, considérons un processus avec PID 1234. Tout l'espace d'adressage de ce processus peut être visualisé dans le pseudo-système /procde fichiers à l'emplacement /proc/1234/mem. Vous pouvez ouvrir ce pseudofichier, puis vous attacher à ce processus via ptrace(); après cela, vous pouvez utiliser pread()et pwrite()écrire dans l'espace de processus.

char file[64];
pid = 1234;

sprintf(file, "/proc/%ld/mem", (long)pid);
int fd = open(file, O_RDWR);
ptrace(PTRACE_ATTACH, pid, 0, 0);

waitpid(pid, NULL, 0);
off_t addr = ...; // target process address

pread(fd, &value, sizeof(value), addr);
// or
pwrite(fd, &value, sizeof(value), addr);

ptrace(PTRACE_DETACH, pid, 0, 0);
close(fd);

(Code tiré d' ici . Un autre article sur un exploit ptrace est disponible ici .)

Concernant la défense orientée noyau contre ces attaques, la seule façon est d'installer les correctifs des fournisseurs du noyau et / ou de désactiver le vecteur d'attaque particulier. Par exemple, dans le cas de ptrace, vous pouvez charger un module de blocage de ptrace dans le noyau qui désactivera cet appel système particulier; il est clair que cela vous empêche également d'utiliser ptrace pour le débogage.

dr_
la source
Tout comme cette autre réponse , celle-ci est également obsolète - comme expliqué ici, vous n'avez plus besoin de suivre un processus pour lire ou écrire dans son /proc/PID/mem. J'espère que vous êtes moins réfractaire que l'autre personne à mettre à jour et à corriger votre réponse, au lieu de perpétuer les mythes et la désinformation.
pizdelect
... ce qui est le cas, cela peut avoir des conséquences, car les gens peuvent supposer à tort qu'en traçant un processus, ils peuvent empêcher d'autres processus de lire sa mémoire.
pizdelect
@pizdelect Merci pour le lien. Ce serait bien si vous ajoutez le contenu comme une autre réponse.
dr_
Non, je ne vais pas ajouter une autre réponse. Je m'attends à ce que vous répariez le vôtre.
pizdelect
N'oubliez pas que vous pouvez également modifier les réponses d'autres personnes. Vous semblez avoir une meilleure connaissance que moi de ce sujet particulier, vous êtes donc les bienvenus.
dr_
1

Lorsque vous parvenez à bloquer un processus, vous pouvez provoquer l'insertion de données dans la mémoire par le processus. Une façon très populaire de procéder consiste à utiliser des dépassements de tampon .

Comment cela marche-t-il ? Vous savez, par exemple, qu'un processus écoute sur le port x et a un tampon pour une certaine fonction qui est, disons, de 15 octets. Vous appelez cette fonction avec 15 octets de données + n octets (votre code à exécuter). Si le programme ne valide pas correctement les données, il écrasera la mémoire adjacente avec votre code et ainsi, le code vivra en mémoire. Si vous pouvez faire exécuter ce code, vous êtes propriétaire du système. Il existe des limitations, par exemple, un processus ne peut pas écrire dans la mémoire en dehors de son espace alloué .

Il existe une longue liste de vulnérabilités sur tous les systèmes d'exploitation où les dépassements de tampon permettent aux crackers d'injecter des données dans la mémoire de la cible.

la carpe
la source