È sicuro includere gli indirizzi di memoria nell'output di un programma?

2

Sto scrivendo un programma. L'input è una struttura di dati complessa in memoria. L'output è un report HTML che contiene: (1) una rappresentazione della struttura; (2) annotazioni testuali che fanno riferimento a oggetti nella struttura.

Per collegare le annotazioni a parti della struttura, uso gli indirizzi di memoria degli oggetti come ancore. Pertanto, gli indirizzi di memoria finiscono direttamente nel codice HTML generato.

Potrebbe essere in qualche modo pericoloso?

I rapporti sono principalmente per uso personale, ma a volte possono essere condivisi.

Il programma può essere usato come una libreria, all'interno dello spazio di memoria di un altro processo. Tuttavia, gli oggetti di input sono costruiti appositamente per questo scopo e, normalmente, saranno raccolti automaticamente dopo che il rapporto è stato completato.

Stavo pensando di offuscare gli indirizzi con MD5 - sarebbe in qualche modo migliore?

    
posta Vasiliy Faronov 22.04.2016 - 17:40
fonte

3 risposte

2

Puramente dal punto di vista della programmazione, invece di usare un indirizzo di memoria degli oggetti per collegare queste due parti di dati, dovresti davvero generare un numero di indice e usarlo per fare riferimento tra la struttura e la tua annotazione.

Non vedo alcun motivo per cui sarebbe pericoloso includere gli indirizzi nel report, poiché non appena il programma termina lo spazio degli indirizzi viene liberato dal sistema operativo. Anche se potrebbe non essere azzerato (i dati possono rimanere in memoria fino a quando non vengono sovrascritti), probabilmente non sei a rischio di sfruttamento.

    
risposta data 23.04.2016 - 09:00
fonte
1

Potrebbe essere pericoloso. Se il tuo programma manipola dati riservati che non finiscono nel rapporto, gli indirizzi di memoria possono rivelare informazioni sui dati riservati. Sfruttare questi dati è probabilmente difficile; l'utente malintenzionato dovrebbe avere una buona conoscenza pratica di ciò che fa il programma e otterrebbe solo informazioni parziali, principalmente sulla dimensione e il numero di alcuni elementi di dati.

Ad esempio, condividi questo pseudocodice che analizza il record di un paziente per determinare se sono adatti al lavoro:

struct patient_record_entry entries* = malloc(entry_count * sizeof(struct patient_record_entry));
char *employer_name = malloc(employer_name_length);
// read patient data from file
// analyze patient record to determine fitness for work
bool is_patient_fit = …;
printf("<patient><name>%s</name><employer>%s</employer><fit>%d</fit></patient>\n",
       patient.name, employer_name, is_patient_fit);

Rivelando gli indirizzi di employer_name e entries si rivela il numero di voci nel record del paziente ( employer_name - entries meno una costante relativa alla gestione della memoria) nel caso non così improbabile in cui i due blocchi di memoria sono consecutivi. Ciò fornisce maggiori informazioni sul paziente rispetto a ciò che dovrebbe essere presente nell'output.

    
risposta data 25.04.2016 - 02:08
fonte
0

In primo luogo, cosa perderebbe tagliando questi valori? Sospetto che il codice non sia particolarmente critico per le prestazioni e che l'impatto sulla velocità sia relativamente minore. Se non c'è un grosso svantaggio probabilmente vale la pena farlo.

Per quanto riguarda l'impatto sulla sicurezza, molti sistemi operativi utilizzano la randomizzazione del layout di spazio degli indirizzi (ASLR) per mitigare determinati tipi di attacchi. Nel caso in cui il tuo programma producesse questo output e uscisse probabilmente non è un grosso problema dato che gli indirizzi trapelati sono per un processo ormai morto, ma mentre menzioni una libreria che potrebbe perdere indirizzi per un processo che continua a funzionare potrebbe esserci un problema lì . La perdita delle informazioni non crea direttamente una vulnerabilità, ma potrebbe rendere più facile sfruttarne una esistente.

    
risposta data 23.04.2016 - 12:55
fonte

Leggi altre domande sui tag