Newsgroup: it.comp.sicurezza.varie
Titolo: Autenticita' dei dati

Mi ritrovo a scrivere la gestione delle classifiche di un gioco (il
tutto sotto ambiente linux, con php+mysql).
Io, utente root della macchina, nonche' gestore del sito, vorrei poter
dimostrare l'autenticita' delle classifiche, cioe' fare in modo che
*neanche io* possa intervenire per falsare le classifiche.
Direi che potrei fare intervenire una seconda persona che garantira'
sulla autenticita' dei risultati: a questa persona farei scegliere e
custodire una password che non devo conoscere.
Si', molto bello a parole, ma nei fatti? Che meccanismo potrei
costruire? Le pagine php devono scrivere i risultati nelle tabelle
relative alle classifiche, quindi, in un qualche modo, gli script
dovrebbero avere questa password. Come fare in modo che gli script la
abbiano e io no?
Mah.
Buttha
-- 
* Per rispondere in email rimuovere la prima i dall'indirizzo
* L'età più pericolosa è il periodo tra la nascita e la morte.
  (Elgozy)

 ha scritto nel messaggio
news:fc0099...@deeptought.localdomain...


 *neanche io* possa intervenire per falsare le classifiche.
Ciao, se  tu sei l'unica  fonte dell'informazione mi  sembra difficile
escludere  meccanismi di  alterazione  dei  punteggi, potresti  sempre
farlo  a livello  di  gioco. Es:  in GdR  tipo  Dungeons potresti  far
trovare piu' oggetti/monete ad un determinato giocatore. La classifica
sarebbe  sicuramente vera,  la  regola di  assegnazione del  punteggio
disonesta.
Ciao Francesco.
-- 
<*>  Appunti Linux per il pinguino che non deve chiedere mai. <*>  
<*>  
http://www.pluto.linux.it
                                <*>

 mentre un nano di colore ti flagella le natiche con rami di ortica
Suvvia, non siate cosi' pessimisti. 
Facciamo cosi':
io trovo l'idea per conto mio, mentre voi giocate con il nano.
Idea:
pgp ovviamente, nella sua gpg/incarnazione.
Creo una chiave e faccio scegliere la passphrase al "garante" del gioco.
Dopodiche' faccio firmare la pagina che registra i risultati al
"garante", e piazzo il file con la firma assieme a tutte le altre pagine
php.
Ogni qualvolta la mia pagina php vorra' registrare un risultato nel
database, passera' questo risultato ad una cgi scritta ad hoc, che gira
sulla stessa macchina ed ha accesso ai file del sito.
Cosa fa questa cgi?
Controlla l'HTTP-REFERER e verifica la firma di quella pagina, cosi' mi
assicuro che la cgi possa essere invocata soltanto dalla pagina
autorizzata.
Fatta la verifica, firma un sottoinsieme dei dati passati e registra la
firma assieme agli altri dati, in mysql.
Potro', cosi', a giochi terminati, validare i dati della classifica
tramite verifica delle firme.
Il problema che resta aperto e': la cgi deve avere la passhprase della
chiave privata pgp. Non posso farla chiedere in input, perche' e' una
cgi, quindi non e' un programma che continua a girare e che puo',
tenere memorizzata la passphrase.
Ergo, dovro' metterla nel sorgente della cgi.
Come proteggerla?
Ci pensero'.
hola
Buttha
-- 
* Per rispondere in email rimuovere la prima i dall'indirizzo
* C'e' un giorno per seminare e un giorno per raccogliere... 
  giovedi' andrebbe  benissimo... (Corrado Guzzanti)

sulla stessa macchina ed ha accesso ai file del sito.
No. Se vuoi dare la garanzia a terzi, allora la CGI deve inviare
la pagina per mail e farsela rimandare firmata (e verificarne la
provenienza).
Chi ha dubbi, si prende la firma, fa il controllo e chiede a chi
ha la chiave di garanzia se la firma e' vera.
Se poi non si fida a priori, puo' farlo LUI il garante... La CGI
in altre parole fa firmare la pagina a TUTTI quelli che hanno un
dubbio in proposito. Dopo un time out, il firmatario e' valutato
come "morto" e nelle timbrature compare:
	Leonardo Serni... APPROVA <sigla_gpg>
	Buttha........... APPROVA <sigla_gpg>
	Tizio............ TIMEOUT	
Qualsiasi altro modo, che alla fin fine dica a chi visita quella
pagina "Risultato del controllo... POSITIVO", e' BACATO, perche'
potrebbe essere generato con
	<?
		print "Risultato del controllo...";
		flush();
		sleep(10);
		print "<B>POSITIVO</B>";
	?>
Leonardo
-- 
And where the black and corkscrew towers climb
Lost and athirst the ragged pack abides,
Old as the aeons, trapped in tombs of time,
Sailing the tortuous temporal tides...

 ha scritto nel messaggio
news:mi9299...@deeptought.localdomain...


 essere un utente, no? Poi dipende tutto dal sistema nel suo insieme.
Non si tratta di votazioni, ma di un gioco che mettera' in palio dei
soldi. E' ovvio che io non giochero' mai, ma nulla mi impedirebbe di
andare da un mio amico, in bar, e chiedergli di iscriversi...
ciao
Buttha
-- 
* Per rispondere in email rimuovere la prima i dall'indirizzo
* Paperino e' felice perche' si fa le paperine, Topolino e' felice
  perche' si fa le topoline, Pippo e' triste.

 	?>
Beh, no: assieme ad ogni dato della classifica (cioe' assieme ad ogni
partita fatta) registro nel database la firma dei dati appena
memorizzati. Le firme, volendo, potrei anche renderle pubbliche: chi
vuole verificare si piglia pgp e verifica.
Ovviamente, per poter firmare i dati, la mia cgi (pagina php), deve
avere la passhprase per la chiave privata.
Quello a cui ho pensato e' molto semplice:
faccio scrivere la passphrase al mio titolare nel sorgente php, 
chiudo gli occhi e faccio un qualche strano "encode" della pagina 
(l'unico sorgente php che avro' sul disco sara' quello senza passphrase).
A questo punto il problema si posta sul trovare un encoder per php:
zend lo vorrei evitare; APC l'ho provato ma la codifica non c'e' proprio
(le variabili le si leggono belle in chiaro).
Leo... come sei messo con il compilatore php?
hola
Buttha
-- 
* Per rispondere in email rimuovere la prima i dall'indirizzo
* Il segreto e' sacro; nondimeno, e' in qualche modo ridicolo.
  (Jorge Luis Borges)

       ?>
Beh, no: assieme ad ogni dato della classifica (cioe' assieme ad ogni
partita fatta) registro nel database la firma dei dati appena
memorizzati. Le firme, volendo, potrei anche renderle pubbliche: chi
vuole verificare si piglia pgp e verifica.
Ovviamente, per poter firmare i dati, la mia cgi (pagina php), deve
avere la passhprase per la chiave privata.
Quello a cui ho pensato e' molto semplice:
faccio scrivere la passphrase al mio titolare nel sorgente php, 
chiudo gli occhi e faccio un qualche strano "encode" della pagina 
(l'unico sorgente php che avro' sul disco sara' quello senza
passphrase).
A questo punto il problema si posta sul trovare un encoder per php:
zend lo vorrei evitare; APC l'ho provato ma la codifica non c'e' proprio
(le variabili le si leggono belle in chiaro).
Leo... come sei messo con il compilatore php?
hola
Buttha
-- 
* Per rispondere in email rimuovere la prima i dall'indirizzo


avere la passhprase per la chiave privata.
No, perche'? La tua pagina invia il dato al garante e lo riprende
firmato. Per controllare che la firma sia OK, gli serve la chiave
pubblica del garante (nessun problema). Fine.


 No, perche'?
Perche' c'e' l'esigenza di gestire le classifiche in *tempo reale*.
Appena uno ha finito di giocare, il punteggio deve andare
automaticamente in classifica; quindi, un controllo umano e'
inapplicabile (quindi, o non ho capito la soluzione che hai in mente,
oppure e' inapplicabile per questo caso).
A questo punto, ci deve essere un dispositivo di firma automatico: come
fa, questo dispositivo, a sapere che i dati che gli vengono sottoposti
sono, effettivamente, generati dalla pagina del gioco?
Un HTTP_REFERER non serve a nulla, visto che lo potrei benissimo falsare
via telnet.
un Buttha mumble mumble, secondo me mi sta sfuggendo qualcosa
-- 
* Per rispondere in email rimuovere la prima i dall'indirizzo
* La statistica è quella scienza che dice che se hai la testa nel 
  congelatore e i piedi nel forno, mediamente stai bene.

Perche' c'e' l'esigenza di gestire le classifiche in *tempo reale*.
Ah, allora i dati non ancora firmati sono indicati come "in attesa
di validazione". Eventualmente, se devi fare somme, sommi soltanto
i dati validati, e poi fornisci ambedue le versioni.
Leonardo
P.S. Personalmente, io ho sempre adottato l'algoritmo NVF/NGENRIC,
     o variazioni. C'e' da farci un pensierino [1].
[1] Non Vi Fidate? / Non Giocate E ...


      o variazioni. C'e' da farci un pensierino [1].
Per ora, e' l'unica soluzione valida che ho trovato.
Resto dell'idea  che l'ideale,  per questo  specifico tipo  di problema,
sarebbe un encoder del codice php: sara' lo stesso codice a firmare i
dati; una validazione "umana" sarebbe improponibile per due motivi:
1) se parlassimo di migliaia di contatti al giorno? Ci vorrebbe un
robot, non una persona.
2) chi firma i dati, riceve i risultati di una partita: quale e' il
criterio per definire dei dati falsi? Non c'e'. La persona che dovrebbe
firmare non avrebbe alcun criterio per attestare la validita' dei
risultati, mentre la pagina php si'.
hola
Buttha
-- 
* Per rispondere in email rimuovere la prima i dall'indirizzo
* Anche un orologio fermo segna l'ora giusta due volte al giorno
 (H. Hesse)