Biri DOOM’u bir PDF dosyasının içinde çalıştırdı. Bu bir şey anlatıyor

Doomguy zırhı giymiş bir kedi yavrusu, yanında PDF içinde DOOM çalıştıran bir dizüstü bilgisayar

Bilişim dünyasında eski bir şaka dolaşır: DOOM er ya da geç her şeyin üzerinde çalışacak. Oyuna iltifat olsun diye değil, meydan okuma olarak. 1993 yapımı nişancı oyunu şimdiye dek ATM’lerde, yazıcılarda, gebelik testlerinde, hesap makinelerinde, tek bir LEGO parçasında ve bir MacBook’un Touch Bar’ında çalıştırıldı.

Ocak 2025’te bir lise öğrencisi listeye bir madde daha ekledi. DOOM’u bir PDF dosyasının içinde çalıştırdı.

Bir PDF dosyasının içinde çalışan, ASCII karakterlerle çizilen DOOM

Kısaca

Bir lise öğrencisi DOOM’u 2020 tarihli bir Emscripten sürümüyle asm.js’e derledi ve ekranın her satırı için bir form alanı kullanarak PDF içinde çalıştırdı: 320×200, altı gri tonu, kare başına yaklaşık 80 milisaniye. İşin içinde hiçbir güvenlik açığı yok. Kullanılan her özellik PDF belirtiminin belgelenmiş bir parçası ve tam da tasarlandığı gibi çalışıyor. İlginç olan tam da bu — ve belgelere bir kez on dakika ayırmanın nedeni de bu.

Muhteşem bir iş ve çok iyi bir şaka. Aynı zamanda bu sitenin sürekli savunduğu ve insanların haklı olarak inanmakta zorlandığı bir şeyin en açık kanıtı: PDF bir sayfanın fotoğrafı değildir. Kod çalıştırabilen bir kaptır.

Gerçekte nasıl çalışıyor

Projenin adı doompdf; ading2210 takma adını kullanan bir geliştiriciye ait. Mekanizma gösterinin kendisinden daha ilginç ve dört parçadan oluşuyor.

PDF, JavaScript’i destekler. Eklenti ya da uzantı olarak değil — biçimin bir parçası olarak, kendi standart kütüphanesiyle; tarayıcılar da bunu yerleşik PDF motorlarında uygular. Formların girilen veriyi denetleyebilmesi, etkileşimli belgelerin tıklamalara yanıt verebilmesi için vardır. Kimse bunu oyunlar düşünülerek eklemedi.

DOOM’un kaynak kodu açık — ama hikâye kısayolun düşündürdüğünden daha ayrıntılı. id Software kodu 23 Aralık 1997’de yayımladı, ancak yalnızca eğitim amaçlı kullanıma izin veren bir lisansla; üstelik yayımlanan, DOS sürümü değil Linux uyarlamasının koduydu — DMX ses kütüphanesinin ayrı lisansı yüzünden. GPL’ye geçiş neredeyse iki yıl sonra, 3 Ekim 1999’da geldi. Asıl önemli olan bu ikinci tarih: DOOM’u okunabilen bir şeyden, hukuken yeniden inşa edilebilen bir şeye dönüştürdü. Oyunun beklenmedik yerlerde ortaya çıkmayı sürdürmesinin nedeni budur.

İki dünyayı bilinçli olarak eskitilmiş bir derleyici birleştirdi. ading2210, Emscripten 1.39.20’yi — 2020 tarihli bir sürümü — kullandı; çünkü bu sürüm WebAssembly değil asm.js üretiyor. Güncel Emscripten WebAssembly çıkarıyor, PDF’in ise WebAssembly çalışma ortamı yok. asm.js, sıradan JavaScript’in kısıtlı bir lehçesi; dolayısıyla JavaScript’in çalıştığı her yerde çalışır. Eski araç zincirine dönmek nostalji değildi, tek giriş kapısıydı.

Geriye ekran kalıyor — insanları kahkahaya boğan kısım. PDF’in tuvali yok, kare arabelleği yok, piksel boyayacağı hiçbir şey yok. Ama form alanları var. Bu yüzden oyunun 320×200’lük çıktısı ASCII karakterlerle çiziliyor: ekranın her satırı için bir metin alanı, altı gri tonunda. Ekran, bu metnin yeniden yazılabildiği hızda tazeleniyor; bu da kare başına kabaca 80 milisaniye ediyor. Girdi de aynı yoldan geliyor: PDF motorunun zaten işlemeyi bildiği alanlar ve düğmeler üzerinden. Kelimenin tam anlamıyla doldurulabilir bir formun içinde DOOM oynuyorsunuz.

Yavaş çalışıyor. Tek renkli. Tamamen oynanabilir, dayandığı kod gibi GPL v2 ile dağıtılıyor ve Chromium tabanlı bir tarayıcıda kendiniz deneyebiliyorsunuz. Derleme, kendi WAD dosyanızı yerleştirmenize bile izin veriyor.

Sonra içinde Linux çalıştırdı

Birkaç hafta sonra aynı geliştirici linuxpdf‘i yayımladı: bir PDF dosyasının içinde açılan eksiksiz bir Linux çekirdeği — RISC-V öykünücüsü TinyEMU aynı asm.js hilesiyle derlenmişti. Çekirdeğin açılması 30 ila 60 saniye sürüyor; yazar bunu gerçek donanımdan yüz kattan fazla yavaş diye tarif ediyor. Sistem, PDF düğmelerinden kurulmuş sanal bir klavyeyle yönetiliyor.

Belgenin içindeki DOOM bir şaka. Belgenin içinde işletim sistemi açan öykünülmüş bir işlemci ise bir argüman. İkisi arasında bir yerde, mesele DOOM olmaktan çıkıyor.

Komik olmayan kısım

Üzerinde durmaya değer düşünce şu: doompdf’te hiçbir şey istismar değil. Hiçbir açık bulunmadı, hiçbir şey kırılmadı, hiçbir güvenlik boşluğu kullanılmadı. Kullandığı her ayrıntı, PDF belirtiminin belgelenmiş ve kasıtlı bir özelliği; tam da tasarlandığı gibi çalışıyor.

Bilgisayar başında bir kedi — DOOM akla gelebilecek neredeyse her cihaza taşındı

Yani bir PDF’in 1993 yapımı bir nişancı oyununu çalıştırmasını sağlayan yetenek, yarın açacağınız faturada da var. Pusuda beklemiyor, gizlenmiyor — sadece orada duruyor, kullanılmadan, çünkü belgelerin çoğunun onu kullanmak için nedeni yok.

Hikâyenin dürüst hâli bu ve iki tarafı da keser. “Belge kod çalıştırabilir, dikkatli ol” diyen aynı akıl yürütme, o kodun dünyasının ne kadar dar olduğunu da kabul etmek zorunda.

PDF içindeki bir betik neyi yapabilir, neyi yapamaz

Doompdf hakkındaki yazıların çoğu tam burada bulanıklaşıyor; o yüzden somut konuşalım. Yanıt tamamen dosyayı neyle açtığınıza bağlı — ve iki yaygın durum birbirinden çok farklı.

YetenekTarayıcı görüntüleyicisi (Chrome, Edge, Firefox)Adobe Acrobat Reader
Açılışta betik çalıştırmaEvetEvet, kapatılmadıysa
Form alanlarını okuma ve yazmaEvetEvet
Çerezleri veya tarayıcı deposunu okumaHayırGeçerli değil
Çevresindeki HTML sayfasına (DOM) erişmeHayırGeçerli değil
Ağ isteği yapmaÇok sınırlıDaha geniş — izleme pikselleri ve NTLM sızıntıları burada yaşadı
Yerel dosyalara dokunmaHayırKısıtlı, ama API yüzeyi çok daha büyük
Dış program veya ek başlatmaHayırOnay isteyerek — tarihsel olarak kötücül belgelerin yolu

Bu tabloyu doğru yönden okuyun. Tarayıcıda betikli bir PDF küçük ve sıkıcı bir kutuda çalışır: çerez yok, depolama yok, çevresindeki sayfaya erişim yok. Doompdf’in bir olay değil bir merak konusu olmasının nedeni tam olarak budur; “DOOM bir PDF’te çalışıyor” cümlesinin PDF’lerden korkmak için gerekçe olmamasının nedeni de.

İlginç olan sütun masaüstü okuyucusu. Belirtimde tarif edilen JavaScript API’sinin tamamına sahiptir, çünkü gerçek kurumsal belgeleri işlemesi beklenir. Bir belgeye açıldığı anda haber vermesinin, okuyucuya göre farklı davranmasının ya da beraberinde taşıdığı bir şeyi açmayı önermesinin mümkün olduğu ortam burasıdır.

Yani program ne olursa olsun üç şey doğru kalır ve içselleştirilmeye değer olanlar bunlardır.

  • Bir PDF, siz hiçbir şey okumadan önce, açılış anında çalışan talimatlar taşıyabilir.
  • Bir PDF, kendisini açan yazılıma göre farklı davranabilir: sizin gördüğünüz dosya, meslektaşınızın gördüğüyle aynı olmayabilir.
  • Bir PDF gösterdiğinden fazlasını taşır: ekler, gizli katmanlar, düzeltme geçmişi ve göndermeyi hiç düşünmediğiniz üstveriler.

Bunların hiçbiri PDF’leri gündelik anlamda tehlikeli kılmaz. Bu ay onlarcasını açacaksınız ve hepsi sorunsuz olacak. Ama çoğumuzun taşıdığı zihinsel modelin — “sadece bir belge” — ara sıra önem taşıyan bir biçimde yanlış olduğunu gösterir.

Neredeyse kimsenin bilmediği ayar

Standart öğüt “PDF okuyucunuzda JavaScript’i kapatın” biçimindedir ve iyi bir öğüttür. Tek başına ise eksiktir: insanların çoğu artık PDF’leri bir PDF okuyucusunda açmıyor. Tarayıcı sekmesinde açıyorlar ve tarayıcının kendi ayrı anahtarı var.

Firefox, PDF betiklemesi açık gelir. Ayarın adı about:config içinde pdfjs.enableScripting; Firefox 87’ye kadar false, Firefox 88’den itibaren true. Genel javascript.enabled anahtarı buna dokunmaz: PDF görüntüleyici ayrı bir dünyadır, ayrı bir ayarla.

Chrome ve Edge PDF betiklemesi için ayrı bir anahtar hiç sunmaz. PDF’teki betik, dosyanın geldiği sitenin JavaScript izniyle yönetilir; bunu adres çubuğundaki denetimlerden site bazında ya da chrome://settings/content/javascript adresinden toptan kapatabilirsiniz — açıkça daha kaba bir araç.

Adobe Acrobat Reader herkesin kastettiği anahtara sahiptir: Tercihler → JavaScript → Acrobat JavaScript’i etkinleştir. Kaldırılmaya değer olan işaret budur; çünkü Acrobat, geniş API’ye sahip okuyucudur ve sıradan işlerde bilerek betikli PDF kullanan neredeyse yoktur.

Pratikte: Acrobat’ta kapatıp tarayıcıya dokunmamak makul ve ölçülü bir tercihtir. Yalnızca Acrobat’ta kapattığı hâlde her yerde kapattığını sanmak değildir.

Bu bilgiyle ne yapmalı

Pratik karşılık küçük ve o on dakikaya değer.

Masaüstü okuyucunuzda JavaScript’i kapatın. Acrobat Reader’da Tercihler → JavaScript. Bütün bir risk kategorisini ortadan kaldırır ve — itiraf etmek gerekir — bir form alanında DOOM oynama olanağı dışında hiçbir şeye mal olmaz.

Okuyucuyu güncel tutun. Betikleme bir giriş yoludur. Yazı tiplerini ve görüntüleri çözen koddaki hatalar başka bir yoldur ve onları güncellemeler kapatır; tarihsel olarak asıl sık kullanılan yol da budur.

Beklenmedik belgeleri beklenmedik sayın. Hiç alışveriş yapmadığınız bir şirketten gelen fatura, hangi biçimde gelirse gelsin bir an düşünmeyi hak eder. Bu, herhangi bir ayardan daha değerlidir.

Üçünün ortak yanına dikkat edin: hiçbiri PDF kullanmayı bırakmanızı ya da belgelere genel olarak kuşkuyla bakmanızı istemiyor. Bunlar kapıyı kilitlemenin karşılığı — ucuz, sıkıcı ve tam da risk küçük ama sıfır olmadığı için makul.

Bu proje neden gördüğü ilgiyi hak etti

Doompdf’i “internet merakı” klasörüne atıp yola devam etmek kolay olurdu. Bence bundan daha yararlı ve nedeni güvenlik tiyatrosuyla ilgisiz.

İnsanların dosya biçimlerine dair kavrayışı tümüyle o biçimlerin ne için kullanıldığı üzerine kuruludur. Belgeler okumak içindir. Tablolar sayılar içindir. Görseller bakmak içindir. Bu model neredeyse her zaman işe yarar; zaten bu yüzden yerinden oynatılması bu kadar zordur — ve “bir PDF etkin içerik barındırabilir” açıklaması genellikle kibar bir kuşkuyla karşılanır.

Bir belgenin içinde oynanabilir bir oyun, bir makalenin bin kelimede zar zor başardığını on saniyede yapar. Soyut bir iddianın yerine tıklanabilir bir şey koyar.

Ve asıl mesele PDF’lerin çok ötesine geçer. Biçimler onlarca yıl boyunca özellik biriktirir. Her ekleme, gerçek bir sorunu çözen biri için anlamlıydı: form denetimi gerçekten yararlıdır, kendi hesabını kontrol edebilen bir belge de öyle. Sonuçta her gün alışverişini yaptığımız sıradan şeyler, adlarının düşündürdüğünden çok daha fazlasını yapabiliyor. Bir yetenek bir kez belirtime girdiğinde, o belirtimi okuyan herkesin elinin altındadır.

Gündelik dosyalar açısından geriye ne kalıyor

Buradaki hiçbir şey PDF’e karşı bir argüman değil. Her yerde, her makinede, yıllar sonra bile aynı görünecek bir belge göndermek için hâlâ en iyi biçim odur. Bu gerçekten zor bir sorundur ve PDF onu çözmüştür. Doompdf’i mümkün kılan özellikler, doldurulabilir bir vergi formunu mümkün kılan özelliklerle aynıdır.

Bu, neyle uğraştığınızı bilmek lehine bir argüman. Bir belgenin oyun taşımasını sağlayan çok yönlülük, aynı belgeye betikleri, ekleri, gizli katmanları ve göndermeyi hiç düşünmediğiniz üstverileri de taşıtır. Bunları anlamaya değer ve hiçbiri paniklemek için neden değil.

PDF Manipulator’ın tümüyle kendi bilgisayarınızda çalışmasının nedenlerinden biri de budur. Dosyaları birleştirirken, bölerken ya da dönüştürürken taraf sayısı ne kadar azsa o kadar iyi — çevrimiçi hizmetler kötü niyetli olduğu için değil, makinenizden hiç çıkmamış bir belgeyi düşünmek, başkasının sunucusunda dolaşmış bir belgeyi düşünmekten çok daha basit olduğu için.

PDF’lerinizle tamamen çevrimdışı çalışın — PDF Manipulator ücretsizdir →

Kaynaklar

Yorum bırakın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Scroll to Top