Hacker laat Linux draaien in een pdf

Linux kent natuurlijk meer dan genoeg gratis software om pdf's te lezen, maar wat nou als je het eens andersom wil doen? Een creatieve hacker heeft dat proces omgedraaid: Linux kan voortaan in een pdf draaien door de JavaScript-library daarin aan te spreken.

Het project, LinuxPDF, is gemaakt door ading2210, die eerder ook al Doom in een pdf liet draaien. De hacker heeft de code online gezet onder een GNU GPL v3-licentie, zodat iedereen de software zelf kan maken. Ading2210 zegt dat Linux ook in een pdf gedraaid kan worden, al zullen gebruikers in de praktijk tegen nogal wat beperkingen aanlopen. "Je zou denken dat pdf-bestanden alleen bestaan uit statische documenten, maar verrassend genoeg ondersteunt het pdf-bestandsformaat JavaScript in een aparte library", zegt de hacker die het OS liet draaien in de pdf-lezer.

Dat werkt overigens alleen in de browser en dan specifiek alleen Chromium-browsers. In die browsers kan de ingebouwde pdf-lezer een api aanspreken om JavaScript-functionaliteiten te gebruiken. Het gaat om 'zeer beperkte input en output', zegt ading2210, maar genoeg voor een basale versie van Linux. De hacker wist zo een RISC-V-emulator, TinyEMU, te compileren naar asm.js, een JavaScript-functie waarmee software in bijvoorbeeld C als een webapplicatie kan worden gedraaid.

Dat kent volgens de ontwikkelaar genoeg beperkingen: het duurt bijvoorbeeld een halve tot een volledige minuut om de kernel op te starten. Gebruikers die daarmee kunnen leven, kunnen volgens de maker een versie van Alpine Linux draaien in hun pdf-lezer. Dat kan met zowel een 32bit- als 64bit-versie van het filesystem, maar de emulator is bij die laatste nog trager dan de lichtere 32bit-versie.

Linux in pdf

Door Tijs Hofmans

Nieuwscoördinator

05-02-2025 • 19:28

37

Submitter: Muncher

Reacties (37)

37
37
14
2
0
12
Wijzig sortering
Dit is toch helemaal knet-ter geweldig en indrukwekkend dat iemand hier de tijd en moeite voor neemt. En tegelijkertijd zorgwekkend; een OS draaien in een publicatie/document bestandje.

Of het echt zorgwekkend is kan ik met mijn beperkte kennis niet goed beoordelen, maar gevoelsmatig kan dit een deurtje open zetten voor misbruik [..] ?

Alle 101 toepassingen en apparaten waarop doom kan draaien is bizar - een OS in een pdf is dat ook :)
Nou ja elke quasi-moderne browser kan JS uitvoeren, daar hoef je die omweg via een PDF niet voor te maken. Dat je arbitraire code kunt draaien *in* de browser is dus niets exotisch of gevaarlijks - op zich.

Risico gaat optreden als die code vervolgens een manier vindt om bij resources te kunnen waar je willekeurige JS van een of andere website niet bij wil laten - maar je browser is er al op toegespitst om dat nou nét niet toe te laten.

Tenzij die PDF functionaliteit bij dingen kan waar, eerlijk gezegd, die PDF-functionaliteit helemaal niet bij zou hoeven (en dus moeten) kunnen komen, heb je een soort walled garden waarbinnen die code lekker z'n eigen ding kan doen, maar niet meer dan dat dat gewoon in je browser ook al gekund had, dus :)
Echt een security probleem lijkt dit mij niet. Je kan dit alleen maar doen in een speciale browser die niet algemeen gebruikt wordt. Als je dit in vanille Chrome zou kunnen dan is het eerder een probleem, maar daar staan dit soort bibliotheken om exact die reden niet open.
Ik zie op de github pagina niet specifiek iets over obscure chromium browsers, slechts iets over chromium in het algemeen.

Ik kan wel bevestigen dat de drive app op android het wat half opent. Ik zie wel het toetsenbord maar kan er niks mee. Wel meer dan word op android : )
Iemand die dit al geprobeerd heeft?
Vanilla chrome op macOS doet het hier anders prima.
Maar andersom? macOS in Chrome?
Je moet je van begin af aan al afvragen of een "simpele" document dit nodig heeft. Door de jaren heen waar simpele weergave programma's ook scriptjes in bestanden gebruikt kunnen worden zijn er ook veel wegen geopend om virussen te verspreiden. Virussen in PDF documenten zijn al vaker voorgekomen.
Je kan dit alleen maar doen in een speciale browser die niet algemeen gebruikt wordt. Als je dit in vanille Chrome zou kunnen dan is het eerder een probleem, maar daar staan dit soort bibliotheken om exact die reden niet open.
Ik weet niet waar je het over hebt; dit werkt gewoon in vanilla Chromium (getest in Chromium 132 op Linux) en in vanilla Google Chrome (getest in Chrome 133 op Windows).
Je kan een OS ook met pen en papier draaien, al is dat wel monnikenwerk.
En tegelijkertijd zorgwekkend; een OS draaien in een publicatie/document bestandje.
Voor publicatie (en archivering) hoor je sowieso PDF/A te gebruiken, dat is een simpelere variant van PDF waarin dit soort dingen niet kunnen:
PDF/A is an ISO-standardized version of the Portable Document Format (PDF) specialized for use in the archiving and long-term preservation of electronic documents. PDF/A differs from PDF by prohibiting features unsuitable for long-term archiving, such as font linking (as opposed to font embedding) and encryption.
Embedded JS (wat hier gebruikt wordt) is een van de dingen die expliciet niet in PDF/A zit.
Is het mogelijk om in linux dan weer een pdf te openen?
En dan daar weer Linux in te starten?
Daarin natuurlijk Doom draaien :+
Ok but.... does it run Doom??

(Dwz, kun je op de linux in de pdf Doom draaien? Anders, meh :+)
Gewoon die andere PDF laden in “Linux”. Done.
Dat is niet wat ik vraag…
/

[Reactie gewijzigd door TKJ op 5 februari 2025 22:23]

Het "PDF-Doom-Droste Effect" bedoel je?
Zo houden we Droste dan toch nog levend
Dat was al mogelijk door dezelfde auteur.
Zie deze link.
This is Linux running inside a PDF file via a RISC-V emulator, which is based on [TinyEMU](https://bellard.org/tinyemu/).

Try it here: https://linux.doompdf.dev/linux.pdf

Source code: https://github.com/ading2210/linuxpdf

This works in a very similar way to my previous [DoomPDF](https://github.com/ading2210/doompdf) project.

You might expect PDF files to only be comprised of static documents, but surprisingly, the PDF file format supports Javascript with its own separate standard library. Modern browsers (Chromium, Firefox) implement this as part of their PDF engines. However, the APIs that are available in the browser are much more limited. This allows us to do any sort of computation inside the PDF, just with some very limited IO.

C code can be compiled to run within a PDF using an old version of Emscripten that targets [asm.js](https://en.wikipedia.org/wiki/Asm.js) instead of WebAssembly. With this, I can compile a modified version of the TinyEMU RISC-V emulator to asm.js, which can be run within the PDF. For the input and output, I reused the same display code that I used for DoomPDF. It works by using a separate text field for each row of pixels in the screen, whose contents are set to various ASCII characters. For inputs, there is a virtual keyboard implemented with a bunch of buttons, and a text box you can type in to send keystrokes to the VM.
Dat is niet wat ik vraag……
Ik gok dat het heel lastig wordt om hier een grafische schil op te gooien. X11 gaat niet draaien bijvoorbeeld.
Een ASCII variant van Doom zou wel kunnen. Heel traag waarschijnlijk.
Lijkt me niet zo veilig

[Reactie gewijzigd door Xfade op 5 februari 2025 20:26]

Dit is prima veilig, het draait in een sandbox in de browser, net zoals vrijwel alle Javascript emulatoren.
Ik vraag mij af in hoeverre dit wel veilig is. Zou een kwaadwillende dit niet kunnen gebruiken om bepaalde code te laten runnen op PC's die normaal tegen input van buitenaf beschermd is? Elk bedrijf kan een PDF openen namelijk.
Hartstikke veilig, alles wat je in een webbrowser doet is sandboxxed. Daarom is javascript acceptabel, en dit dus ook.
Bedoel jij met sandboxxed dat het onmogelijk is vooralles wat je met een browser doet afgesloten is van alle andere software en hardware op je systeem?
Ik weet niet in welke reclame brochure dat staat, geloof niet alles wat daar staat. Dat zou een browser direct ook onbruibaar maken voor veel mensen.

[Reactie gewijzigd door purge op 6 februari 2025 07:40]

Websites bevatten javascript, wat code is die uitgevoerd wordt door je browser. Dit gebeurt sandboxed, wat de normale technische term is voor "draait in een afgeschermde omgeving zonder toegang tot zaken buiten de sandbox".

Dit werkt. Als het makkelijk was om met javascript uit de sandbox te breken, dan was iedere internetter elke 5 minuten gehackt.

Nee, deze aanpak is niet perfect, en ja, er zijn wel eens problemen mee. Je doet er nog steeds verstandig aan om op te blijven letten welke sites je bezoekt. Maar de simpele feiten zijn dat zo ongeveer elke website die je bezoekt tienduizenden of honderdduizenden regels javascript laat uitvoeren in je browser, en dat dit in een sandbox draait, en dat dit globaal gezien goed gaat.
Volgende stap, Linux in the Game of Life
Nieuw levensdoel: Minecraft spelen vanuit een PDF en dan een computer bouwen in minecraft: https://www.minecraft.net/nl-nl/article/deep-thought
En dan daar weer die LinuxPDF in openen.
Knap dat hij dit voor elkaar heeft, maar jammer dat het betiteld word als "xxx in PDF draaien"
Het draait op een heel specifiek platform, wat in mijn ogen niet echt past bij PDF, het Portable Document Format
Nee, dit is niet in een PDF, dit is in de javascript engine die in de PDF reader zit. Overigens werkt het alleen met de javascript engine in Chrome, en niet die van Adobe Reader. Dus storm in een glas water, maar niet nieuwswaardiger dan de willekeurige knul die een js emulator op een website gooit.
Maar eens opgezocht, PDF heeft al JavaScript sinds Adobe Acrobat 3.01 uit 1996. Technisch gezien is iets zoals dit dus al 30 jaar mogelijk. Maar zal vast niet gepast hebben in enkele tientallen MB RAM.

Op dit item kan niet meer gereageerd worden.