Linux: memoria e analisi a run-time

In tutte quelle circostanze in cui è necessario preservare la quantità di RAM disponibile in un sistema, è fondamentale sapere come identificare quali sono i processi che la stanno utilizzando, e quindi, cosa stanno memorizzando al suo interno.

Chiunque amministra un sistema, avrà inoltre dovuto affrontare situazioni in cui determinate applicazioni, allocando quantità smisurate di memoria, hanno causato rallentamenti lato server o addirittura blocchi a causa di una condizione di tipo Out-Of-Memory:

memory_oom

Ogni qualvolta viene avviato un programma, Linux crea un’area di memoria e l’assegna al processo che la utilizza.

In questa sezione, vengono salvate diverse istruzioni (come quelle relative al processo di linking e degli instruction codes), i dati che gestisce l’applicazione (nella sezione .bss quelli non inizializzati ed in .data tutti quelli che hanno pre-configurato un valore), quindi lo stack, l’heap, ecc.

Tutte queste informazioni, insieme ad altri elementi, come i descrittori dei file che stà utilizzando quel determinato processo, e gli indirizzi delle areee di memoria mappate, vengono esposte all’utente tramite lo pseudo-filesystem “proc“:

memory_proc

Per ogni programma in esecuzione, viene creata in “/proc” una cartella chiamata con il nome del PID (processID):

memory_ps_proc
Per analizzare la memoria di un processo in esecuzione, dobbiamo leggere le informazioni presenti negli indirizzi di memoria specificati nel file “/proc/[pid]/maps“:

memory_maps

Facendo particolarmente attenzione a tutto ciò viene scritto nell’heap e nello stack, poichè in essi sono contenuti gli elementi dati utilizzati dall’applicazione.

Ecco quindi un esempio pratico, dove per capire il motivo per cui un processo PHP stà utilizzando circa 200Mb di memoria “privata”, analizzerermo le stringhe che ha allocato in memoria.

Collegandoci via SSH al server ed utilizzando l’applicazione “ps”, identifichiamo il processo:

memory_processo

Utilizzando il debuggergdb“, dopo esserci “agganciati” al processo con il comando:

potremo fare un dump di tutte le locazioni di memoria presenti nel file “/proc/[pid]/maps”, eseguendo questa istruzione per ciascun indirizzo:

Nel caso in cui “gdb” non fosse presente sul sistema, potete installarlo in questo modo:

Per velocizzare l’operazione, potete utilizzare questo bash script, che esegue in automatico tutti i dump necessari, memorizzandoli in una cartella chiamata con il nome del PID del processo:

Nel nostro caso, per cui, basterà digitare come utente “root”:

Ad esecuzione terminata, troveremo tutti i dump pronti per essere analizzati.

E’ opportuno iniziare da quelli che occupano maggiore spazio disco, e per farlo possiamo utilizzare l’applicazione “strings” (dal pacchetto “binutils”):

memory_strings

L’obiettivo è cercare stringhe ricorrenti, quindi URL che si ripetono centinaia di volte, percorsi di cartelle, ecc.

Applicando questa tecnica, determineremo in maniera estremamente semplice, che la memoria contiene perlopiù queste stringhe, che occupano centinaia di MB di RAM:

In questo caso, il problema è stato generato da un attacco di tipo brute-force verso un dominio su cui è attivo il CMS WordPress, ed in cui è attivo il plugin “BruteProtect”.
In memoria c’è scritto anche l’indirizzo IP dell’attacker, e controllando i log degli accessi del servizio web, individueremo il sito responsabile.

Un commento a Linux: memoria e analisi a run-time

  1. […] Best practice su come analizzare l'utilizzo della memoria in ambiente Linux.  […]

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

*

Accedi

Registrati | Password dimenticata?