Skip navigation.

devloop :: blog

Blog sur la sécurité informatique, la programmation, Linux et le Web

Posts tagged with "kernel"

Afficher la "kill" liste de votre système Linux

, , ,

Pour revenir au billet précédent et aux fichiers /proc/[pid]/oom_score et /proc/[pid]/oom_adj...

La page de manuel de proc(5) nous dis informe de différents points intéressants :
  • oom_adj contient une valeur numérique située entre -17 et 15. Plus la valeur est grande (et positive) plus le processus a des chances d'être candidat à un "suicide" décidé par le kernel.
  • On peut jouer sur cette valeur, par exemple en faisant un echo -5 > /proc/[pid]/oom_adj
  • oom_score contient une valeur numérique bien plus grande qui est calculée à partir de différents éléments comme l'utilisation CPU du processus, sa priorité, s'il tourne avec des privilèges etc. Le résultat est ensuite décalée à l'aide de la valeur oom_adj (bit shift). Cette opération est définie par la fonction badness
  • la valeur -17 dans oom_adj est particulière et permet de marquer le processus comme indestructible
  • Tout ce mécanisme peut être activé ou désactivé par /proc/sys/vm/panic_on_oom. Si ce fichier contient "1" alors le système fait un kernel panic en cas de débordement de mémoire. S'il est à 0, oom-killer est appelé à la rescousse.


Pour afficher la liste des processus par ordre croissant de risque de se faire tuer, j'ai créé un script python : oom_score.py

Il donne un résultat de ce style :
oom_score pid   process name                   oom_adj                              
        0  3593 /sbin/auditd -s disable            -17                              
        0   665 /sbin/udevd --daemon               -17                              
       13  2610 /sbin/acpid                          0                              
       15  3622 /usr/sbin/avahi-dnsconfd -D          0
...
    34560  5187 /usr/bin/krunner                     0
    83495  5108 kdeinit4: kdeinit4 Running...        0
    90882     1 init [5]                             0
   103294  5614 /bin/sh /usr/bin/firefox             0

Gare à toi Firefox !! p: Par contre qu'init soit en seconde position, ça fait plus peur :D

Quelqu'un a fait un script bash ici mais il donne moins d'informations (uniquement oom_score et nom du process)

Plantages sous Linux

, , , ...

J'ai beau aimer Linux penguin et dire régulièrement du mal de Windows (la gestion des fenêtres est tout simplement exaspérante face à un bon KDE), j'admets tout de même volontier que Linux est aussi sujet à des plantages.
MAIS quand ça survient sous Linux, on se dit qu'il y a une bonne raison et que surtout il y a une façon de trouver quelle en est la cause et d'agir pour que ça ne se reproduise plus. C'est tout l'avantage d'un système open-source face à un système propriétaire où l'on peut juste... subir et espérer que les devs découvrent puis décident finalement de corriger le problème :frown:

Je ne sais plus exactement depuis combien de temps j'ai ce souci mais ça fait un bail... en fait probablement depuis que j'ai Shirley :eyes:
Le symptôme est toujours le même : tout d'un coup le disque dur se met à gratter et les commandes ne répondent plus. Seul le curseur de la souris est d'accord pour réagir (par intermittence). Si on est suffisamment rapide (c'est rare), on peut parvenir à fermer les applications et éviter le pire.
Le pire (qui est tout de même loin d'être l'enfer mais très énervant) c'est que le système reste inutilisable et gratte pendant un bon moment. Ca peut durer jusqu'à une demi-heure dans mon cas.
Ce comportement est typique d'un programme quelconque qui explose son utilisation mémoire et, une fois la RAM complètement utilisée, s'attaque à la SWAP (d'où l'utilisation intensive du disque dur)

Si on est patient, tout se termine "bien". Le kernel s'est chargé de tuer toutes applications graphiques, le WM et Xorg inclus (bref la crémerie avec la crémière et ses yaourts) et on est bon pour se relogger.
Quelques minutes plus tôt on s'acharnait à faire des Ctrl+Alt+F1 dans l'espoir de pouvoir régler nous même le problème.

Il est très difficile de déterminer quel programme est à l'origine du plantage... surtout quand on a toujours les même programmes ouverts p:
Longtemps j'ai soupçonné le "operapluginwrap" qui est le programme qui gère les plugins sous Opera. Son utilisation du CPU grimpe en flèche dès que l'on tombe sur du Flash (d'où l'utilité d'un FlashBlocker pour limiter les dégats).

Au même titre, j'ai soupçonné Vuze (client BitTorrent développé en Java), ce qui m'a poussé à passer à Deluge récemment.
Mais si on suit la logique, le souci pourrait aussi bien être lié à Firefox (souvent ouvert aussi) ou des daemons (mysqld, apache, tor...)

Malgré le passage à Deluge, le souci est réapparu. Je suis donc allé fouiller dans les logs :sherlock:
La dernière fois j'avais vu des appels à un programme nommé "kwin_killer_helper", sorte de soupape de sécurité de KDE qui tente de fermer des programmes quand ça part en sucettes... seulement son action a l'air peut efficace est surtout l'application n'est pas configurable :frown:

Cette fois j'ai remarqué des références à "oom-killer". Il agit de la même façon que kwin_killer_helper mais au niveau du noyau.
Le problème c'est qu'il semble reporter seulement le programme qui fait déborder le vase or ce n'est pas forcément celui qui s'est chargé de le remplir à 99%... toutefois en faisant des statistiques, on peut en déduire les programmes qui sont plus gourmants que les autres.

Ainsi un grep sur /var/log/messages me donne 9 "java invoked oom-killer", 1 pour opera, 1 pour policykit-kde et le dernier en date pour klipper :eek:
Le bon côté c'est qu'en abandonnant Vuze le problème apparait moins souvent mais il reste toujours présent :frown:

Si je regarde dans les logs plus anciens (archivés par logrotate), on retrouve java mais sont aussi mis en cause hald-addon-stor et mysqld Homer: Doh!

Si on effectue des recherches sur Google, on retrouve tous un tas de programmes variés qui ont "invoqué" oom-killer dont certains sont réputés stables.
Le souci semble donc venir d'ailleurs.

Pour certains, le souci est lié à la taille de la SWAP... il faudrait qu'elle soit au moins de la taille de la RAM. Je ne dirais pas que je n'y crois pas une seconde... mais presque (va pour deux secondes d'incrédulité :rolleyes: )
Pour d'autres (et sans doute plus fiables) et ici, ce serait lié à l'utilisation d'un système 32bits avec une machine 64bits (ce qui est mon cas).
Je vais probablement suivre la seconde possibilité mais je ne compte pas réinstaller mon système pour le moment (j'attends la version 11.2 d'openSUSE) p:

Pour le moment j'ai vu ici que chaque processus a dans /proc/ des fichiers oom_adj et oom_score dont il serait peut-être bon de connaître l'utilité :confused:
Et enfin un comique a enregistré le domaine oomkill.net sur lequel ont peut lire le boût de kernel correspondant à ce tueur de gaspilleurs de mémoire (oom = "Out Of Memory") :ninja:

Surveiller les connexions avec auditd

, , , ...

auditd est un démon qui permet de surveiller ce qu'il se passe au niveau du noyau Linux 2.6.
Une fois activé il se met en écoute de nouvelles règles de surveillance et enregistre dans un fichier de journalisation (/var/log/audit/audit.log) tous les événements correspondants aux règles définies.

Le démon auditd et les programmes clients qui l'accompagnent (auditctl, ausearch, aureport) peuvent être utilisés à différentes fins, par exemple pour surveiller les accès effectués sur des fichiers sensibles.

Dans cet exemple, nous allons voir comment surveiller les connexions réseaux. Avec iptables nous pourrions logger les connexions entrantes et sortantes, malheureusement nous n'aurions pas les informations concernant le programme qui participe à ces connexions :frown:

Pour savoir si vous disposez d'auditd, le plus simple est encore de regarder s'il est présent parmis les processus en cours (commande ps aux). Si c'est le cas, cela ne signifie pas pour autant qu'il soit actif. Pour cela il faut lancer la commande :
# auditctl -s
AUDIT_STATUS: enabled=0 flag=1 pid=3670 rate_limit=0 backlog_limit=256 lost=0 backlog=0

Ici le démon n'est pas actif (enabled=0). Pour l'activer il faut tapper auditctl -e 1 (et "auditctl -e 0" quand vous souhaiterez le désactiver).
Si on relance auditctl -s, nous obtiendrons "enabled=1" :smile:

Afin de voir les logs défiler, je vous recommande d'exécuter un tail -f /var/log/audit/audit.log dans une console.
Informons maintenant auditd que nous souhaitons garder les connexions à l'oeil. L'option "-S" permet d'activer la surveillance sur un appel système. A tout hazard on tente la commande :
# auditctl -a exit,always -S connect
Syscall name unknown: connect

Et là... c'est le drame p: En réalité, il n'y a pas de syscall nommé "connect". Les différents syscalls réseau passent par "socketcall".
On utilisera alors la commande auditctl -a exit,always -S socketcall à la place.
Aucun message de confirmation n'apparait à l'exécution de la commande mais un message devrait apparaître dans le fichier de log et ils nous est possible de lister les règles avec auditctl :
# auditctl -l
LIST_RULES: exit,always syscall=socketcall

puisque tout est ok, on lance un netcat sur www.perdu.com (port 80) et là... tout va très vite !
Tout un tas de lignes ont fait leur apparition dans le fichier de log. Pour l'article, je n'ai gardé que celles qui m'intéresse à savoir :
type=SYSCALL msg=audit(1198689227.553:67): arch=40000003 syscall=102 success=yes exit=3 a0=1 a1=bfeaf4f0 a2=0 a3=0 items=0 ppid=6356 pid=6608 auid=4294967295 uid=1000 gid=100 euid=1000 suid=1000 fsuid=1000 egid=100 sgid=100 fsgid=100 tty=pts4 comm="netcat" exe="/usr/bin/netcat" key=(null)
type=SOCKETCALL msg=audit(1198689227.553:67): nargs=3 a0=2 a1=1 a2=6
type=SYSCALL msg=audit(1198689227.553:68): arch=40000003 syscall=102 success=yes exit=0 a0=e a1=bfeaf4f0 a2=0 a3=0 items=0 ppid=6356 pid=6608 auid=4294967295 uid=1000 gid=100 euid=1000 suid=1000 fsuid=1000 egid=100 sgid=100 fsgid=100 tty=pts4 comm="netcat" exe="/usr/bin/netcat" key=(null)
type=SOCKETCALL msg=audit(1198689227.553:68): nargs=5 a0=3 a1=1 a2=2 a3=bfeaf528 a4=4
type=SYSCALL msg=audit(1198689227.553:69): arch=40000003 syscall=102 success=yes exit=0 a0=3 a1=bfeaf4f0 a2=0 a3=0 items=0 ppid=6356 pid=6608 auid=4294967295 uid=1000 gid=100 euid=1000 suid=1000 fsuid=1000 egid=100 sgid=100 fsgid=100 tty=pts4 comm="netcat" exe="/usr/bin/netcat" key=(null) type=SOCKADDR msg=audit(1198689227.553:69): saddr=0200005052A5B0910000000000000000
type=SOCKETCALL msg=audit(1198689227.553:69): nargs=3 a0=3 a1=804f020 a2=10

Je vous l'accorde, ce n'est par très parlant :frown: On va décrypter ça ;-)
Les lignes SYSCALL, comme leur nom l'indique, nous renseigne sur l'appel système qui a été détecté ainsi que le programme à son origine et les droits qu'il possède à ce moment.
Comme expliqué ici ou , on apprend que socketcall est bien le syscall numéro 102 (ou 0x66 en hexadécimal).
Il prend comme argument le nom de la fonction réseau à utiliser, chacune ayant une valeur prédéfinie:
#define SYS_SOCKET      1
#define SYS_BIND        2
#define SYS_CONNECT     3
#define SYS_LISTEN      4
#define SYS_ACCEPT      5
#define SYS_GETSOCKNAME 6
#define SYS_GETPEERNAME 7
#define SYS_SOCKETPAIR  8
#define SYS_SEND        9
#define SYS_RECV        10
#define SYS_SENDTO      11
#define SYS_RECVFROM    12
#define SYS_SHUTDOWN    13
#define SYS_SETSOCKOPT  14
#define SYS_GETSOCKOPT  15
#define SYS_SENDMSG     16
#define SYS_RECVMSG     17

De cette façon, si on reprend notre première ligne :

type=SYSCALL msg=audit(1198689227.553:67): arch=40000003 syscall=102 success=yes exit=3 a0=1 a1=bfeaf4f0 a2=0 a3=0


On en déduit qu'il s'agit d'un appel à la fonction socket() car a0=1=SYS_SOCKET. En lancant un strace parallèlement, on voit que socket() a été utilisé de cette manière :
socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3

Sachant que PF_INET = 2, SOCK_STREAM = 1 et que IPPROTO_TCP = 6, on n'est peu surpris de retrouver ces valeurs dans la ligne suivante :
type=SOCKETCALL msg=audit(1198689227.553:67): nargs=3 a0=2 a1=1 a2=6

La fonction suivante est un setsockopt() : syscall=102 a0=e (14 en décimal) appelé de cette façon :
setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0

La encore on retrouve les bonnes valeurs dans les messages d'auditd :smile:
Voilà enfin la dernière partie qui nous intéresse et qui correspond au connect suivant :
connect(3, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("82.165.176.145")}, 16) = 0

type=SYSCALL msg=audit(1198689227.553:69): arch=40000003 syscall=102 success=yes exit=0 a0=3...
type=SOCKADDR msg=audit(1198689227.553:69): saddr=0200005052A5B0910000000000000000
type=SOCKETCALL msg=audit(1198689227.553:69): nargs=3 a0=3 a1=804f020 a2=10

La ligne SOCKADDR correspond à une structure sockaddr (le second argument du connect()) comme commenté ici. Cette structure est la suivante :
 struc sockaddr_in
         sin_family:     resw    1       ; protocol family
         sin_port:       resw    1       ; port
         sin_addr:       resd    1       ; struct sin_addr.s_addr
         sin_zero:       resd    2       ; padding
 endstruc

Le "saddr" se décompose donc en :
  • 0x02 : AF_INET
  • 0x50 : le port après un htons(), ici le port 80
  • 52A5B091 : l'adresse IP est hexadécimal, soit 180.249.41.240 (www.perdu.com)

Nous sommes finalement parvenu à déchiffrer une connexion dans les logs d'auditd :smile:

Quelques blogs qui pourraient vous intéresser...

, , , ...

... si vous vous intéressez à la sécurité informatique et tout ce qui transite autour.

Général
SecuriTeam blogs
ARBOR SERT (beaucoup de bonnes surprises :smile: )
Security Samizdat (un tas de liens vers des trucs sympa... par contre fait ramer Opera :wait: )
Websense Security Labs Blog
Didier Stevens
Uwe Hermann | A slightly paranoid Debian developer (traite aussi de l'informatique en général)

Computer forensics
Windows Incident Response
Blog de Lexfo (principalement inforensique mais d'autres sujets sont aussi traités)
Le live forensique est un sport de combat comme un autre

Kernel, exploitation, programmation et ASM
SF-Freedom : Exploitation Technique and Information Security
Blog d'Ivanlef0u (pour les fanatiques de Windows)
gnurbs : In the name of zero (si tu aimes le langage assembleur tape dans tes mains)

Vulnérabilités web
ha.ckers : le blog de Rsnake

Malwares
F-Secure Weblog : News from the Lab
McAfee Avert Labs Blog
Symantec Security Response Weblog

Cyber : vie privée, surveillance, DRMs etc
Freedom to Tinker
Schneier on Security
La Sécurisphère

et puis bien sûr devloop :: blog :wink:

News from SCO's FUD : Priceless !

, , , ...

On a des nouvelles de l'affaire SCO contre tous.
Pour rappel, le groupe SCO avait accusé IBM d'avoir intégré illégalement du code lui appartenant dans le noyau Linux.
SCO a toujours défendu avoir des preuves de ce "vol de code" sans jamais donner les parties de codes mises en cause.
De son côté IBM accusait SCO d'avoir violé du code de Linux sous licence GPL.

En 2003, le président de SCO affirmait possèder "une montagne de preuves".

Seulement d'après la transcription d'une audition disponible sur le mystérieux site Groklaw, il semblerait que la montagne de preuve pèse ni plus ni moins... 326 lignes de codes !!

326 lignes, ça correspond environ à 1/5000ième d'un pourcent du kernel Linux... bref petzouille :D
Sans compter que sur ces 326 lignes, 121 correspondent à des #define, c'est à dire des déclarations de constantes ou éventuellement des déclarations de macros (donc des lignes universellement utilisées comme par exemple "#define PI 3.14159265")
Le reste des lignes concernerait des déclarations de structures, des prototypes de fonctions voire même des commentaires !
Bref une bonne partie des lignes concernées ne serait même pas du "vrai" code p:

Source : TheRegister : Only 326 lines of code said to be at issue in SCO-IBM flap

Des news en bazar

, , , ...

Une semaine (ou presque) sans billets (oups) même si certains sujets ont été assez actifs au niveau des commentaires.
J'ai pas mal taffé ce mois çi (malheureusement rien à voir avec l'informatique) et j'étais bien trop crevé pour faire quoi que ce soit, en plus j'étais pas dans ma blog mood, pas aware quoi :D

Comme d'habitude j'ai testé tout un tas de logiciels, pas mal de softs de stéganographie, des bons, des moins bons, des facilement compilables, d'autres impossibles à compiler (en fait pour ceux là les tests s'arrêtent avant d'avoir pû essayer le soft), open-source, closed-source, actifs, abandonnés, erreurs 404, host unreachable etc (oui j'ai fouillé).
Dans l'ensemble je cherchais un logiciel de stegano permettant de dissimuler quelques méga-octets dans un fichier et qui soit open-source et fonctionnant sous Linux (encore mieux s'il fonctionne aussi sous Windows). Mais peu de surprises : la quasi-totalité ne permettent de cacher au maximum que quelques kilo-octets.

J'ai donc décidé de voir plus gros au niveau du format conteneur. J'ai découvert isosteg qui comme son nom l'indique permet de cacher des données dans une image ISO.
L'exemple donné sur le site d'isosteg semblait prometteur : pouvoir dissimuler 3Mo dans une image iso de 674Mo, super !
Seulement cet exemple est bien optimiste par rapport aux tests que j'ai effectué nervous :

ubuntu-6.06-desktop-i386.iso (Ubuntu Live CD) 698Mo -> 292Ko
grml_0.8.iso (le dernier GRML) 697Mo -> 40Ko
trustix-2.2-200608031721.i586.iso (Trustix Sunchild) 444Mo -> 117Ko
MomongaLinux3-i686-dvd.iso (Momonga Linux... que je compte tester un jour) 3.6Go -> 127Ko

Visiblement il faut de sacrées chances pour tomber sur le bon ISO :yikes:

J'ai essayé le système d'exploitation Syllable (par VMWare) sur lequel je n'ai rien à redire : tout semble fonctionner, ensuite c'est les goûts et les couleurs p:

Je viens tout juste d'essayer SIM-IM (SIM Instant Messenger), un logiciel de messagerie instantané multi-protocole qui n'a pas grand chose à envier à Gaim. Ajouté à ça un module permet d'encrypter au vol les conversations avec GPG :up:

Il existe une version open-source de ce que fait spammimic, développé par un membre de CyberArmy et téléchargeable ici. Il s'agit d'un CGI en perl. Pour des raisons qui m'échappent encore je n'ai pas réussi à le faire fonctionner sous Apache.

J'ai de la nouvelle lecture. il me faudra beaucoup de temps avant que j'arrive à lire les (presque) 1000 pages du livre, déjà que je n'ai toujours pas fini le livre de Bruce. Je suis seulement au tout début de ce livre sur Linux mais il semble très bien écrit et assez accessible (nécessite tout de même d'être un utilisateur de Linux et d'avoir des bonnes connaissances en C)

Google a soufflé ses 8 bougies il y a quelques jours. Les projets de la société laissent parfois songeur, la vie privée des internautes est de plus en plus couverte par ce géant de l'Internet. Ce n'est pas une mauvaise chose de bloquer les cookies venant des moteurs de recherche.

L'affaire AOL est un bon exemple des dérives provoquées par la surveillance continue des Internautes. Le site Futura-Sciences a écrit un très bon article sur cette histoire.


Je farfouillais dans les bacs à disques et j'ai eu l'immense plaisir de découvrir un nouvel album des Stranglers, que je croyais disparu depuis belle lurette (en fait ils ont sorti un album en 2004 après 6 ans d'absence).
Les Stranglers ont marqué à tout jamais l'histoire du Punk. Les gens connaissent généralement peu ce style musical qui offre en réalité une palette assez large, réduisant le punk au hardcore, au punk rock. La confusion a été totale à une époque où les mauvaises langues disaient que le punk était mort. En fait il a simplement explosé en autant de dérivés que la Oï, le punk-hardcore, la new wave, le grunge et que sais-je encore p:
Les Stranglers ne font pas du punk harcore, ils ont un côté pop bien à eu qui leur a permis de toucher un public bien plus large et de faire quelques tubes (vous avez sans doute déjà entendu Always The Sun). Contrairement aux Rezillos, leur côté pop est loin d'être festif. Il y a dans leur musique quelque chose de dérangeant (et dérangé), une touche vraiment artistique, ce même art que l'on retrouve dans des galeries, en face de tableaux étranges qui provoquent des émotions sans que l'on sache pourquoi.
Leur chansons prennent parfois une tournure psychédélique, utilisant des sonorités étranges, la musique des Stranglers atteint directement le cerveau. En fait il n'y a pas grand chose de plus fort qu'une envie de Stranglers :D

Suite XVI, leur nouvel album, s'inscrit complétement dans la continuité. Les membres du groupe ont changé entre temps, le chanteur n'est plus le même pourtant... tout est là ! Et pire encore, tout est toujours aussi bon :yes:
Quand j'ai voulu écouter Suite XVI, j'ai eu peur que le CD soit protégé par un quelconque procédé anti-copie, rendant la lecture difficile sur certains lecteurs. En réalité il n'en est rien. Mon lecteur CD a simplement rendu l'âme à la seule lecture des premières mesures de l'album. La dose était trop forte semble-t-il :D

Je vous recommande vivement cet album, ou alors Peaches - The Very Best Of si vous désirez dévouvrir les anciennes chansons du groupe.
Un extrait du nouvel album est un écoute sur cette page :sing:

Retour à l'informatique... J'ai remarqué par son site que rgod utilise Wapiti pour trouver des vulnérabilités dans les logiciels qu'il audite. Ca fait plaisir :smile:
Je compte toujours continuer le développement de Wapiti, j'attends juste d'avoir un peu de temps et l'impulsion nécessaire. J'ai aussi travaillé sur un projet de forum en PHP il y a quelques temps (j'ai fait les 90% du travail en un temps record) et je n'ai pas repris depuis pour les mêmes raisons. Mais j'y pense.

Première rencontre avec Minix 3

, , , ...

Minix est un système d'exploitation open-source créé par Andrew S. Tanenbaum. Ce dernier est également connu pour être l'auteur du célèbre livre Operating Systems Design and Implementation qui traite de la conception des systèmes d'exploitation.

Minix a été la source d'inspiration de Linus Torvalds pour le développement de Linux. Pour tout dire, Linux a été développé sous Minix p:
Malgré ça, Linux n'est pas une copie de Minix, et ils se basent sur des principes de kernel bien différents : Le noyau Linux est dis monolitique alors que celui de Minix est un microkernel.

Ces divergences ont été la cause d'une discussion enflammée il y a bien longtemps. Aujourd'hui force est de constater que pour un système obsolète, Linux a pris une sacrée ampleur :D

Quoiqu'il en soit, Minix 3 est disponible depuis octobre 2005 et ce serait dommage de passer à côté de ce système extrèmement fiable et très léger (il peut fonctionner sur des systèmes ayant 4Mo de RAM !)

Pour m'éviter la procédure d'installation j'ai récupéré une image VMware de Minix et le VMware Player, tous deux disponibles gratuitement.

Read more...

Debian piraté

, , , ...

La nouvelle vient de tomber : l'un des serveurs principaux de Debian a été compromis.
Baptisé gluck, ce serveur est utilisé par les développeurs Debian et propose différents services comme "cvs", "ports" et "releases"... Dès la détection de la compromission, le serveur a été mis hors ligne afin d'effectuer une analyse forensics.

L'apparition récente d'une faille dans le kernel 2.6 permettant de passer root semblait le scénario le plus probable pour ce piratage.

Cette hypothèse s'est avérée vraie après l'analyse de gluck, comme l'explique Debian dans un communiqué.

De toute évidence les pirates devaient posséder un accès à la machine depuis quelques temps et attendaient seulement la première vulnérabilité importante leur permettant de prendre contrôle du système.
Heureusement l'intrusion a été très vite détectée et les pirates n'ont pas eu le temps de causer trop de dégâts... seule une version backdoorée de la commande ping a été trouvée.

Pour info, une intrusion similaire avait eu lieu en novembre 2003. A l'époque les pirates avaient modifié les sources du kernel pour y ajouter une backdoor mais grâce aux yeux attentifs de Linus Torvalds, on avait pû éviter le pire penguin

Source : Zone-H.org

Faille de sécurité dans le Kernel 2.6

, , , ...

Toute faille de sécurité dans le noyau Linux est à prendre au sérieux, en particulier si elles peuvent permettre une élévation des privilèges.
La faille "PRCTL Core Dump Handling" découverte par RedHat et patchée avec la version 2.6.17.4 du kernel est l'une de ces failles et est à prendre au sérieux, en particulier depuis la publication d'un exploit.

Cette faille n'est pas bien difficile à comprendre : le kernel autorise la génération de fichiers core dans des répertoires où un utilisateur n'a pas les droits d'écriture.

Un fichier core est une image de la mémoire d'un processus qui est généré lorsqu'un programme plante (erreur de segmentation). Ces fichiers sont générés à des fins de débogage et permettent à un programmeur de retrouver la cause du plantage.
Ces fichiers ne sont pas générés automatiquement, c'est l'utilisateur qui doit activer leur génération, par exemple en utilisant la commande ulimit (man bash)

Le PoC qui a été rendu public n'est pas difficile à comprendre.
Il commence par déclarer une chaîne de caractères qui contient une entrée pour le programme cron. Ce dernier (cron) tourne en fond sur le système et lance régulièrement des tâches planifiées (par exemple updatedb, mandb, clamav etc).
La chaîne de caractères est la suivante :
* * * * *   root   cp /bin/sh /tmp/sh ; chown root /tmp/sh ; chmod 4755 /tmp/sh ; rm -f /etc/cron.d/core

Son objectif est de lancer dans le plus petit intervalle de temps possible pour cron (apparemment 1 minute), la copie d'un shell avec le bit setuid puis d'effacer le fichier /etc/cron.d/core.

L'exploit change ensuite les règles de génération des fichiers core pour leur permettre une taille infinie (ça correspond à un "ulimit -c unlimited")
Il effectue ensuite un fork() pour créer un processus fils. Ce processus change de répertoire courant en se plaçant dans /etc/cron.d/
Le processus père kill() enfin le processus fils en lui envoyant le signal SIGSEGV (erreur de segmentation) ce qui provoque la génération du fichier core.

Les droits sur le répertoire /etc/cron.d/ sont tels qu'un utilisateur non privilégié ne peut normalement pas écrire dedans :
drwxr-xr-x  2 root root 48 2005-09-09 18:27 /etc/cron.d

Mais à cause d'une erreur dans le code du kernel, un fichier est bien généré :
devloop $ ls -l /etc/cron.d
total 64
-rw-------  1 root users 143360 2006-07-12 14:59 core


Ce fichier core est un fichier binaire mais cron va le lire comme s'il s'agissait d'un fichier texte et va finir par tomber sur la chaîne de caractère que l'on a vu tout à l'heure.
Les commandes sont alors exécutées avec les droits de l'utilisateur root, le système est compromis.
L'exploit public n'est pas tout à fait utilisable puisque bash ne fait pas appel à la fonction système setuid() mais les modifications à effectuer sont à la portée de tous.

Pour se protéger de cette faille le plus efficace est de mettre son kernel à jour dès que possible.
Un correctif (très bête il faut l'avouer) serait de rendre le dossier /etc/cron.d non-exécutable pour les utilisateurs non privilégiés (chmod 744 /etc/cron.d en tant que root) ce qui empècherait le processus fils de faire un chdir pour ce répertoire. Ca bloquera un bon nombre de scripts kiddies mais ça ne corrige pas la faille.

Bonne mise à jour à tous penguin

Mise à jour du kernel sous Slackware

, , , ...

Je viens de faire avec succès mon upgrade de kernel de la version 2.4.29 à la version 2.4.31 sous Slackware.
Pour mettre votre kernel à jour vous devez récupérer plusieurs paquets sur le ftp officiel ou un miroir officiel comme celui-ci :
http://distro.ibiblio.org/pub/linux/distributions/slackware/slackware-current/slackware/

Vous devez télécharger :
- le nouveau kernel : kernel-ide-2.4.31-i486-1.tgz
- les modules pour ce kernel : kernel-modules-2.4.31-i486-1.tgz
- la dernière version de mkinitrd : mkinitrd-1.0.1-i486-3.tgz
- les sources du kernel : kernel-source-2.4.31-noarch-1.tgz
- les headers du kernel : kernel-headers-2.4.31-i386-1.tgz
- les drivers ALSA : alsa-driver-1.0.9b_2.4.31-i486-1.tgz

Normalement seuls les trois premiers paquets sont nécessaires et devraient suffire pour un système de base (une machine en mode console par exemple). Les paquets restant vous serviront à installer les drivers pour votre carte graphique et avoir le son (et oui Alsa ce n'est pas seulement pour faire des gateaux :wink: )

Les instructions à suivre se trouvent globalement dans le fichier "/boot/README.initrd" de votre Slackware.
Une fois les paquets téléchargés, installez-les avec installpkg. Si vous jetez un coup d'oeil au répertoire /boot vous vous appercevrez que l'installation du nouveau noyau a modifié quelques liens symboliques... Par exemple le fichier vmlinuz qui pointait vers vmlinuz-ide-2.4.29 pointe maintenant vers vmlinuz-ide-2.4.31. Bref l'installation a fait de votre nouveau noyau le noyau par défaut...
Mais attention !! On n'a pas encore fini ! On doit créer le fichier initrd.gz qui se chargera du chargement de ce nouveau noyau.
Placez vous dans /boot...
Si comme moi vous avez opté pour un système de fichier reiserfs, tappez :
mkinitrd -c -k 2.4.31  -m reiserfs

pour un système ext3 ce sera plutôt :
mkinitrd -c -k 2.4.31 -m jbd:ext3 -f ext3 -r /dev/hdXY

(remplacez "/dev/hdXY" par votre partition racine)

Dernière étape : modifier le fichier de configuration de LILO pour avoir le choix entre les deux kernels au démarrage (très pratique si on a fait une erreur d'installation).
Placez-vous à la fin de votre fichier /etc/lilo.conf avec votre éditeur de texte préféré (il faut juste qu'il enregistre en texte pûr).
Vous devriez voir quelque chose comme ça :
image = /boot/vmlinuz
  root = /dev/hda1
  label = Linux
  read-only

Nous allons ajouter le nouveau kernel et changer la location (la ligne "image") de l'ancien kernel... puis tant qu'à faire modifier aussi le texte qui désignera le kernel (la ligne "label")
image = [B]/boot/vmlinuz-ide-2.4.29[/B]
  root = /dev/hda1
  label = [B]Slackware-2.4.29[/B]
  read-only
[B]image = /boot/vmlinuz-ide-2.4.31
  initrd = /boot/initrd.gz
  root = /dev/hda1
  label = Slackware-2.4.31
  read-only[/B]

On enregistre et on fait un "lilo -v" qui nous informe que les labels utilisés sont trop long :frown:
On modifie simplement en :
image = /boot/vmlinuz-ide-2.4.29
  root = /dev/hda1
  label = Slack-2.4.29
  read-only
image = /boot/vmlinuz-ide-2.4.31
  initrd = /boot/initrd.gz
  root = /dev/hda1
  label = Slack-2.4.31
  read-only

On relance... et l'affaire est dans le sac :up:

Attention à chaque fois vous devez penser à modifier "/dev/hda1" par votre partition racine... sans cela l'ordinateur ne parviendra pas à charger le noyau :down:
Dernière étape : rebooter en espérant que vous n'ayez pas fait d'erreur... Si c'est le cas vous avez toujours l'ancien noyau pour résoudre le problème :wink:
Vous aurez probablement à réinstaller les drivers de votre carte graphique pour ce nouveau kernel.