Annotare i PDF sotto Linux

In questi giorni ho avuto per le mani un PDF su cui dovevo fare delle annotazioni. A quanto pare, quando molti strumenti creano un pdf  risulta un file che secondo Acrobat Reader (sia sotto Linux che sotto Windows) ha la proprietà “Commenting: Not Allowed”. Non ho trovato uno strumento nativo per Linux che permettesse di fare annotazioni decentemente, così ho provato Foxit Reader. La versione per Linux a sua volta non permette annotazioni, mentre la versione per Windows sì. Ho scaricato l’eseguibile, l’ho lanciato e funziona benissimo. La cosa è possibile grazie a Wine e al supporto del kernel Linux per gli eseguibili “non Linux”. Wine permette di utilizzare direttamente su Linux gli applicatvi Windows, almeno finché questi non hanno un’interazione troppo stretta con l’hardware o con le funzionalità più specifiche del sistema operativo. Per intenderci, Office funziona regolarmente con Wine da parecchio tempo (e nella mia esperienza almeno Office 97, che usavo prima di OpenOffice, funzionava MOLTO più velocemente che su Windows). Wine non è un ambiente virtualizzato, ma un insieme di tool che riscrivono alcuni componenti del sistema operativo Windows (ad esempio la gestione del registry),  unito ad una suite di DLL riscritte per sostituire quelle native di Windows, anche se in alcuni casi e con le dovute licenze si possono importare le DLL originali. Il risultato è che un programma per Windows, che generalmente interagisce con il sistema attraverso le funzionalità di qualche DLL, si trova ad utilizzare le DLL modificate che gli offrono le stesse (più o meno) funzionalità ma implementate su Linux, e il programma non si accorge della differenza. Il supporto del kernel Linux serve invece per fare sì che quando lancio un applicativo Windows, Linux si accorga automaticamente che “non è roba sua” e lanci l’applicazione di supporto, Wine in questo caso, ma potrebbe essere jexec per un programma .jar. In Ubuntu Lucid, il tutto funziona senza dover configurare niente, se non eventualmente  Wine all’installazione. I formati binari, e le applicazioni che li supportano, si trovano in /var/lib/binfmts

Posted in Uncategorized | Tagged , , , , , | 2 Comments

Che noia questi path…

Ci sarà anche chi si preoccupa del diritto all’oblio, ma secondo me è qualcuno che non ha provato a cercare un’informazione più vecchia di dieci anni… ho perso più tempo a cercare questo link che a scrivere il post…  Giusto quest’anno avevo deciso di escludere dalla “casistica di vulnerabilità” che presento delle mie lezioni il problema del path nel caricamento di librerie dinamiche. Roba ormai vecchia, mi sono detto, adesso i problemi sono i mille modi in cui browser e web server interagiscono, come evitare certi problemi a livello di sistema è ormai patrimonio almeno delle aziende più grosse… il mio vecchio esempio del telnet lo avevo solo tirato fuori all’ultimo giorno di lezione, che è stata più che altro una chiacchierata… poi è venuto fuori il problema delle DLL. Qualcuno ha sottolineato che è un problema vecchio di dieci anni tornato alla luce. Ero stato tentato dal fare un post per ricordare che il problema è vecchio almeno di quindici, poi ho pensato che fosse pura polemica ed ho lasciato perdere…

Ora salta fuori che il problema riguarda anche gli exe… con il che si va ancora più indietro, e non posso non ricordare un vecchio giochetto che si poteva fare ai sistemisti Unix sui sistemi multiutente delle università… almeno questo spero non funzioni più 😉 Ma prima una breve spiegazione del problema generale, per chi non l’ha chiaro, che nel caso degli exe si capisce molto bene.

Quando lancio un programma, ad esempio da terminale, ma anche da un link sul desktop, posso fare essenzialmente due cose:

  • indicare esplicitamente il path dell’eseguibile che voglio lanciare, ad esempio /bin/ls in Unix, o C:\Windows\Notepad.exe in Windows
  • indicare il nome del programma, e lasciare che sia il sistema operativo a cercarlo

Nel secondo caso, dove può cercarlo il sistema operativo? Certo non fa sul momento una ricerca su tutto il disco, sarebbe troppo lungo. Nell’ambiente dell’utente esistono delle variabili (d’ambiente, appunto) che contengono un elenco ordinato di directory in cui cercare. La variabile in questione si chiama generalmente PATH o qualche variazione su questo nome. Siccome questo elenco è piuttosto breve, la ricerca è molto veloce, ma c’è anche un riflesso sulla sicurezza. Se il sistema operativo cercasse a caso sul disco, potrebbe eseguire un file che ha lo stesso nome, ma non è quello che cerchiamo: magari un programma pericoloso. Per questo, la variabile PATH deve contenere solo percorsi che noi consideriamo fidati e che, cosa importante, vengono esaminati nell’ordine. La situazione più comune è che la variabile contenga alcune directory di sistema (ad esempio “C:\Windows\system32;C:Windows;…”) in cui trovare i comandi di sistema, e poi, se lì non si è trovato niente, eventualmente la directory “.”, cioè la directory corrente (quella in cui si sta lavorando quando si prova a lanciare il programma).

I problemi nascono quando questa variabile è impostata male, o può essere modificata in modo imprevisto. E qui torniamo al nostro giochetto. Anni fa, era frequente, se non normale, che la variabile PATH, almeno nei sistemi Unix, iniziasse con la directory “.”, anziché averla alla fine. Quello che doveva fare quindi un utente per ottenere la possibilità di accedere agli account/diritti di altri, e di un amministratore, era di creare in una propria directory un programma “ls” (equivalente del comando  “dir” del DOS) che altro non era se non uno script che copiava la shell /bin/sh (l’equivalente di cmd.exe di Windows) in una directory, settando lo sticky bit: per chi non ha pratica di Unix, vuole dire che chi crea il file “concede” i propri diritti a chi lo esegue, almeno per l’esecuzione di quel file. Dopodiché lo script chiamava il vero comando “/bin/ls”.  A questo punto, tutto quello che serviva era convincere la vittima a guardare la directory contaminata. Ad esempio, si chiedeva al sistemista: “Sai, ho creato in una mia directory un file, ma per qualche motivo non riesco più a cancellarlo. Puoi provare a cancellarlo tu?” Siccome succede che con nomi contenenti caratteri speciali ci siano delle difficoltà, la vittima non si stupiva della richiesta. Accedeva quindi alla directory incriminata, eseguiva il comando “ls” per vedere il nome del file da cancellare, ma a causa dell’errore nella variabile PATH, il comando “ls” veniva cercato prima nella directory corrente, dove trovava lo script; quest’ultimo creava una copia di /bin/sh mettendoci lo sticky bit, e siccome era stato lanciato dall’amministratore, ci si trovava a disposizione una shell che eseguiva qualsiasi comando con i diritti di amministratore. Siccome lo script poi eseguiva il vero comando ls, l’amministratore non si accorgeva di niente…

A parte i ricordi, tutto questo dovrebbe far capire quanto sono delicati questi meccanismi, ma anche da quanto tempo la cosa è nota. Non è tanto sconfortante il fatto che tuttora si trovino di queste vulnerabilità (un po’ lo è), ma vale la pena di ragionare sull’effetto dirompente che possono avere dopo anni delle cattive pratiche, notoriamente tali, che sul momento vengono considerate poco gravi. L’effetto è simile a quello della vulnerabilità di “format string“, per anni introdotta nei programmi nonostante violasse le specifiche del C, fino a quando se ne sono scoperte le conseguenze. Lo so, è facile pontificare sul lavoro degli altri, ma io non ne sto facendo una colpa ai programmatori. So benissimo che lavorano sotto pressione ecc. ecc. Il vero problema è che la sicurezza non è ancora parte delle competenze “normali” di un programmatore, e tanto meno è negli interessi e nelle priorità della maggior parte delle software house. Il programmatore ancora non impara la sicurezza quando impara a programmare, e questo anche perché chi gli insegna a programmare a sua volta non la conosce. È già qualcosa che si comincino a trovare con frequenza corsi e seminari di programmazione sicura, ma la strada è ancora lunga, e non dovrebbero essere corsi specifici, ma parte della formazione normale, esattamente come si insegnano gli algoritmi di ordinamento. Soprattutto, andrebbe insegnata l’impostazione, più che i dettagli. Perché chi impara a programmare imparerà forse un decimo dai corsi, ma il resto lo impara guardando il codice di altri o, se è fortunato, dai colleghi, e questo non facilita certo la formazione di un’impostazione corretta. Più ancora, le aziende continuano a non avere attenzione alla sicurezza nello sviluppo del software. Il caso delle DLL è significativo, perché esistono ed esistevano delle linee guida che chiariscono il comportamento corretto, e perché non si tratta del processo invasivo e oneroso della validazione dell’input o della gestione delle eccezioni, ma di una operazione per la quale l’unico vero onere è riconoscerne la necessità.

È spiacevole che in alcuni casi la stessa Microsoft non abbia seguito le proprie linee guida: è chiaro che c’è un problema di processo, uno di quei problemi che con l’impegno dichiarato da Microsoft verso la sicurezza non si sarebbe più dovuto presentare. Tuttavia, quello che è veramente spiacevole è che come per il caso della format string, nei prossimi mesi, o anni, verrà fuori una pletora di applicazioni, più o meno importanti, che presentano questo tipo di vulnerabilità, la cui verifica entrerà a far parte degli strumenti abituali di assessment e che comporterà in generale una maggiore vulnerabilità diffusa, una vulnerabilità che si sarebbe evitata “semplicemente” seguendo le linee guida di Microsoft… ma quanti sviluppatori sanno di doverle seguire, quindi di doverle cercare, e dove cercarle?

Posted in ict, Sicurezza | Tagged , , , , , | Comments Off on Che noia questi path…

Malware firmato

Quest’estate un post ha particolarmente attirato la mia attenzione. Sottolinea come sia possibile trovare del malware firmato digitalmente in un modo assolutamente legittimo. L’articolo è uscito quando si stava parlando anche dell’inizio dell’effettivo deployment di DNSSEC, che è basato principalmente sulla firma dei record DNS, di PEC e di non ricordo quale altra iniziativa anch’essa riconducibile alla firma elettronica. Vale soprattutto la pena di leggere la presentazione a cui il post si ispira. È da notare che la presentazione identifica alcune strade per firmare il malware che per quanto percorribili, non sembra siano ancora state sfruttate. Un esempio è il furto di chiavi Authenticode, cosa che non risulta ancora ai ricercatori, ma che le cattive pratiche di aziende che utilizzano queste chiavi sembrano rendere possibili.

L’idea che del malware possa avere una firma valida sembra mettere in discussione il senso stesso della firma del software, e forse di altro. È vero solo in parte, ed è bene quindi inquadrare correttamente il problema, per evitare generalizzazioni eccessive.

I problemi sono essenzialmente:

  1. Chi certifica le chiavi opera in un mercato con una concorrenza basata sostanzialmente solo sul costo: non ci sono certificati migliori o peggiori, ci sono solo certificati; a chi li utilizza i certificati interessano poco (vedi punto 2) e una maggiore sicurezza vuole dire procedure più complesse, ovvero una garanzia di perdere clienti, mentre le responsabilità davvero minime che ha in pratica un certificatore non sono una motivazione sufficiente per preoccuparsi della sicurezza;
  2. Chi utilizza delle chiavi di certificazione del codice, come confermato anche dalla presentazione di cui sopra, le considera sostanzialmente una “seccatura” necessaria, una sorta di tassa, e quindi se da una parte è interessato soprattutto a pagarle poco, dall’altra ne cura poco la sicurezza; anche qui, non mi è ben chiaro quali siano le responsabilità in carico al titolare delle chiavi in caso di uso fraudolento delle chiavi da parte di terzi, ma sospetto che siano molto poche;
  3. parlando di responsabilità, alla fine ce ne sono molto poche, e nei confronti dei soggetti sbagliati; è una caratteristica generale dell’uso dei certificati: chi effettivamente se ne deve fidare, cioè l’utente finale, è l’unico che non ha nessun rapporto contrattuale al quale rifarsi in caso di problemi, mentre gli altri soggetti per la maggior parte hanno interesse a che non si faccia mai troppo rumore; ad esempio, se viene emesso un certificato per una società inesistente, utilizzato per diffondere malware, chi ha titolo per chiedere un risarcimento dei danni?
  4. se è discutibile che in alcune configurazioni un oggetto/programma firmato venga installato silenziosamente solo per il fatto di avere una firma valida, anche l’idea di far scegliere all’utente, in base a messaggi che sono criptici anche per molti informatici, è poco realistica;
  5. più sono le aziende che hanno bisogno di chiavi per firmare il proprio codice, meno sarà utile la firma per distinguere quelle che producono programmi puliti da quelle che producono malware.

E in realtà i punti critici sono proprio gli ultimi: cosa garantisce effettivamente una firma Authenticode?  Permette al produttore del codice di inserire informazioni, e all’utente di verificare l’integrità del codice, prendendo, secondo questa pagina, “decisioni più informate”. Tuttavia, la faq dice chiaramente:

Should I trust and download a piece of software just because it’s been signed?

Again, this decision relies on the end user’s own judgment; however, the certificate provides end users with the data they need to make a more informed decision about this piece of software. If the end user has a great deal of trust in a particular software publisher, then the end user may decide to automatically download any software from this publisher through the settings provided in the Authenticode Security Technology dialog box.

Anzi, qui si dice chiaramente:”Likewise, an invalid signature does not prove that the software is dangerous, but just alerts the user to potential problems. ” Tutto giusto, naturalmente, ma dimostra ancora una volta come noi informatici pensiamo e scriviamo come se dovessimo avere a che fare con degli informatici, anche quando sappiamo benissimo che quello che produciamo andrà in mano ad utenti finali. Tutta questa faccenda dello “user’s own judgement” è molto pilatesca.
Diciamocelo chiaramente: l’unico caso in cui la decisione dell’utente è (o dovrebbe essere)  ovvia, è se trova del software di aziende note tipo Micrsosoft o Adobe; negli altri casi, il meccanismo aiuta poco o niente. Il problema è aggravato dal fatto che il “nome” a cui è associato il certificato può non essere così chiaro: la presentazione di cui sopra dice chiaramente che produttori di malware sono riusciti ad ottenere certificati per nomi molto simili a quelli di grosse aziende, abbastanza simili da ingannare certamente la maggior parte degli utenti. La situazione sembra decisamente peggiore di quella dei certificati per i siti web, dove almeno in condizioni normali l’associazione fra un qualsiasi sito e il suo certificato sarebbe verificabile (il nome è decisamente più univoco di quello di una società). In conclusione: la firma del codice è utile quando c’è un canale fidato (da Microsoft, da una distribuzione Linux, e possibilmente con un certificato verificato, non tramite CA) per verificare che il software arrivi in modo integro da quel canale, senza nessuna ulteriore garanzia. Dare un valore particolare al software firmato in quanto tale è sbagliato dal punto di vista teorico e pratico.

Per fortuna oggi tutti, compresa Microsoft, stanno sviluppando soluzioni a tutti i livelli (browser, s.o., macchine virtuali) che basano la sicurezza del codice scaricato da fonti incerte sulla segregazione e non sulla firma. Ma l’idea che quello che è firmato sia più sicuro anche quando non se ne conosce l’origine, resiste…

Posted in ict, Sicurezza, Uncategorized, Varie | Tagged , , , , , , , , | Comments Off on Malware firmato