3 votes

Segfaults dans CentOS (grep, coreutils, etc)

On m'a passé une boîte aujourd'hui qui ne revenait pas d'un redémarrage. Après avoir travaillé un peu avec des disques de secours, je suis arrivé à la situation dans laquelle je suis maintenant bloqué. En fait, divers outils de bas niveau ( ls, grep, etc. ) sont en défaut de fonctionnement - ce qui est corrigé par une réinstallation, mais le problème persiste.

L'un des différents programmes de ségrégation est grep. Un exemple au hasard :

$ grep eth0 /etc/sysconfig/network-scripts/*
Segmentation fault

Cependant, une réinstallation du paquet grep résout le problème :

$ yum reinstall grep
Loaded plugins: fastestmirror
Setting up Reinstall Process
Loading mirror speeds from cached hostfile
[...]
Installed:
  grep.i386 0:2.5.1-55.el5                                                                                                                                                                                                        

Complete!

$ grep eth0 /etc/sysconfig/network-scripts/*
/etc/sysconfig/network-scripts/ifcfg-eth0:DEVICE=eth0
[...]

Mais quand la boîte redémarre, tout est à nouveau cassé ! Je peux même reproduire ce phénomène en changeant simplement de niveau d'exécution.

$ init 4
$ grep eth0 /etc/sysconfig/network-scripts/*
Segmentation fault

Je peux répéter mon correctif de réinstallation, mais ensuite passer de bhack à runlevels 5 et cela se reproduit.

J'ai inclus une copie d'un strace pour la commande grep ci-dessous, mais comme je l'ai dit, cela affecte aussi "ls", que j'ai également corrigé avec une réinstallation de coreutils.

execve("//bin/grep", ["grep", "eth0", "/etc/sysconfig/network-scripts/i", "/etc/sysconfig/network-scripts/i", "/etc/sysconfig/network-scripts/i", "/etc/sysconfig/network-scripts/i", "/etc/sysconfig/network-scripts/i", "/etc/sysconfig/network-scripts/i", "/etc/sysconfig/network-scripts/i", "/etc/sysconfig/network-scripts/i", "/etc/sysconfig/network-scripts/i", "/etc/sysconfig/network-scripts/i", "/etc/sysconfig/network-scripts/i", "/etc/sysconfig/network-scripts/i", "/etc/sysconfig/network-scripts/i", "/etc/sysconfig/network-scripts/i", ...], [/* 24 vars */]) = 0
brk(0)                                  = 0x9bd0000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=29251, ...}) = 0
mmap2(NULL, 29251, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7fe2000
close(3)                                = 0
open("/lib/libpcre.so.0", O_RDONLY)     = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\20\17\0\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=117448, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fe1000
mmap2(NULL, 116176, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x1d3000
mmap2(0x1ef000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c) = 0x1ef000
close(3)                                = 0
open("/lib/libc.so.6", O_RDONLY)        = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\340_\1\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1686224, ...}) = 0
mmap2(NULL, 1410500, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x8aa000
mmap2(0x9fd000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x152) = 0x9fd000
mmap2(0xa00000, 9668, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xa00000
close(3)                                = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fe0000
set_thread_area({entry_number:-1 -> 6, base_addr:0xb7fe06c0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
mprotect(0x9fd000, 8192, PROT_READ)     = 0
mprotect(0x818000, 4096, PROT_READ)     = 0
munmap(0xb7fe2000, 29251)               = 0
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
+++ killed by SIGSEGV +++

Quelqu'un a une idée intelligente de ce qui se passe ? Je n'ai pas l'intention de faire confiance à cette boîte (matériel ou logiciel), mais je veux aller au fond des choses.

4voto

futureelite7 Points 6247

Comme vous l'avez dit en commentaire si votre serveur a été compromis, vous avez certainement un rootkit installé. S'il revient après un redémarrage, c'est qu'il est méchant (avec de multiples stratégies pour se réinstaller à différents endroits, des bibliothèques personnalisées enveloppant les vraies et un module noyau interceptant les appels système afin de se cacher).

Dans ce cas, les erreurs de segmentation sont causées par les bibliothèques personnalisées du rootkit qui ne sont pas ABI-compatibles avec les bibliothèques de votre distribution.

Pour résoudre ce problème, la seule vraie solution est de réinstaller à partir de zéro et de restaurer soigneusement vos données.

0voto

madcapnmckay Points 8477

Vous avez soit une corruption substantielle du disque, soit une mauvaise mémoire dans ce système, et je parie sur la seconde. Lancez les diagnostics matériels appropriés pour les deux, et commencez à tester en retirant un DIMM à la fois.

0voto

Tieme Points 101

Je soupçonne que le problème est dû à la corruption du système de fichiers en raison d'un mauvais disque/ contrôleur RAID. Je vérifierais la sortie SMART pour vérifier la santé du/des disque(s). Ensuite, j'exécuterais memtest pour exclure tout problème avec la RAM. Enfin, je ferais un test de stress sur les disques.

Je doute fortement que ce soit un rootkit.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X