Théorie - Linux Attitude Skip to content

Linux Attitude

Le libre est un état d'esprit

Archive

Tag: Théorie

Niveau :      
Résumé : /dev/random /dev/urandom

Quelle différence y a-t-il entre /dev/random et /dev/urandom ? Et d'abord à quoi servent-il ?

Aléatoire

Qu'est-ce qu'un nombre aléatoire ? C'est un nombre faisant partie d'une série dont on ne peut pas prédire le prochain à partir des nombres précédents de la série.

Il existe de nombreuses méthodes pour créer des nombres aléatoires. Je vous donne la plus mauvaise : rand : i -> 0

Mais il existe aussi des suites moins prévisibles, par exemple prendre le dernier chiffre d'une opération récursive produisant de grands nombres. Voire complètement imprévisible comme utiliser la mesure d'un bruit blanc.

Il existe donc plusieurs niveaux d'"aléatoirité" ou de "prévisibilité". Un bon générateur qui peut par exemple être utilisé en cryptographie est en pratique soit un générateur matériel, soit un générateur basé sur un état interne et une fonction de hachage forte.

Les générateurs logiciels sont appelés PRNG (pseudo random number generator). Puisqu'un tel algorithme est déterministe, il faut l'initialiser avec des valeurs vraiment aléatoires pour éviter qu'on puis en deviner la sortie en devinant comment il a été initialisé.

Entropie

Sous linux il y a deux sources de nombres aléatoires, /dev/random et /dev/urandom.

La première utilise uniquement l'entropie disponible pour fournir des nombres aléatoires et le second est un générateur pseudo aléatoire initialisé avec cette entropie.

Mais qu'est-ce que l'entropie ?


continue reading...

Niveau :      
Résumé :

Maintenant que nous connaissons le processus de boot, si on examinait ce processus d'un point de vue de la sécurité !

Lorsqu'on parle de sécurité, il faut d'abord savoir dans quel cas on se positionne et de quoi on cherche à se prémunir. Ici, je considère que le système lui-même est sécurisé. Je suppose que l'attaquant est devant la machine et cherche un accès root.

On considère que chaque élément est sécurisé pour ce qui est de ses propres fonctionnalités, ce qui veut dire que si le bootloader est protégé par mot de passe, il n'y a pas de faille dans le bootloader lui-même permettant d'outrepasser ce mot de passe. Nous nous attacherons donc à chercher ce qui peut être détourné dans le flux d'exécution en entrée et en sortie de chaque élément.

Je vais commencer par la fin, du plus facile au plus difficile.

rc

Rc est lancé par init et ne prend ses paramètres que de init. Ceux-ci sont fixés en dur dans /etc/inittab. Son démarrage ne peut donc être détourné que d'une façon : par modification du contenu du disque. GoTo partition /

Parmi ces paramètres il y a le paramètre 1 qui lance rc dans le runlevel 1, ce qui dans la plupart des cas se termine par un sulogin. Ouf on est protégé par le mot de passe root.

Mais vérifiez bien, dans certains cas il se termine par un simple shell et donc réussir à passer un tel paramètre permettrait à l'attaquant un accès root à votre machine.

Pour passer 1 en paramètre GoTo init


continue reading...

Niveau :      
Résumé : bios, bootloader, noyau, init, rc

Je ne me souviens pas avoir fait un article complet sur le processus de boot. Il y en avait un partiel ici. En voici un !

BIOS

Le bios est le premier élément à être lancé, si on excepte l'appui sur le bouton ON et quelques autres détails. Celui-ci initialise le processeur ainsi qu'une partie du matériel, comme la carte vidéo ou le clavier.

Le bios est constitué d'une mémoire (rom ou flash) placée sur la carte mère.

Notez que quasiment tous les bios étant maintenant des flash il est possible de les mettre à jour, voire de les remplacer. Et justement un projet existe pour remplacer les bios propriétaires par des bios libres (comme Max): coreboot de son ancien nom linuxbios.

Le bios est configuré pour choisir un périphérique sur lequel booter. En général c'est le premier disque dur, mais cela peut aussi être une clé usb ou un lecteur disquette. Il est même possible de choisir au moment du boot.

Sur le périphérique en question, et à l'exception du lecteur CD qui a son protocole (el torito), le bios charge le premier secteur (512 octets), le met en RAM, et le lance.

Notez que le "BIOS" est spécifique aux PC, d'autres architectures ont des firmware EFI (Apple) ou des OpenBoot (Sun).

Bootloader

Dans ce premier secteur se trouve le bootloader (grub, lilo, silo, syslinux, mbr dos ...).

Le bootloader est découpé en plusieurs morceaux à cause de la limite des 512 octets. Sa première activité est de réussir à se charger complètement.

Celui de windows est assez simpliste, mais sous linux on en trouve avec plein de fonctionnalités sympa.

Une fois qu'il est prêt, il lit sa configuration puis choisit un périphérique et une partition où lire le noyau et éventuellement un initrd. Et enfin il passe la main au noyau en lui donnant quelques paramètres.


continue reading...

Niveau :      
Résumé : Internet

Maintenant qu'on connaît Internet, faisons le voyage du petit paquet.

Prélude

Un paquet n'apparait pas subitement du néant, il vient d'une information. Prenons par exemple un concert de Johnny transmis en streaming. L'information est le son, lui-même codé sous une certaine forme, nous avons par exemple le PCM, le MP3 etc. Pour ceux que ca intéresse, vous pouvez étudier les codecs ou déjà les transformées de Fourier. Jusque là ce que sont que des maths et de la physique.

Une fois ces données devenues des nombres, on les code comme des suites d'octets (8 bits, mais c'est historique, pourquoi pas 12 bits ou 18 bits ou même 7 ? mystère), on en fait des groupes de disons 1460 (totalement au hasard) qu'on met dans un paquet.

Ensuite le système ajoute des informations à ce paquet, par exemple un numéro d'ordre, la taille, l'adresse de l'émetteur, ou même des trucs qui ne servent à rien. L'information la plus importante est l'adresse de destination, en IPv4 elle est de la forme 1.2.3.4

Le premier problème est qu'il faut deviner cette adresse, le deuxième problème est que les barbus qui ont inventé ce protocole n'ont pas pensé qu'un jour les gens pourraient ne pas connaître l'adresse IP de la machine avec qui elles communiquent (qui ne connaît pas le numéro de téléphone des ses amis ?).

C'est pourquoi on a dû inventer un autre système qui permet d'obtenir cette information. Il tourne par dessus IP (ouf). Il s'agit du DNS, un annuaire qui permet non seulement de retrouver les adresses des machines depuis un nom lisible, mais aussi qui permet de déménager sans avoir à avertir tout son carnet d'adresse.

Il est bien dommage que ce système n'ait pas été intégré au protocole internet, ça nous aurait évité bien des soucis, mais bon il faut faire avec.

Ça y est, nous avons un paquet, il est rempli avec nos données et toutes les informations nécessaires, comme une enveloppe remplie et timbrée.


continue reading...

Niveau :      
Résumé : Internet

Qu'est-ce qu'Internet ? Cette question, dont la réponse parait évidente à beaucoup n'est pas facile à expliquer.

Internet expliqué à ma mère

Et plutôt que d'expliquer ce qu'est Internet, je vais plutôt expliquer comment marche Internet, car c'est son fonctionnement qui le définit.

Internet est un ensemble de réseaux (net) interconnectés (inter) grâce au protocole IP (internet protocol) aussi appelé IPv4. Ce protocole ne fait qu'une seule chose (et le fait bien :-), transférer des informations (mail, télévision ...) sous forme de petits paquet d'un appareil à un autre.

Internet est caractérisé par le fait que tout internet est accessible par tout internet. Si mon téléphone est connecté à internet alors internet est connecté à mon téléphone. S'il peut envoyer un paquet sur internet (par exemple 1s de musique), on peut aussi lui envoyer un paquet depuis internet.

Donc pour que mon appareil soit sur internet il lui faut seulement 2 choses :

  • parler le protocole IP
  • être connecté à internet

Internet ce n'est que ça. Mais il y a beaucoup d'autres choses à dire sur internet.

Internet expliqué à mon père

Sur internet on trouve énormément de choses. Malheureusement la plupart des gens n'en connaissent qu'une, le web, j'y reviendrai.

Sur internet il on trouve :

  • les emails : un email est découpé en petits paquets qui sont envoyés par IP à une autre machine qui va les stocker dans un coin en attendant que l'utilisateur vienne les chercher
  • le téléphone : les applications comme skype ou ekiga découpent votre voix en petits paquets et les envoient à un autre appareil sur internet
  • le peer to peer : ce sont les applications qui profitent le plus du concept d'internet, tout ce qu'on y trouve y est découpé en petits paquets qui sont transférés à de multiples personnes, ces personnes peuvent alors enregistrer ces paquets et les retransmettre à d'autres personnes, le nombre de personnes connectées en permanence fait que la plupart de ces paquets sont toujours disponibles
  • la messagerie instantanée : chaque message est mis dans un paquet et envoyé au destinataire

continue reading...

Niveau :      
Résumé : HTTP

HTTP règne en maître dans le monde des protocoles. C'est le plus utilisé et il n'est pas près de lâcher sa place. Je vais vous rappeler pourquoi.

Les protocoles

Dans le monde des protocoles il y a plusieurs couches.

Partons de la couche 3 : IP. Ce protocole est internet à lui tout seul. Personne ne parviendra à le détrôner si ce n'est lui-même (IPv6). Les autres protocoles de niveaux 3 viables visent des niches ou du à-peine-réseau (bluetooth ou usb collent aussi au modèle osi).

Sur la couche 4 on trouve TCP et UDP, qui ont très peu de concurrents. Il en existe, mais ils sont rares car difficiles à développer (il faut toucher au noyau sous linux si on veut faire propre et efficace).

Sur la couche 5 on trouve des milliers de protocoles, ils sont faciles à développer (en espace utilisateur) et donc courants. Et pourtant, on constate que sur internet un très petit nombre d'entre eux sont utilisés en masse : DNS, SMTP, HTTP. Les autres POP, IMAP, FTP, SSH ... sont utilisés mais commencent à se faire anecdotiques. Pourquoi ?

HTTP

HTTP est de loin de plus utilisé parce que de plus en plus de services se basent directement sur HTTP plutôt que d'inventer leur protocole. Et ils ont de très bonnes raisons pour ça :

  • ne pas réinventer la roue, des bibliothèques et des serveurs existent déjà
  • HTTP est autorisé à traverser quasiment tous les firewalls
  • il traverse le NAT
  • il est capable de supporter la déconnexion (il fonctionne en mode non connecté)
  • le SSL est déjà implémenté
  • l'authentification est déjà implémentée
  • il est possible de développer rapidement une preuve de concept avec apache et un langage de script
  • il utilise une API très simple : question -> réponse

Du coup on le retrouve dans :

  • les sites web (ouf)
  • le transfert de fichier
  • les systèmes de fichiers (webdav)
  • les appels de fonction à distance (XMLRPC)
  • la gestion de calendrier (caldav)
  • l'interconnexion de services (SOAP)
  • les applications distantes (ajax)
  • la communication instantanée (Jabber)
  • et j'en oublie ...

Mais pourquoi une telle domination sur tous les autres protocoles ? Ce n'est pas seulement grâce à l'omniprésence des navigateurs. Tout d'abord HTTP propose déjà un certain nombre de services (voir plus haut) qui ne sont plus à redévelopper. Mais surtout, regardons ses concurrents :

  • SMTP
  • DNS
  • RPC
  • SNMP
  • Et c'est tout !

Oui c'est tout, en effet, ce sont à peu près les seuls protocoles qui ont été prévus pour être extensibles et disposer d'une couche supérieure. Ils fonctionnent tous sur le système question réponse et laissent le soin à la couche du dessus d'interpréter le sens des questions et des réponses :

  • DNS : basé sur UDP, non fiable, limité en taille -> éliminé
  • SNMP : idem, même s'il existe une version TCP -> éliminé
  • RPC : format binaire difficile à mettre en place -> éliminé
  • SMTP : il est difficile de récupérer autre chose que des codes d'erreur en SMTP puisqu'il est fait pour l'envoi -> éliminé

Si on veut développer une nouvelle application qui communique par le réseau, on a le choix entre inventer un nouveau protocole ou simplement créer une sémantique de question / réponse au dessus de HTTP et profiter de tous ses avantages. Les rares cas où ce n'est pas possible :

  • besoin de données en temps réel (et encore le débit augmentant, HTTP peut faire RTSP du pauvre)
  • besoin de la notion d'évènement du serveur vers le client (et encore, certaines bidouilles HTTP laissant la connexion ouverte permettent ce comportement)
  • besoin de multicast ou de fonctionnalités encore exotiques aujourd'hui

Conclusion

Le HTTP c'est LE protocole, celui qui remplace le TCP d'hier. Le TCP n'est plus ce qu'il était, c'est à dire la couche sur laquelle on se base pour développer un nouveau protocole. Vous pouvez être sûr qu'il y a encore des milliers de protocoles à inventer, mais vous pouvez aussi être sur que la plupart d'entre eux se baseront sur HTTP. D'ailleurs celui-ci étant extensible, il est probable qu'il évolue un jour pour être un peu plus générique et apporter des réponses aux problèmes qui se posent dans certains cas comme les évènements.

On ne devrait plus parler de TCP/IP mais de HTTP/TCP/IP. Finalement, on se rapproche du modèle OSI.

Niveau :      
Résumé : crypto

Vocabulaire

Avant de pouvoir parler de sécurisation des communications, il faut avoir quelques bases en cryptographie. Commençons par le vocabulaire :

  • Coder : transformer une information en code (par exemple numériser une photo, écrire en morse ou en ASCII)
  • Chiffrer : transformer une information codée de façon à la rendre illisible à une autre personne que son destinataire
  • Déchiffrer : lire un document chiffré avec les informations nécessaires pour le faire
  • Décrypter : tenter de lire un document chiffré sans avoir la clé de déchiffrement
  • Signer : ajouter une information à un document prouvant qu'il a bien été écrit/lu par son auteur/lecteur sous cette forme et n'a pas été modifié
  • Empreinte : somme de contrôle d'un message (MD5, SHA) en cryptographie on cherche à faire en sorte qu'il soit impossible de créer un message ayant une empreinte donnée
  • Cryptanalyse : études des attaques permettant de décrypter un message ou de casser un chiffrement
  • Cryptographie : étude des systèmes de protection de messages
  • Cryptologie : ensemble de la cryptographie et de la cryptanalyse
  • Crypter : ce mot n'existe pas

Entropie

L'entropie est une mesure de la quantité d'information. Cette mesure n'est pas absolue, elle est relative à une quantité d'information possible.

Par exemple un octet est une valeur parmi 256. Un octet vraiment aléatoire (avec une répartition linéaire) a donc une entropie de 8. En pratique on ne cherche que rarement la valeur d'une entropie. On chercher plutôt à comparer obtenir des propriété sur l'entropie.

Par exemple prenons une suite de 5 octets. Si je peux déduire les 4 dernier octets à partir du premier (2*x 4*x 8*x 16*x), alors leur entropie est la même que celle d'un seul octet.

Maintenant si cette suite est véritablement aléatoire (tirée aux dés non pipés), l'entropie devient 5 fois plus grande.

Et enfin si cette suite n'est pas vraiment aléatoire, c'est-à-dire tirée avec un générateur pseudo aléatoire (/dev/urandom), alors leur entropie est égale à l'entropie du générateur pseudo aléatoire. Celle-ci se mesure par la taille de l'état interne du générateur.

Il est important de bien saisir cette notion pour comprendre la sécurité des algorithmes.

Entropie mesurée

Lorsque nous générons une suite d'octets, nous pouvons connaître l'entropie des données (et encore ...).

Lorsque nous récupérons des données, l'entropie n'est pas mesurable. Mais elle est estimable. En effet, pour une grande suite d'octets, si celle-ci est compressible, cela veut dire qu'il existe une technique pour déduire certains octets à partir des autres. L'entropie est donc très (le très variant en fonction du nombre d'octets considérés) probablement inférieure à la taille de la version compressée.

Pour tout système on peut donc chercher à en réduire l'entropie en éliminant des informations qui n'en sont pas vraiment. C'est le travail que font les gens qui développement des codecs (audio, vidéo ...).

Espace de chiffrement

L'espace de chiffrement est le nombre de tests que l'on doit effectuer pour en découvrir la clé de chiffrement d'un système. Si le système de chiffrement était parfait, il serait de la même taille que la clé. Malheureusement, on sait que la perfection n'existe pas.

Les études successives d'un système permettent souvent de réduire cet espace. Soit grâce à des informations obtenues par des moyens détournés (sous partie de la clé disponible, comparaison possible de texte clair et de texte chiffré ...), soit par une faiblesse du système qui va réduire sa propre entropie (ce cas est assez rare).

Sécurité

La sécurité d'un système s'estime à partir de cet espace de chiffrement. Plus il est grand, plus une machine devra mettre de temps pour trouver la clé de chiffrement et plus le système va être sûr.

Attention tout de même, ce n'est pas parce qu'un système de chiffrement est sûr que vos données le sont.

Et la littérature est abondantes sur le sujet, wikipedia n'est pas le seul à proposer des informations.