|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Aug 2008
Messaggi: 308
|
proteggere l'accesso a una risorsa remota
Salve, ho un problema curioso che non riesco a risolvere o perchè non conosco bene le tecnologie che potrebbero risolverlo o perchè la natura del problema è un'altra da quella che credo.
Ho una risorsa A remota a cui può accedere un'applicazione B remota. In realtà la risorsa A è visibile anche all'esterno dell'applicazione B. Vorrei fare in modo che la risorsa A sia in grado di discrimiare se l'accesso è stato effettuato dall'applicazione B o da un'applicazione C sconosciuta. Come prima soluzione banale mi è venuta in mente quella di inviare un identificativo all'atto dell'accesso: A accetta le richieste controllando che l'id della richiesta sia uguale a 1. B accede ad A inviando l'id 1. C, che non conosce la chiave, non può accedere ad A. Se però qualcuno è in grado di fare reverse di B, può anche scoprire qual è la chiave ed accedere ad A tramite C (utilizzando appunto la chiave trovata). Usando questa metodologia, c'è un modo per evitare un attacco del genere? Altrimenti, esiste un'altra metodologia che mi risolve il problema? |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
la strategia che tu proponi consiste banalmente nell'uso di una password o di una chiave crittografica simmetrica.
con le informazioni che ci dai non siamo in grado di suggerirti soluzioni migliori, hai posto il problema in maniera troppo astratta, peró provo comunque a suggerire SSL/TLS: SSL/TLS infatti supporta anche l'autenticazione del client, che a quanto sembra é proprio il tuo problema (vuoi che B sia in grado di distinguere A da C). |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7258
|
se stai parlando di una rete locale probabilmente la soluzione migliore è mettere la macchina su cui gira A dietro un firewall che forwarda solo i pacchetti provenienti dalla macchina su cui è presente B.
in questo modo però è sempre possibile accedere ad A da una qualsiasi applicazione C installata sulla macchina di B. ma non è possibile da applicazioni che girano su altre macchine. è un problema? |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Aug 2008
Messaggi: 308
|
Quote:
|
|
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Aug 2008
Messaggi: 308
|
Quote:
Comunque la tua soluzione non va bene perchè è proprio questo il caso che mi interessa: un utente si siede davanti alla macchina abilitata, fa il reverse dell'applicazione B, trova la chiave, lancia dalla stessa macchina l'applicazione C con la giusta chiave. Il problema può essere rappresentato anche con un esempio non informatico: Un mio amico (A) e io (B) ci scriviamo le lettere. Dato che anche mio fratello (C) conosce l'indirizzo del mio amico, potrebbe benissimo scrivergli fingendosi me. Allora A e B decidono di aggiungere una frase particolare in ogni lettera per essere sicuri delle loro identità. Ma se mio fratello scopre la frase magica? Un modo per impedirgli di scoprirla è non scriverla da nessuna parte, tranne che nella lettera (tenerla stampata nel cervello quindi). Così funzionerebbe sempre. Mio fratello non può fare il reverse del mio cervello. Ma traportando l'esempio nell'ambito informatico, come posso proteggere una password scritta da qualche parte dal reverse engineering? |
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7258
|
la soluzione al tuo problema è usare algoritmi di crittografia asimmetrica. nel mio esempio ovviamente davo per scontato che il computer su cui girava B era fidato, cioè non potesse fare cose non previste
|
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
Quote:
![]() tralasciando il Trusted Computing e tornando ad SSL, leggendo ció che hai aggiunto non sono piu sicuro che sia sufficiente. chiariamo un aspetto importante: a te interessa negare l'accesso alla risorsa da parte di determinati utenti, da parte di determinati host o da parte di determinati programmi? la terza non mi pare che abbia molto senso: se il programma C viene eseguito da un utente che ha pieno diritto di accesso alla risorsa non vedo che male ci sia. per quanto riguarda le altre due: per negare l'accesso ad utenti non autorizzati di solito si usa una password inserita dall'utente, quindi una password non hard-coded che un cracker non puó ricavare facendo reverse engineering; mentre nel secondo caso dovresti poter assumere che gli host che hanno diritto di accedere alla risorsa siano identificabili da un nome univoco, come un IP statico o un nome DNS. Ultima modifica di fero86 : 24-01-2009 alle 23:02. |
|
![]() |
![]() |
![]() |
#8 | ||
Senior Member
Iscritto dal: Aug 2008
Messaggi: 308
|
Quote:
Quote:
A è la risorsa, che può essere usata sia da B, che è una specifica applicazione utilizzata a sua volta da un utente C che quindi indirettamente sfrutta A. In realtà C potrebbe bypassare B accedendo direttamente ad A (realizzando un altro programma), vanificando di fatto il compito di B. Il flusso di esecuzione non sarebbe più C -> B -> A ma C -> B1 -> A Io (C) voglio prelevare soldi dal bancomat (A) solo se il direttore della banca (B) mi da il permesso di prelevare. Se io C però vado al bancomat, riesco a prelevare ugualmente i soldi perchè di fatto ho bypassato il controllo di B. Direi quindi che a me interessa negare l'accesso a determinati programmi. Utilizzando le tue parole, a me interessa negare l'accesso ad applicazioni non autorizzate, utilizzando una password hard coded ma non identificabile da reverse Ultima modifica di blackskop : 25-01-2009 alle 00:00. |
||
![]() |
![]() |
![]() |
#9 | ||
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7258
|
Quote:
l'unica cosa che puoi fare è usare la crittografia asimmetrica: MITTENTE (B): prendi il messaggio che devi mandare ad A e con una funzione di hash generi un digest. cripti il digest con la chiave privata (di B) e ottieni una firma digitale. adesso prendi ancora il messaggio originale, gli appendi la firma digitale e il tutto lo cripti con la chiave pubblica di A. DESTINATARIO (A): prendi il messaggio ricevuto e lo decripti con la chiave privata (di A). ottieni il testo in chiaro con la firma digitale appesa alla fine. ora prendi il messaggio in chiaro e con la stessa funzione di hash usata da B generi un digest. infine prendi la firma digitale e la decripti con la chiave pubblica di B ottenendo il digest originale (calcolato da B). confronti i due digest, se sono uguali allora sei sicuro che il messaggio l'hai ricevuto da B. per la comunicazione in senso opposto si fa la stessa cosa (dove al posto delle chiavi di B si usano quelle di A e viceversa) in tutto questo è necessario che sia A che B dispongono di una chiave pubblica e di una privata. la chiave pubblica può essere nota a tutti che non è un problema, mentre la chiave privata DEVE essere nascosta. qui dovresti poterla nascondere con una gestione dei permessi locale nel pc dove gira B. per evitare attacchi di tipo replay ti consiglio di mettere nel messaggio che B manda a A anche un numero abbastanza grosso che non si deve ripetere (se non a grande distanza di tempo). a questo punto quando A riceve il messaggio controlla anche che non sia stato già mandato un messaggio con quel numero. in tal caso sicuramente il messaggio non è stato mandato da B. Quote:
![]() il trusted computing è una tecnologia utile in ambito aziendale, quello che NON voglio vedere sono i suoi utilizzi in ambito desktop per fare i porci comodi di certe multinazionali. |
||
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Ad esempio?
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Aug 2008
Messaggi: 308
|
Quote:
Anche riuscendoci poi basterebbe smontare l'hd e leggere il file che contiene la password bypassando il sistema operativo. Inoltre, tutto sto casino si può bypassare andando a fare il dump della memoria nel momento in cui si va a leggere la pass dalla macchina locale. Questo approccio non funziona. Bisognerebbe trovare un altra metodologia. Un'altra a cui ho pensato è una sorta di protezione a livello di stato. Mi spiego, il mittente B, prima di utilizzare la risorsa A, deve aver fatto delle operazioni sulla risorsa C, F, G. Nel momento in cui viene utilizzata A, essa stessa verifica che l'utente abbia fatto accesso ad altre risorse in una sequenza prestabilita, sequenza che è dettata dall'applicazione usata dal mittente e che può quindi essere offuscata. Anche questa metodologia non garantisce la sicurezza, ma grazie all'offuscamento, capire la logica con cui viene effettuata la sequenza di accessi alle verie risorse può essere complicato. |
|
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7258
|
|
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7258
|
Quote:
la sicurezza tramite l'offuscamento è una delle cose peggiori che può venire in mente a uno che progetta un sistema di sicurezza. la storia insegna che non funziona |
|
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Aug 2008
Messaggi: 308
|
Quote:
Ho capito, ma questa è una condizione che non è possibile soddisfare. Perciò dicevo che l'approccio con protezione da password non può funzionare e bisognerebbe trovare un'altra metodologia. Ultima modifica di blackskop : 25-01-2009 alle 11:20. |
|
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7258
|
deve avere un account limitato per esempio. non può accedere a certe risorse, non può eseguire certe azioni ecc..
questo dipende dal sistema operativo e dalla gestione dei permessi su quella macchina. per evitare che possa portarsi via l'hard disk potresti utilizzare una partizione criptata. cioè non so il livello di sicurezza che ti serve ma puoi rendere arbitrariamente difficile il compito di un malintenzionato. certo che sarebbe molto più semplice se l'utente che utilizza B lo fa da remoto (cioè da C), quindi non dalla stessa macchina. e A accetta solo le richieste che arrivano dalla macchina su cui gira B (e a quella macchina non ci accede nessuna persona non fidata). |
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7258
|
se vuoi usare il metodo dell'offuscamento la cosa più semplice è creare una password in maniera complicata all'interno dell'applicazione, ma alla fine, se uno si mette a osservare il traffico di rete, basta che riproduce le stesse sequenze di trasmissione per comunicare con A. cioè facendo reverse engineering sul protocollo di comunicazione
|
![]() |
![]() |
![]() |
#17 | |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Comunque sono interessato, apriamo pure una discussione.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
![]() |
![]() |
![]() |
#18 | |
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7258
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#19 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Se si va avanti ci sarà sempre la possibilità di bypassare la protezione. Ad esempio anche con il TC, supponendo che io abbia accesso all'hardware...estraggo il chip di TC, simulo il funzionamento di B ed ottengo la mia risposta ![]() Non c'è e probabilmente non ci sarà mai la sicurezza assoluta se uno fra A e B non è al sicuro dall'intervento hardware/software dell'attaccante. |
|
![]() |
![]() |
![]() |
#20 |
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:35.