LinuxPDF: un documento PDF nasconde Linux

LinuxPDF è un progetto sperimentale che integra un emulatore RISC-V in un documento PDF, consentendo l'esecuzione di Linux all'interno di un file normalmente statico. L'idea nasce per dimostrare la flessibilità del formato PDF ma solleva anche importanti questioni di sicurezza.

L’idea di eseguire un sistema operativo all’interno di un documento PDF potrebbe sembrare folle. E in parte certamente lo è. Uno sviluppatore indipendente, ispirato dal lavoro di un collega che aveva inserito il gioco Tetris in un PDF, aveva fatto funzionare Doom in un normale documento PDF. Adesso “rilancia” utilizzando un emulatore RISC-V per inserire Linux in un PDF. Il progetto LinuxPDF nasce per dimostrare quanto il formato PDF sia versatile ma, allo stesso tempo, potenzialmente delicato dal punto di vista della sicurezza.

Allen, l’autore del progetto LinuxPDF, è uno studente delle scuole superiori che è riuscito a disporre l’esecuzione di codice C all’interno di un documento PDF grazie all’uso di una versione obsoleta di Emscripten, uno strumento di compilazione che converte il codice in asm.js, sottoinsieme di JavaScript precursore di WebAssembly.

Il ruolo di JavaScript nei PDF

Sebbene i PDF siano tradizionalmente considerati documenti statici, il loro formato supporta JavaScript con una libreria standard separata. I browser moderni, come Chromium e derivati (quindi Chrome, Edge, Opera, Vivaldi,…) e Firefox, implementano questa funzionalità nei loro motori PDF, sebbene con API significativamente limitate rispetto a quelle offerte da Adobe Acrobat, il quale fornisce funzionalità avanzate come il rendering 3D, richieste HTTP e persino la rilevazione di tutti i monitor connessi al sistema.

La possibilità di caricare codice C attraverso un PDF ha permesso, allo sviluppatore che ha ideato LinuxPDF, la compilazione di una versione modificata di TinyEMU in asm.js. TinyEMU è un emulatore per le architetture RISC-V e x86, progettato per essere piccolo seppur completo. Sviluppato da Fabrice Bellard, noto anche per il suo lavoro su QEMU, su cui si basa l’apprezzato UTM, TinyEMU supporta diverse funzionalità di base normalmente sfruttate dai sistemi operativi.

Per gestire l’output grafico, il progetto LinuxPDF riutilizza la tecnica adottata in DoomPDF, che sfrutta un campo di testo separato per ogni riga di pixel dello schermo virtuale, fatto comparire direttamente sul documento. I contenuti di questi campi sono aggiornati ricorrendo a caratteri ASCII per rappresentare l’output visivo. L’input, invece, è gestito tramite una tastiera virtuale implementata con pulsanti e una casella di testo che trasmette i caratteri digitati alla macchina virtuale.

Limiti prestazionali di LinuxPDF

Uno dei principali problemi dell’emulatore è la sua lentezza. Il boot del kernel Linux richiede tra 30 e 60 secondi, risultando oltre 100 volte più lento rispetto all’esecuzione su hardware nativo.

Il problema è dovuto al fatto che la versione del motore JavaScript V8, utilizzata nel motore PDF del browser ha il compilatore JIT (just-in-time) disabilitato, riducendo drasticamente le prestazioni.

La configurazione predefinita di LinuxPDF utilizza un sistema Buildroot a 32 bit, prelevato dagli esempi originali di TinyEMU. Tuttavia, è disponibile anche un’opzione per eseguire Alpine Linux a 64 bit, sebbene questa risulti circa due volte più lenta rispetto alla versione a 32 bit.

Come provare LinuxPDF

Per accedere alla demo di LinuxPDF è sufficiente aprire questo documento PDF con il browser e attendere il caricamento di Linux.

A procedura ultimata, si può interagire con il sistema digitando ad esempio whoami per conoscere il nome utente (root), free -m per conoscere la memoria disponibile e quella impegnata, uname -a per mostrare informazioni dettagliate sul sistema operativo e sul kernel, clear per cancellare l’output.

Comandi LinuxPDF

In alternativa è possibile compilare il PDF interattivo in proprio utilizzando la sequenza di comandi riportati qui.

Se si desiderasse costruire la versione a 64 bit invece di quella a 32 bit, è necessario modificare il file build.sh cambiando la riga BITS="32" in BITS="64". Lo script build.sh scarica automaticamente Emscripten 1.39.20.

I dubbi sulla sicurezza quando si parla di PDF e JavaScript

Progetti come LinuxPDF evidenziano i potenziali rischi di sicurezza legati all’apertura dei file PDF, che permangono anche nel 2025. Abbiamo come i file PDF, specie se i software che sono chiamati a gestirli contengono vulnerabilità, possono ancora oggi trasformarsi in vettori di attacco.

Sebbene la maggior parte dei browser limiti l’API JavaScript nei PDF, Adobe Acrobat e altri lettori avanzati offrono funzionalità molto più ampie, tra cui richieste HTTP e accesso ai dispositivi di input. Un file PDF malevolo potrebbe sfruttare queste capacità per eseguire codice non autorizzato o, come accennato in precedenza, far leva su vulnerabilità già note/sconosciute (attacchi zero-day).

L’uso di un emulatore come TinyEMU in un PDF dimostra che è possibile eseguire codice complesso all’interno di un documento, anche se con limitazioni sul versante I/O. Questo potrebbe portare a nuovi vettori di attacco, ad esempio utilizzando PDF per distribuire malware basato su interpreti o emulatori.

A questo punto, si dovrebbero considerare politiche di sicurezza più restrittive, come la disattivazione di JavaScript nei PDF o l’uso di lettori con sandboxing avanzato. Inoltre, l’analisi statica e dinamica dei file PDF dovrebbe diventare una pratica standard per individuare potenziali minacce.

Anche se LinuxPDF è pensato per scopi educativi e sperimentali, il progetto ha aperto il vaso di Pandora. E dimostra che i PDF possono essere utilizzati come vettori per l’esecuzione di codice arbitrario.

Ti consigliamo anche

Link copiato negli appunti