#Hack5Stelle – Riassunto

Provo per diletto a riassumere la vicenda “Hacking beppegrillo.it/Rousseau”, basandomi su quel che so dai blog e dalle persone che seguo su Twitter.

  • Per scrivere una sequenza temporale degli eventi.
  • Come riferimento di links per chi vuole approfondire.
  • Magari per spiegare a chi non è competente in materia cosa è successo, cercando di usare un linguaggio non tecnico ove possibile.

Premessa: Non ho MAI tentato un hacking, né cercato vulnerabilità attivamente. Tutto quello che dichiaro l’ho semplicemente dedotto da informazioni pubbliche.

Gennaio 2017

Notai che il certificato SSL (l’accesso https://) di beppegrillo.it era scaduto da 5 giorni.
Nessuno si era accorto, quindi nessuno lo usava.
Accedere ad un sito web senza crittografia significa essere esposti a un attacco chiamato MITM (Men-In-The-Middle, ‘Uomo nel mezzo’).
Ad esempio se qualcuno, collegato ad un WiFi di un albergo, digita in un sito web senza https:// una login e password, chiunque ha accesso al router dell’albergo vede e può alterare questi dati in chiaro.

Se andate su http://www.beppegrillo.it/login.php , noterete che ormai qualsiasi browser moderno segnala il problema.

Claudio d’Angelis notò che in realtà l’accesso https:// non funzionava proprio.


E’ quindi certo che nessuno lo usava.

Poi, per curiosità, avevo usato un test online di controllo sicurezza e configurazione di siti protetti, Qualys SSL Labs.
Se volete provare, basta andare qui: https://www.ssllabs.com/ssltest/ e inserire

https://www.beppegrillo.it

L’esito, a gennaio 2017, non solo mostrava una mal-configurazione di SSL (che di per sè non era così grave, tanto non era usato), ma evidenziava che era vulnerabile a un attacco chiamato POODLE.
Ok, impossibile da usare come vettore di attacco essendo SSL non usato. Ma evidenziava che, evidentemente, il server non era più stato aggiornato perlomeno dal 2014.

Paolo Attivissimo segnalò allo staff di Grillo il problema che avevo sollevato:

Inoltre, il webserver era un Apache 2.2.15, molto molto vecchio (2010). Brutto segno.

2 agosto 2017, 11:40 (OTTO mesi dopo).

Evariste Gal0is apre un sito web, chiamato hack5stelle, in cui evidenzia come imporre un limite MASSIMO di 8 caratteri per una password sia RIDICOLO. Ed evidenzia una serie di vulnerabilità di tipo SQL injection. Sono un tipo di vulnerabilità che permettono di leggere arbitrariamente i dati dal database, anche quelli riservati. Altamente probabile che siano anche alterabili.
Non divulga alcun dettaglio su come sfruttare tali vulnerabilità, e dice che ha informato i responsabili del sito web.

E’ in gergo un WhiteHat, un ricercatore che cerca vulnerabilità nei siti web al solo scopo di aiutare.
Ha al suo attivo centinaia di segnalazioni utili, come si evince dal suo profilo su OpenBugBounty.
Perchè lo fa? Per passione. Per aiutare i webmaster. Per difendere gli utenti. Per imparare. Per farsi conoscere, perchè magari un domani possa diventare un lavoro a tempo pieno.
Lo fa gratis o qualcuno lo paga? Gratis. Non diverso dagli sviluppatori di software open-source che usate tutti quanti. Ricordatelo, grazie.

Già inizia a pentirsene poco dopo, ore 23:51

3 agosto 2017, 18:44

L’Associazione Rousseau pubblica sul blog di Beppe Grillo un post intitolato La sicurezza di Rousseau.

Di notevolmente ridicolo scrivono

Sono già state messe in atto tutte le azioni necessarie per impedire il ripetersi di intrusioni informatiche come questa.

(verranno smentiti successivamente)
e

In ogni caso il suo sito è già scomparso così come i suoi account social, segno che le contromisure contro questi reati funzionano e siamo lieti che siano state così tempestive.

(verranno smentiti successivamente)
ma soprattutto attaccano/minacciano Evariste Gal0is:

Valuteremo l’azione legale da intraprendere nei confronti dell’hacker, il cui attacco è assolutamente da condannare, anziché osannare come fanno i giornali.

Minacciare un WhiteHat è assurdo, stupido, gravissimo.
Oltre che ridicolo…

Personalmente non mi pare coerente minacciare un WhiteHat e contemporaneamente sostenere progetti come WikiLeaks (cosa pensano che fanno?) o persone come Julian Assange.
Fantastico l’hashtag #solowikileaksvabene di David Puente.

3 agosto 2017, ore 22:40

Su Twitter l’utente @r0gue_0 dichiara di aver l’accesso al server o ai servers da mesi, e inizia a pubblicare dati come dimostrazione.
E’ un BlackHat, “cappello nero”, diciamo ‘un hacker cattivo’. Ma ‘hacker’ è un parolone per questo tizio.
Afferma e dimostra di poter scrivere nel database, oltre a leggerlo.
Insulta il whitehat Evariste Gal0is, colpevole a suo dire di aver attirato l’attenzione sulla disastrosa situazione intaccando i suoi interessi.
Personalmente, penso che r0gue_0 era in attesa di un momento politico più favorevole per sfruttare il suo accesso.
In una successiva intervista a Wired rilascerà dichiarazioni importanti come

“Io li dentro ci stavo già, e da molto tempo. Ho dato due esempi di tabelle molto diverse solo per fare capire il lasso di tempo, come che gli host violati erano diversi. Se non era per il vostro amico wannabe, che ha voluto mettere il cappello bianco e provare a diventare famoso, non si veniva a conoscenza nemmeno della mia esistenza. Non avreste mai visto nulla, e io sarei rimasto lì indisturbato a continuare gli affari miei. Per tutto questo casino potete dunque ringraziare lui”.

Non mi soffermo sulla tipologia di dati divulgati, sui singoli tweet o quant’altro di questo stronzo (scusate il francesismo).

r0gue_0 ha anche messo in vendita tutti i dati trafugati, per poco meno di 1000$. Non si sa chi o quante persone han acquistato questi dati.

Confido che prima o poi ci sarà la ciliegina sulla torta: qualcuno li pubblicherà su WikiLeaks, che il M5S tanto apprezza.

Rimando agli articoli di David Puente per altri dettagli sulle gesta di r0gue_0:

Violato Rousseau! Hacker R0gue0 pubblica su Twitter dati prelevati dalla piattaforma del M5S

Le nuove informazioni di R0gue_0 prelevate dalla piattaforma Rousseau: le email della “call to action”

R0gue_0 e il database di Rousseau: Matteo Renzi ha donato 1 milione di euro al M5S? Ma anche no!

Non solo Rousseau, R0gue_0 ha bucato anche BeppeGrillo.it e Il Blog delle Stelle

5 agosto

Evariste Gal0is torna online. Si era preso una pausa perchè non ha gradito la popolarità.

Smentisce il post dell’Associazione Rousseau relativamente alle contromisure:


Condanna il gesto di r0gue_0:


Avverte che i problemi persistono:


E, nonostante le minaccie ricevute, continua il suo operato da whitehat:


A me ha risposto:

Da ammirare.

6 agosto 2017

Di Maio dichiara:

Il problema non siamo noi ma la sicurezza informatica di questo Paese

.

Gloriosa supercazzola.

7 agosto 2017

Matteo Flora riassume la vicenda con un video su YouTube:
Attacco a #Rousseau del Movimento 5 Stelle: tutto quello che dovete sapere

8 agosto 2017, ore 12:14

Evariste Gal0is ed Antonio Sanso pubblicano una nuova analisi: #Hack5Stelle – Parte 1: dump e le password.

Scoprono che il software installato è una versione obsoleta di Movable Type, la versione 4.2.

Esistono dei database contenenti l’elenco delle vulnerabilità dei software, ad esempio i CVE.
Normalmente, quando una vulnerabilità nuova viene scoperta, viene segnalata all’autore del software, che può correggerla. Passato tot tempo (generalmente qualche mese), viene resa pubblica (disclosure), a volte anche con istruzioni dettagliate su come sfruttarla.
La disclosure della versione di un software in uso, soprattutto se obsoleto, equivale a un il mio punto debole è qui, se mi colpisci -per di più così- mi fai male.

Scoprono inoltre che le password, laddove non conservate in chiaro, sono facilmente decifrabili a causa di un algoritmo che risale alla preistoria informatica: DES / Crypt.

E’ altamente probabile che l’Associazione Rousseau abbia installato Movable Type tanti anni fa,
l’hanno adattato alle loro esigenze ottenendo di fatto un fork, e ora non possono più aggiornarlo senza rifare tutti gli adattamenti.
E’ un tipico errore di webmaster incompetenti.

8 agosto 2017

Paolo Attivissimo accenna la vicenda: Due parole sulle vulnerabilità di Rousseau

8 agosto 2017

Evariste Gal0is rilascia un’intervista a David Puente: Intervista a Evariste Gal0is: non era un attacco politico e non sono R0gue_0. Segnalate falle anche nel nuovo Rousseau

Scrive un ultimo articolo: #Hack5Stelle – Parte 2: fix che non lo erano..
Si evince che il team tecnico dell’Associazione Rousseau non è in grado di sistemare decentemente neanche i problemi segnalati.
Non sa come sistemarli, quindi hanno improvvisato cercando di tappare le falle senza alcun know-how sull’argomento. Fallendo, ovviamente.
Niente, pare che rivolgersi a un esperto non sia considerato una priorità.

Evariste Gal0is dichiara che non vuol più occuparsi della vicenda:


(e fa bene, imho).

11 agosto

Leggo dal blog di David Puente l’articolo Cosa devono risolvere e rimuovere da Beppegrillo.it per la loro sicurezza che han lasciato un file chiamato mt-check.cgi.

Funziona così: per poter installare il CMS (Content-Management-System), cioè il software ‘motore’ del sito web, han piazzato un file che serve SOLO a verificare se il server è in grado di ospitare il software.
Non per niente la pagina finisce con “You’re ready to go! … Continue with the installation instructions.”.
Qualunque webmaster sa che quel tipo di file DEVE essere cancellato dopo l’installazione.
Perchè contiene dettagli su come il server è configurato e le versioni dei software che ha, in tempo reale.
Non serve a nient’altro. Tempo richiesto per risolvere il problema: un secondo, cancellare quel file.
Come spiegato prima, sono i dettagli che servono per correlare ricerche nei database di vulnerabilità note (CVE in primis).

Nello stesso post, David Puente fa anche notare che la password viene inviata in chiaro via mail in fase di richiesta recupero (molto male!) confermando ulteriormente che usano un software obsoleto.

15 agosto 2017, 09:50

L’Associazione Rousseau pubblica sul blog di Beppe Grillo un post intitolato I sicari informatici non fermeranno il MoVimento 5 Stelle.

Condannano l’operato di R0gue_0. D’accordo.

Confermano che

Purtroppo non sono stati colti in flagrante

e che quindi R0gue_0 ha accesso al server da tempo indeterminato. Ricordo che aveva potere di scrittura nel db.

Di notevolmente ridicolo:

I dati che sono stati divulgati dall’hacker si sono dimostrati comunque privi di fondamento

No. Erano dati personali veri e confermati.

e ovviamente di nuovo un

In questo momento stiamo prendendo tutte le misure necessarie affinché non si ripetano situazioni del genere e siamo al lavoro anche in questo giorno di festa.

Ora, 15 agosto 2017 ore 21:50, mentre scrivo questo post

Il server è ancora vulnerabile al POODLE attack (2014) e monta ancora Apache/2.2.15 (2010). Snapshot su archive.is Test in realtime

Il file mt-check.cgi c’è ancora. Snapshot su archive.is

Personalmente, correlando versioni e report CVE, penso di aver identificato una vulnerabilità di tipo remote-code-execution.
Significa che a mio avviso c’è una vulnerabilità che permette a chiunque la sfrutti di leggere e scrivere qualsiasi dato sul server, lanciare qualsiasi comando, e di installare una back-door, ovvero un accesso secondario segreto che sarà attivo anche se il server verrà sistemato.

Dovrei verificarla per poi segnalarla? L’Associazione Rousseau ha dichiarato che non gradisce.

Inoltre, si risolve automaticamente sistemando un’altro problema già citato in questo articolo, quindi gli basta rivolgersi a qualcuno di competente prima o poi.

Tralascio volutamente ogni considerazione legale sull’operato dell’Associazione Rousseau, non ne capisco abbastanza da permettermi un’opinione.
Ho letto che il Garante della Privacy ha aperto un’istruttoria.

Spero di non aver dimenticato nessun fatto importante, in caso contrario segnalatemelo via Twitter, grazie.

Aggiornamento 16 agosto 2017

Han rimosso finalmente il file mt-check.cgi. Non han colto minimamente cosa avevano sbagliato, perchè il problema persiste in altri files simili.

Accesso crittografato in siti web di partiti politici

Visto l’interesse per l’argomento, riassumo lo stato dell’accesso protetto da crittografia di 5 siti web di partiti politici.
Di questi, solo il sito web del Partito Democratico ha un accesso crittografato in maniera sicura. Accettabile con riserva.
Il Movimento 5 Stelle ha un ottimo sistema, Rousseau, ma non tutto è in sicurezza. Fratelli d’Italia, Forza Italia e Lega Nord, totalmente assente.

Unico pensiero politico da parte mia (prendetelo in maniera costruttiva): mi aspettavo maggiore cura dal Movimento 5 Stelle considerando che la rete è il suo cavallo di battaglia.

Immaginate ad esempio che un utente visiti quei siti web da un accesso pubblico (wifi pubblico, albergo, aeroporto etc). Un attaccante potrebbe:

  • intercettare in chiaro le credenziali (tra cui in chiaro le passwords, spesso riutilizzate).
  • reindirizzare la richiesta (alterando il form html) verso siti web malevoli.
  • alterare la risposta di ritorno, inserendo un javascript che funziona da keylogger in modo da intercettare poi ogni possibile interazione anche futura.

Questi ESEMPI di potenziali attacchi valgono per tutti, PD compreso, dato che non ha attivato alcuna forzatura alla versione sicura nei form di credenziali.

La maggior parte di produttori di browser hanno piani a lungo termine per l’abolizione delle connessioni in chiaro (es. Firefox), e i primi passi imminenti sono l’implementazione di warning di sicurezza (es. FireFox, Chrome).

Chrome pubblico usato dalla gente comune è la versione 55. La versione che notificherà che i siti web sopra-citati sono insicuri sarà la 56. E’ davvero molto imminente, imho.


Movimento 5 Stelle / Beppe Grillo

Rousseau https://rousseau.movimento5stelle.it è ottimamente configurato.
Certificato hash algorithm sha256 ok, rating ssl-labs: A+ altissimo (il massimo, abbastanza raro),
ottimo l’uso di HSTS che garantisce a monte che il sito sia interamente sotto crittografia. Versione web-server nascosta.

Una pesante pecca: l’iscrizione punta ad un’altra macchina, malmessa a livello di configurazione:

  • Riporta un vecchio Apache/2.2.15, che ha parecchie vulnerabilità note.
    Può essere che alcune vulnerabilità siano chiuse (ad esempio come i package debian in repo stable su distro LTS), non ho investigato sulle singole vulnerabilità.
    Dei penetration-testing sono più impegnativi di questa mia ricerca da tempo libero.
  • Restituisce un certificato scaduto da diversi giorni.
  • common-name errato (www.beppegrillo.it), che porta a una pagina web inesistente (404).
  • hash algorithm sha1, male.
  • Vulnerabile a POODLE e weak cipher.
  • Scelta incredibile. Di solito è accettabile avere un sito in chiaro con la sezione di autenticazione (login/register) sotto crittografia. Ma avere Rousseau protetto e registrazione in chiaro è tutto il contrario.

L’iscrizione quindi è obbligatoriamente in chiaro, perchè usare un accesso scarso di rating ssl-labs: T equivale a non usarlo.

Vedo ottime premesse, a spanne basta che il team di Rousseau prenda in carico anche l’altra macchina malconfigurata.


Partito Democratico

Buono, non ottimo.

Accesso crittografato https://www.partitodemocratico.it/ è OK.

La pecca è che la versione in chiaro funziona, potrebbe redirigere direttamente alla versione crittografata, o meglio ancora implementare HSTS come Rousseau.
E’ una pecca importante perchè la versione di login funziona anche da accesso non crittografato.
Obiettivamente se un accesso è insicuro e la versione sicura esiste, non è possibile venire incontro alla vita agli utenti che non conoscono la differenza o manco sanno che possono scegliere?

Piccola pecca, https://partitodemocratico.it restituisce ERR_BAD_SSL_CLIENT_AUTH_CERT. Pare solo mal-configurato il terzo livello “www.”.

Certificato SSL, ok per sha256. ssl-labs: B migliorabile, degli accessi con cipher weak andrebbero chiusi. Rousseau è configurato meglio.

Pare usino Apache 2.2.22 su FreeBSD. Non conosco decentemente FreeBSD.

Curiosità: Dal sito web, cliccare Accedi porta a un url da 3228 caratteri/bytes. Tutti fondamentali eh. (ironico).


Fratelli d’Italia

In http://www.fratelli-italia.it praticamente l’accesso cifrato non esiste.

Tesseramento e login solo in chiaro.

La versione cifrata del tesseramento mostra un 503 Service Unavailable, con un certificato self-signed che non corrisponde neanche come common-name.

ssl-labs: F. Vulnerabile al POODLE attack, weak cipher, etc.

Se non altro, nascondono che software web-server usano.


Forza Italia

http://www.forzaitalia.it è solo in chiaro, l’accesso crittografato per il sito principale non risponde.

La login è in chiaro.
L’accesso crittografato per il login spara pagina non trovata (HTTP 404).
Certificato SSL self-signed, scaduto 3 anni fa. 1024 bits. In pratica come se non ci fosse.

ssl-labs: F Tutto weak. Due diverse vulnerabilità, POODLE e CVE-2016-2107.

Praticamente l’accesso crittografato non esiste.

Apache/2.2.25 Amazon.


Lega Nord

http://www.leganord.org/ tutto in chiaro. L’accesso crittografato non esiste.

Apache 2.4.10 su Fedora.

https://www.beppegrillo.it e disclosure

Recentemente ho notato che il certificato SSL di https://www.beppegrillo.it è scaduto.

La cosa mi ha incuriosito perchè quel sito web è uno dei più frequentati d’Italia, e mi è parso strano che nessuno nell’arco di 5 giorni si sia indignato di dover inserire una password in una connessione in chiaro (esempio).
Anche perchè la figura di m. è imminente, le beta o candidate-release di browser moderni mostrano degli avvisi espliciti laddove è richiesta una password in una connessione non cifrata. Vedi ad esempio https://blog.mozilla.org/tanvi/2016/01/28/no-more-passwords-over-http-please/

Ieri sera l’ho fatto notare a Paolo Attivissimo via Twitter:

Poco dopo, Paolo ha twittato:

Immediatamente ho precisato che un certificato SSL non scaduto per il dominio www.beppegrillo.it esiste, ma non è configurato sulla macchina relativa:

Claudio d’Angelis mi ha fatto notare che l’approccio non è proprio professionale, dato che normalmente il protocollo non dovrebbe determinare il tipo di contenuti, mentre invece pare evidente che il blog sia necessariamente in chiaro, e la crittografia riservata ad altro (non so di più, mai frequentato il sito di Grillo).

A questo punto ho indagato (parolone…) altri 5 minuti (neanche), e ho notato che il webserver risponde fornendo informazioni sulla versione di Apache installata

Non che questo sia grave di per sè, ma di solito i professionisti evitano di fornire questo genere di info per rendere almeno un pelo più difficile la ricerca di vulnerabilità.

Un veloce controllo su SSL-Labs ha evidenziato vulnerabilità note (PODDLE), cipher weaks e altre varie.

Cosa prevedibile con un Apache 2.2.15, che è un po’vecchiotto. POODLE confermato anche dallo scan online di Comodo.

Più di una persona su Twitter fa notare che il sito di gestione del Movimento è su un’altra macchina, https://rousseau.movimento5stelle.it/ , che a una prima occhiata pare ben configurata.
Ma obiettivamente in questo settore non è che se un qualcosa è obsoleto lo si abbandona senza aggiornamenti, anche perchè se quell’accesso presenta vulnerabilità da remote-code-execution, significa accesso all’intera macchina (ed eventualmente al database annesso).

E qui arriviamo al motivo di questo riassunto.
Mi preme precisare che ho usato il termine colabrodo perchè è evidente la situazione, ma NON ho MAI detto che è una situazione grave.
Mi ritengo un professionista nel mio settore (sicurezza IT), ma qui sono sempre rimasto a livelli di chiacchere da bar.
Stabilire la gravità di noncuranze richiederebbe un’analisi più accurata, dei penetration-testing, notifiche private, disclosure concordate etc.
Potrebbe anche essere che la macchina in questione è solo un vuoto reverse proxy o un load-balancer a una macchina di backend meglio configurata, per dire.

Estote parati! (@lastknight docet)

(Editato in seguito per correggere il mio italiano..)

Sample ODS video

I rendered with POV-Ray (using my approach) a sample 360 degree, omnidirectional, stereo video (top/bottom).
Can be used for stress testing VR Video players, HMD etc.

It’s a 120 frame animation, loopable. It mean one seconds at 120 FPS (for example PSVR), 1.25 seconds at 90 FPS (Oculus Rift, HTC Vive), etc.

YouTube Preview:

Real plain preview:

It took around 4 days for rendering on my i7 with eight cores.
Every frame have 7680 x 7680 pixels resolution (Stereo top/bottom), around 32 MB PNG each.
I encoded it in different FPS and resolution. As explained in my other post about ODS, x264 don’t support highest framerate at highest resolution.

ffmpeg command-line encoding:

ffmpeg\bin\ffmpeg.exe -framerate 60 -i sample%03d.png -c:v libx264 -preset veryslow -vf scale=1280:720 -x264-params crf=18 -c:a aac -strict experimental preview.mp4

Download links

Image:
Single shot image, 7680 x 7680 pixels (9370 KB)
Videos:
x264 – 30 FPS – 4K UHD
x265 – 60 FPS – 4K UHD
x265 – 90 FPS – 4K UHD
x265 – 90 FPS – 4K DCI
x265 – 90 FPS – 8K
x265 – 120 FPS – 8K

POV-Ray source code: .pov, .ini.

Omni­directional stereo (ODS) with POV-Ray

Omni­directional stereo (ODS) is a projection model for stereo 360 degree videos
It’s designed for VR viewing with a head­mounted display (HMD).
More information here.

I developed and tested for fun an approach for raytracing, open-source POV-Ray software.

How to render

Currently (2016-03-11), render ODS image require an alpha version of POV-Ray, that support user_defined camera. Download from here
Or use my POV-Ray fork. More information on this below.

With POV-Ray official (Alpha),
Use the following code for an ODS top-bottom (left eye on top, right eye on bottom):

// ODS Top/Bottom - Docs: https://www.clodo.it/blog/?p=80
#declare odsIPD = 0.065; // Interpupillary distance
#declare odsVerticalModulation = 0.2; // Use 0.0001 if you don't care about Zenith & Nadir zones.
#declare odsLocationX = 0;
#declare odsLocationY = 0;
#declare odsLocationZ = 0;
#declare odsHandedness = -1; // "-1" for left-handed or "1" for right-handed
#declare odsAngle = 0; // Rotation, clockwise, in degree. 

camera {
  user_defined
  location {
    function { odsLocationX + cos(((x+0.5+odsAngle/360)) * 2 * pi - pi)*(odsIPD/2*pow(abs(sin(select(y, 1-2*(y+0.5), 1-2*y)*pi)), odsVerticalModulation))*select(-y,-1,+1) }
    function { odsLocationY }
    function { odsLocationZ + sin(((x+0.5+odsAngle/360)) * 2 * pi - pi)*(odsIPD/2*pow(abs(sin(select(y, 1-2*(y+0.5), 1-2*y)*pi)), odsVerticalModulation))*select(-y,-1,+1) * odsHandedness }
  }
  direction {
    function { sin(((x+0.5+odsAngle/360)) * 2 * pi - pi) * cos(pi / 2 -select(y, 1-2*(y+0.5), 1-2*y) * pi) }
    function { sin(pi / 2 - select(y, 1-2*(y+0.5), 1-2*y) * pi) }
    function { -cos(((x+0.5+odsAngle/360)) * 2 * pi - pi) * cos(pi / 2 -select(y, 1-2*(y+0.5), 1-2*y) * pi) * odsHandedness }
  }
}

Use the following code for an ODS side-by-side:

// ODS Side-by-Side - Docs: https://www.clodo.it/blog/?p=80
#declare odsIPD = 0.065; // Interpupillary distance
#declare odsVerticalModulation = 0.2; // Use 0.0001 if you don't care about Zenith & Nadir zones.
#declare odsLocationX = 0;
#declare odsLocationY = 0;
#declare odsLocationZ = 0;
#declare odsHandedness = -1; // "-1" for left-handed or "1" for right-handed
#declare odsAngle = 0; // Rotation, clockwise, in degree. 

camera {
  user_defined
  location {
    function {  odsLocationX + cos(((select(x,2*(x+0.5),2*x)+odsAngle/360)) * 2 * pi - pi)*(odsIPD/2*pow(abs(sin((1-(y+0.5))*pi)), odsVerticalModulation))*select(x,-1,1) }
    function {  odsLocationY }
    function {  odsLocationZ + sin(((select(x,2*(x+0.5),2*x)+odsAngle/360)) * 2 * pi - pi)*(odsIPD/2*pow(abs(sin((1-(y+0.5))*pi)), odsVerticalModulation))*select(x,-1,1) * odsHandedness }
  }
  direction {
    function {  sin(((select(x,2*(x+0.5),2*x)+odsAngle/360)) * 2 * pi - pi) * cos(pi / 2 -(1-(y+0.5)) * pi) }
    function {  sin(pi / 2 - (1-(y+0.5)) * pi) }
    function {  -cos(((select(x,2*(x+0.5),2*x)+odsAngle/360)) * 2 * pi - pi) * cos(pi / 2 -(1-(y+0.5)) * pi) * odsHandedness }
  }
}     

Use the following code for single eye rendering:

// ODS Single Eye - Docs: https://www.clodo.it/blog/?p=80
#declare odsIPD = 0.065; // Interpupillary distance     
#declare odsVerticalModulation = 0.2; // Use 0.0001 if you don't care about Zenith & Nadir zones.
#declare odsLocationX = 0;
#declare odsLocationY = 0;
#declare odsLocationZ = 0;
#declare odsHandedness = -1; // "-1" for left-handed or "1" for right-handed
#declare odsAngle = 0; // Rotation, clockwise, in degree.              
#declare odsEye = -1; // -1 for Left eye, +1 for Right eye

camera {
  user_defined
  location {
    function {  odsLocationX + cos(((x+0.5+odsAngle/360)) * 2 * pi - pi)*(odsIPD/2*pow(abs(sin((1-(y+0.5))*pi)), odsVerticalModulation))*odsEye }
    function {  odsLocationY }
    function {  odsLocationZ + sin(((x+0.5+odsAngle/360)) * 2 * pi - pi)*(odsIPD/2*pow(abs(sin((1-(y+0.5))*pi)), odsVerticalModulation))*odsEye * odsHandedness }
  }
  direction {
    function {  sin(((x+0.5+odsAngle/360)) * 2 * pi - pi) * cos(pi / 2 -(1-(y+0.5)) * pi) }
    function {  sin(pi / 2 - (1-(y+0.5)) * pi) }
    function {  -cos(((x+0.5+odsAngle/360)) * 2 * pi - pi) * cos(pi / 2 -(1-(y+0.5)) * pi) * odsHandedness }
  }
}                               

Caveats

  • Camera Direction is actually not supported. It’s always look_at<0,0,1>. You can use the odsAngle parameter for a rotation (degree) around Y axis.
  • Zenith & Nadir Zones
    Base ODS algorithm have spiral/singularities towards the zenith and nadir points.To avoid that, i modulate the stereoscopic eye separation such that it begins at normal eye separation near the horizon, and is smoothly decreased, reaching zero by the time either the zenith or nadir points on the polar axis are visible to the user, producing a monoscopic image.

    I use this formula:

    where 0.02 it’s the odsVerticalModulation and 0.065 the default IPD. Play with this value to understand how IPD are reduced near the Zenith (x:-0.5) and Nadir (x:0.5).

    In general, it’s recommended to avoid objects at zenith & nadir points, and use a odsVerticalModulation near 0 (0.0001), to obtain a perfect IPD / 3d effect.
    If you have objects at zenith & nadir points, use a odsVerticalModulation near 1 can be a good compromise.

    Other approach:
    Domemaster3D (Shader for 3DS Max, Mata, Softimage etc) recommend a texture to reduce the effect. link

    SolidAngle/Arnold use mixed approach. link

    Another kind of modulation: link

Best practice

  • Objects should remain at least 60cm from the camera (relative to an IPD of 6.5cm).
    Use this POV-Ray code to check (it’s auto adapt based on IPD):

    sphere
    {
      <odsLocationX,odsLocationY,odsLocationZ>, 0.6*odsIPD/0.065
      pigment
      {
        color <1,0,0>
        filter 0.97
      }
      hollow
    }
    
  • Objects appearing directly above or below the camera should remain at least 3.5m from the camera (relative to an IPD of 6.5cm).
  • Antialiasing is very very very important on VR headset.

Recommended Resolutions

I recommend, at least for the current (year 2016) generation of VR headset (GearVR, Oculus Rift, HTC Vive), at least 6480 x 6480 pixels in top/bottom for static images. For videos, see below.

Resolution must have 2:1 aspect ratio (standard equirectangular), that become 4:1 for side-by-side or 1:1 for a top-bottom.

TL;DR;
It’s difficult to estimate a good resolution.
VR headset do a distortion for lenses, any every VR headset can have different lenses, different FOV, different panel resolution etc.

The GearVR for example has a 90° FOV on a 2560×1440 panel, but the center pixel covers 0.06° after distortion. This value is sometime called “pixel coverage” or “pixel density” or “pixel per display pixel” or “eye buffer scaling”. So, for the GearVR, 0.06° pixels means we need 360/0.06 = 6000 pixels to cover one monoscopic turn.

Rendering Animation/Video

This is actually problematic.

In theory, the resolution must be at least as explained above for images.

Any VR headset require a high frame-rate to avoid nausea.

  • Oculus Rift DK2 (Development Kit 2): 75 FPS
  • Oculus Rift CV1 (Customers Version 1): 90 FPS
  • HTC Vive: 90 FPS
  • Sony Playstation PSVR : 120 FPS

In general, future-generation VR headset: expected 120 FPS

But H264 don’t have any level profile compatible with this kind of resolution.
Also HEVC/H265 have the same problem.

But we also need a coded that is hardware-accelerated to obtain the high FPS requested, and generally only H264/H265 are optimized for this.

VR Players

Virtual Desktop – There isn’t any option about side-by-side vs top-bottom, it simply detect it from the aspect ratio: 4:1 for side-by-side, 1:1 for top/bottom.

MaxVR

Both player can’t reproduce H265 high resolution videos.

My POV-Ray fork on GIT-Hub

With a POV-Ray builded from my fork, you can simply use a spherical camera:

camera
{             
  spherical   
  //ipd 0.065
  ods 4 
  //ods_angle 0
  //ods_modulation 0.2
  //ods_handedness 1
  location <0,0,0>  
}             
  • ods: 0 for monoscopic image, 1 for left eye only, 2 for right eye only, 3 for side-by-side, 4 for top/bottom. 0 is default. 4 recommended.
  • Other parameters ipd, ods_angle, ods_modulation and ods_handedness are the same of the user_defined approach param described above.

Interesting Links

Kudos

Many, many thanks to:

Christoph Lipka, William F Pokorny, Jaime Vives Piqueres from POV-Ray newsgroup.
Joan from Oculus Forum.
Jakob Flierl (checkout is GIT-Hub repo about ODS).

Examples of rendering

Some example of rendering (6480 x 6480 pixels, Top-Bottom).

Mirrors – I made this

——————
Stacker Day – POV-Ray sample scene adapted for ODS

——————
Fractals 1 – POV-Ray sample scene adapted for ODS

——————
Fractals 2 – POV-Ray sample scene adapted for ODS

——————
Wineglass – POV-Ray sample scene adapted for ODS

——————
Axis – Test reference

I also rendered a sample video that can be used for stress-testing of VR video players.

QUICKRES.INI

Reference resolutions for POV-Ray quickres.ini

[ODS TB Quick Test - 512 x 512]
Width=512
Height=512
Antialias=Off

[ODS TB Test - 1024 x 1024]
Width=1024
Height=1024
Antialias=Off

[ODS TB Minimum - 3600 x 3600]
Width=3600
Height=3600
Antialias=On
Antialias_Threshold=0.3

[ODS TB High - 6480 x 6480]
Width=6480
Height=6480
Antialias=On
Antialias_Threshold=0.3

[ODS TB Ultra - 12288 x 12288]
Width=12288
Height=12288
Antialias=On
Antialias_Threshold=0.3

[ODS TB 1440p - 2560 x 1440]
Width=2560
Height=1440
Antialias=On
Antialias_Threshold=0.3

[ODS TB UHD-1 2160p - 3840 x 2160]
Width=3840
Height=2160
Antialias=On
Antialias_Threshold=0.3

[ODS TB DCI 4K - 4096 x 2160]
Width=4096
Height=2160
Antialias=On
Antialias_Threshold=0.3

[ODS TB 8K UHD - 7680 x 4320]
Width=7680
Height=4320
Antialias=On
Antialias_Threshold=0.3

[ODS LR Minimum - 7200 x 1800]
Width=7200
Height=1800
Antialias=On
Antialias_Threshold=0.3

[ODS LR High - 12960 x 3240]
Width=12960
Height=3240
Antialias=On
Antialias_Threshold=0.3

[ODS LR Ultra - 24576 x 6144]
Width=24576
Height=6144
Antialias=On
Antialias_Threshold=0.3
[ODS LR Low - 7200 x 1800]
Width=7200
Height=1800
Antialias=On
Antialias_Threshold=0.3

[ODS LR Normal - 12960 x 3240]
Width=12960
Height=3240
Antialias=On
Antialias_Threshold=0.3

[ODS LR High - 24576 x 6144]
Width=24576
Height=6144
Antialias=On
Antialias_Threshold=0.3

[ODS TB Low - 3600 x 3600]
Width=3600
Height=3600
Antialias=On
Antialias_Threshold=0.3

[ODS TB Normal - 6480 x 6480]
Width=6480
Height=6480
Antialias=On
Antialias_Threshold=0.3

[ODS TB High - 12288 x 12288]
Width=12288
Height=12288
Antialias=On
Antialias_Threshold=0.3

[ODS TB YouTube - 3840 x 2160]
Width=3840
Height=2160
Antialias=On
Antialias_Threshold=0.3

RGB Bulb Review

I’m testing different RGB bulb in my home automation environment, to research the best bulb in the market.
I will update this post with my other research and with people comments.

Short review, current winner: Aeon Labs Bulb.


Philips Hue

Website: http://www.meethue.com
Protocol : ZigBee

Pros:

-A lot of app for it

Cons:

– Only HSB colors, difficult to set a precise RGB color.
– Only 3 values for colors: Hue, Saturation and Brightness.
– Poor colors quality. Read the BravoRomeo review here.
I can’t understand the difference between yellow and green with my Philips Hue.
– Slower, slower reaction when changing colors. For example if i set a sequence of 9 colors (without fade), it took around 3 seconds to do all.

———————-

Aeon Labs Bulb Gen5

Website: http://aeotec.com/z-wave-led-lightbulb
Protocol: ZWave
ZWave SwitchColor CC version: 1

Pros:

– A lot of led
– 5 values for colors: RGB + Warm White + Cold White
– True, exact RGB colors
– Faster reaction to colors. For example if i set a sequence of 9 colors (without fade), it took around a fraction of second to do all.

Cons:

– It seems that don’t support fade between two arbitrary RGB color. It’s limited to simply preset of effects like rainbow.

———————-

Zipato RGBW bulb – rgbwe27zw.eu

Website: http://www.zipato.com/default.aspx?id=24&pid=81&page=1&grupe=
Protocol: ZWave
ZWave SwitchColor CC version: 1

Pros:

– 5 values for colors: RGB + Warm White + Cold White
– True, exact RGB colors
– Faster reaction to colors. For example if i set a sequence of 9 colors (without fade), it took around a fraction of second to do all.

Cons:

– Don’t support any kind of fade or effects. Confirmed by their support.

Hotmail and Gmail use blacklists of entire subnets for a single involved IP? Unbelievable

A mail to me from Leaseweb:

Dear sir, madam,

It appears you are hosting a TOR node on your LeaseWeb IP address [omissis].
This has resulted in the block of a (part) LeaseWeb IP subnet. (/24)
As the subnet is added on the SECTOOR blacklist (http://www.sectoor.de/tor.php) this is affecting customers in the same range as yourself.

The SECTOOR blacklist is e.g. implemented by Hotmail, Live and Gmail. This results in other customers not being able to longer use the mail services of these companies.

[omissis details]

Therefore, we kindly, yet urgently ask you to disable the connection to the mentioned ports within 24 hours. Failure to comply and respond (confirm) to this warning, will result in a block of your involved IP address(es).

Thank you for your co-operation and understanding.

Kind regards,

[omissis]
Team Manager Abuse Prevention
LeaseWeb Global Services B.V.

PGP Public Key


-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v2

mQENBE7vTfMBCADrsRfg06my/tJeGYFoNQwa8CZvy8GRvzQwFozlIntlDQtxIYEH
nW/imqpHyPKzs+28CS3eAEvPZvMj7yrQNubPwwjcS2IQq5NYOJXqXcyQiR6Nu6Le
10rnkvg5YPKaqsQn1KSTuFJA5/wUZtVrYF9O1fluE7xWQVGdfA7j14nAI56BmrqK
nWiBVQWY4nwcwGqv30cse1FOII0CQ6+1dzFbB53fgzUDGmORsFLuHX9kq2bQlday
FL5iP/Ge3OOt/Gz9Uh97mEmveKpnhw4Ic5Y61GY4CFHXAAdHz8AEYEGNwQ6qdi8F
peO/gOQRWzgJnI2EbzDGE8tf/y16S4BrhCSfABEBAAG0FkNsb2RvIDxjbG9kb0Bj
bG9kby5pdD6JATUEEwECAB8CGyMGCwkIBwMCBBUCCAMDFgIBAh4BAheABQJYaXBh
AAoJEC/ixHrG0m4LxAIIAL2XDiNHTfgrgB7t8JsnvCrubXI8AyUseSJ/htvv5qdP
Mmw2FuaXFqzM9TIfzfuG3OLtwmPxkP66CD7/NWZ0FTb8+9jnCEKhD+C5DtJdDYkB
IUIaQc0LiZs+zWX6I9hM1ciuJ1I3QHiFQLFxi6JVrglJyrVX+sxbfm3sjFJ1qYT+
cASwKNAJJ4c5+P2X64+Uj5g6PRTD7eHnwbUc+6TXyyjrxs3ZOcMKMW+NWCd+XOQm
UXZIco0+CL7bpX2jicM8de5FCh0QLLpEBdsdS2zJT+U5CdL4oaF+mACjrpEtE4Z0
R7zbO/8cCWOfxntHRrt8W3G+a5FkI6iwMU/ALnJk3wq5AQ0ETu9N8wEIAL3XzaWK
5oK+bdzAFZcQ10xmonsrbHp/JZOXh8bvEktMxSqI37GcrfqG3BpIDwAJpNzuZsKe
QBulItka1F41P7usYLI3midMKIkeIA0vBg08HoAFC+2YiUxFTFXdPp+sijfNcAAK
OK1l1vU0vvpBwcULLB+e6EFnIoE1AQDKgimIlmEDFFny6AvjYEHy8UayNT9NBnDI
PUBHWFGCkLN4aStUmkZcHTxZP9AJlpFAd02GPzMy8ptVDLtsiylGKmfEeT373ULM
d9JJoo2BlwFCqYrIhGHNL8VyW8CeB+9Szl9fYtr/pT6G5lgaiS7ooCnm7TPY5Yxt
JNO8Pyh44jJB9lUAEQEAAYkBHwQYAQIACQIbDAUCWGlwZgAKCRAv4sR6xtJuC8xq
CADjH8fSnj23O+tBaXKwipygARa878Gqc1gUVvoQA3DUDtqUP04qoAmMaHF71cWk
C8292ylo/zsxrVnb21qpmoZHP8sJkomR+yNYzQysh9idxo3fZ44gKzHv4pZi+a0B
ncXx9cGeZHxyhPWDnN/GEEneOg9fWFxG3d3a3I77C+MpejpqNIofxarcvDOmp+ry
CCd7zKCgfwWtgek7MQ7jKHa6ZuwQ5WXZq8Sv4x982+I1eJnYCSQ9aXJhJRM4ETXn
Lfh5+2HCJQhcwCqK0YnxTYB/tt1Ssb0YaaViiNYgl8u53e9BF8L5hlAnMLyym8as
M9xTV/6EIWpqZL04zHjNfDwt
=n1qy
-----END PGP PUBLIC KEY BLOCK-----