Incendie du Datacentre FICloud

Charpentier A., De-Pontac C., Le Bohec R., Miralves T., Naulin A., Rataud Q.

← Incendie du Datacentre FICloud · 1ère étape - groupe 4 / Irrégularités dans le système de contrôle / 4e étape : Intrusion Physique / 3e étape - Reverse qui pourra

Irrégularités dans le système de contrôle

LOG

Après la compromission d’un compte administrateur, de nouvelles anomalies apparaissent dans le système de supervision du datacentre.

À vous de les retrouver à partir des logs des CPU/GPU des machines.

Suite à la compromission d’un compte administrateur, l’équipe d’investigation poursuit l’analyse des systèmes de supervision du datacentre.

Vous avez à votre disposition les logs des CPU/GPU des machines de Ficloud pendant la journée de l'incendie. Vous devez trouver d'éventuelles anomalies.

Cote 23 pts

Faire son rapport

On peut écrire un petit code Python pour afficher visuellement la courbe
température vs puissance d'un GPU, afin de voir si quelque chose d'anormal
est visible :

with open('logs/server_10_metrics.csv', 'r') as f:
    lines = f.read().split('\n')[3:-1]

powers = []
temps = []

for line in lines:
    cells = line.split(',')
    power = float(cells[22])
    temp = float(cells[23])
    powers.append(power)
    temps.append(temp)


import matplotlib.pyplot as plt

plt.plot(powers)
plt.plot(temps)
plt.show()

Dans la plupart des situations, le graphe ressemble à ceci :
graphe d'un GPU opérant dans les conditions attendues

Cependant, si on regarde certains serveurs en particulier, comme
le serveur 7, le graphe se comporte très différemment vers la fin de la
journée :
graphe d'un GPU infecté

La température devient subitement très lisse aux alentours de 37 degrés, alors
que la puissance augmente, ce qui indique une incohérence dans les journaux
retrouvés. Peut-être la température retournée par les capteurs a été
compromise ?

On peut maintenant écrire un petit script Python pour repérer ce genre
d'anomalies automatiquement :

for i in range(1, 51):
    with open(f'logs/server_{i}_metrics.csv', 'r') as f:
        lines = f.read().split('\n')[3:-1]
    for line in lines:
        cells = line.split(',')
        power = float(cells[22])
        temp = float(cells[23])
        if power > 190 and temp < 37:
            print(i, "infected")
            break

Cela nous donne directement la liste des serveurs impactés par l'attaque.
On peut vérifier à la main en affichant leur courbe température versus
puissance.

Concernant l'heure exacte de la compromission, on la retrouve en regardant
en détails les journaux d'une machine infectée.
On trouve le changement exact de comportement:

2025-03-10 HH:MM:00,0.204,0.349,[...],8192,136.99094779647027,53.038,36.921
2025-03-10 HH:MM:01,0.439,0.348,[...],8192,189.91090120901902,38.0,95.85

Le composant malveillant s'est donc vraisemblablement déclenché à cette
heure-ci.