2009-09-21 13 views
16

Sto lavorando a un sistema di runtime per programmi paralleli che può trarre vantaggio da un layout di spazio di indirizzi comune su più processi, potenzialmente distribuiti su diversi (mille) nodi. Molte volte, il software creato per questo ambiente viene eseguito su sistemi Linux che hanno la randomizzazione dello spazio di indirizzi abilitata per impostazione predefinita e gli utenti potrebbero non volere o essere in grado di disabilitarlo a livello di sistema (tramite sysctl -w kernel.randomize_va_space=0 e simili). Ciò impone alcune limitazioni ai programmi paralleli e può compromettere le prestazioni. Quindi, vogliamo capire come disabilitarlo per i binari che costruiamo. La sicurezza non è un problema, poiché questo software è sempre in esecuzione in ambienti controllati.Come disabilitare la randomizzazione dello spazio degli indirizzi per un binario su Linux?

ho trovato riferimenti a varie bandiere e variabili, come ET_EXEC, EF_AS_NO_RANDOM (a quanto pare mai fusa?) E PF_RANDOMIZE, ma non riesco a trovare alcun documento che descrive che cosa posso fare per impostare questi flag. Una risposta ideale potrebbe dirmi quale flag del compilatore/assemblatore/linker disabiliterà la randomizzazione per il binario risultante e su quali versioni della catena di strumenti/kernel funziona. Il prossimo migliore sarebbe uno strumento che faccia lo stesso dopo aver creato un binario.

Poiché sono sicuro che qualcuno lo suggerirà, sono già consapevole che possiamo apportare questo cambiamento in fase di esecuzione con setarch -R, ma è preferibile registrarlo nell'eseguibile.

Sembra che il paxctl -rx dovrebbe fare il trucco, ma non sembra applicarsi al metodo corrente utilizzato nei kernel che non includono le patch PaX.

risposta

14

Presumibilmente hai una sorta di demone che invoca i tuoi programmi paralleli sui nodi. In tal caso, puoi rendere questo genitore comune disattivare ASLR per tutti i processi figlio che crea.

Cerca nelle fonti GDB (7.0 o CVS Head) come farlo. Il primo passo è chiamare personality(orig_personality|ADDR_NO_RANDOMIZE) dopo il fork e prima di exec.

+0

Indagherò e provo ora. – Novelocrat

+0

Sembra aver funzionato. Grazie! – Novelocrat

1

C'è qualche motivo per cui non è possibile mappare uno spazio shared memory o utilizzare un numero FIFO?

+1

C'è. Stiamo attraversando più nodi. – Novelocrat

0

Almeno alcune versioni precedenti di ASLR nel kernel Linux preserved offsets when forking. Piuttosto che disabilitare la randomizzazione per i tuoi processi, potresti semplicemente essere in grado di organizzarli in una gerarchia di processo genitore/figlio che mantenga gli offset uguali tra le istanze del binario biforcuta dallo stesso genitore?

+1

No, non possiamo, perché questi processi sono in esecuzione su più nodi. La migrazione dei thread è molto più semplice quando non è necessario saltare gli anelli per sincronizzare manualmente lo spazio degli indirizzi. – Novelocrat

Problemi correlati