U ovom radu predstavljena je sigurnosna analiza PDF formata. Opisan je PDF format te objašnjeni osnovni dijelovi njegove dokumentacije. Objašnjena je struktura PDF dokumenta i vrste podataka koje se mogu koristiti. Na kraju, predstavljen je eksperiment koji opisuje alate za sigurnu analizu PDF dokumenta u svrhu pronalaženja malicioznog koda.
Trenutno je prisutan velik broj kibernetičkih prijetnji, a većina njih temelji se na malicioznom kodu. Maliciozni kod, ili malware, sav je kod koji je napravljen s namjerom da bi oštetio korisnikovo računalo. Jedan od vrlo čestih načina za prijenos malicioznog koda je korištenje PDF dokumenta, koji zbog svojih specifičnosti predstavlja izrazito efikasan i neočekivan vektor zaraze. U ovom radu predstavit će se osnovna specifikacija PDF formata i prikazati eksperiment sigurne analize PDF dokumenta u svrhu pronalaska malicioznog koda.
PDF (Portable Document Format) datotečni je format koji se koristi za prikaz dokumenata koji sadrže tekstualne, multimedijske i razne druge elemente. Najčešća je funkcija PDF formata prikaz teksta, ali njegova uporaba toliko je raznovrsna da može odrađivati i malo egzotičnije stvari - poput zaštite lozinkom ili izvršavanja JavaScript programa. Osnovna struktura PDF formata sastoji se od tri 4 dijela:
Zaglavlje čini prvi oktet PDF dokumenta i precizira korištenu verziju formata. Na sljedećoj slici nalazi se primjer zaglavlja PDF dokumenta* verzije 1.3 prikazanog u uređivaču HxD. *Primjer korišten u ovom seminaru preuzet je ovdje.
Znak na početku zaglavlja, %, predstavlja komentar u PDF dokumentu - u ovom primjeru može se vidjeti da su prve dvije linije PDF dokumenta komentari.
U tijelu PDF dokumenta nalaze se tekstualni i multimedijski objekti - točnije - objekti prikazani korisniku.
Kako pristupiti elementima PDF dokumenta? Odgovor na to može se naći u tablici kružnih referenci koja sadrži reference na sve objekte u dokumentu. Tablica kružnih sastoji se od zapisa veličine 20 okteta koji predstavljaju svaki objekt u dokumentu, što omogućuje nasumični pristup željenom objektu bez slijednog pretraživanja cijelog PDF dokumenta. Ova tablica nalazi se iza tijela dokumenta i njen se početak može prepoznati po ključnoj riječi “xref”. Na prikazanoj slici možemo vidjeti sadržaj tablice križnih referenci. Kako bismo ju demistificirali, potrebno je razjasniti njene dijelove - ID objekta, broj elemenata u objektu, odmak elementa i broj generacije elementa koji služi kao oznaka revizije unutar dokumenta, što je posebnost PDF formata, umjesto izvan dokumenta. Na primjer, ako je dokument tek izrađen, element će biti generacije 0. Zadnji znak u zapisu određuje je li element oslobođen (“f”) ili se koristi (“n”). Ako je element oslobođen, nije prikazan i ne koristi se u dokumentu, ali bi i dalje mogao biti prisutan, za razliku od korištenog elementa koji je prikazan u dokumentu. U slučaju prikazanom na slici, ID objekta je 0 i sadrži 11 elemenata. Sljedećih 10 bajtova predstavlja odmak - 0 - i njegov generacijski broj je 65535 (maksimalni). Generacijski broj elementa inkrementira se svaki put kad je element oslobođen, a u slučaju da se element ponovno koristi, tada se postojeći generacijski broj ne mijenja. Na kraju zapisa nalazi se zastavica f, što znači da je ovaj objekt oslobođen. Svaki oslobođeni element kao odmak ima referencu na sljedeći slobodni element, dok korišteni element na tom mjestu ima zapisan odmak od početka dokumenta do početka elementa.
Trailer specificira način na koji čitač dokumenta treba naći tablicu križnih referenci i ostale objekte u dokumentu. Svaki PDF dokument čita se od kraja označenog s “%%EOF”, a njemu izravno prethodi niz znakova koja određuje odmak xref tablice od početka dokumenta, što je u našem slučaju 2714 okteta. Sadržaj trailera nalazi se unutar znakova “«” i “»” te predstavlja rječnik s s parovima (ključ, vrijednost). U traileru prikazanom na slici nalaze se ključevi Size, Root i Info. Veličina (Size) specificira broj zapisa u tablici križnih referenci, korijen (Root) označava referentni objekt za katalog dokumenta, dok informacije (Info) sadrži referentni objekt za mapu informacija. Ako se PDF dokument nadopunjava kroz vrijeme, tada se dodatni elementi nadodaju nakon trailera - zbog ovog se dodatne izmjene u dokumentu mogu spremiti brzo i bez prepisivanja cijelog dokumenta.
PDF dokument sadrži 8 vrsti objekata: bool, broj, niz znakova, ime, niz, rječnik, tok i null objekt. Objekti specifični za PDF - poput imena i toka - bit će objašnjeni u ovom radu. Ime je niz ASCII znakova iz intervala 0x21 do 0x7E maksimalne veličine od 127 okteta. Svakom imenu mora se dodati prefiks “/ /”. Tok je predstavljen nizom okteta neograničene veličine, zbog čega se slike i veliki blokovi podataka obično prikazuju kroz tokove.
Svaki objekt u PDF-u može se označiti kao indirektni objekt, predstavljen s ključnim riječima “obj” i “endobj”. Svojstvo indirektnosti daje objektu jedinstveni identifikator koji drugi objekti mogu koristiti kao referencu. Kako bismo se referencirali na indirektni objekt, potrebno je nakon adrese dodati znak “R”.
Svaka stranica PDF dokumenta predstavljena je straničnim objektom - rječnikom koji sadrži reference na sadržaj stranice. Svi stranični objekti zajedno formiraju stablo stranica, koje je deklarirano indirektnom referencom u katalogu dokumenta.
Katalog dokumenta je korijen svih objekata u PDF dokumentu - sadrži reference na druge objekte koji definiraju sadržaj dokumenta. Referenca na katalog nalazi se u /Root elementu trailera. Zapisi sadržani u katalogu su sljedeći:
i ostali.
Stablo stranica definira sve stranice PDF dokumenta i sadrži čvorove koji ih predstavljaju. Postoje dva tipa čvorova: središnji - čvorovi stabla stranica - i listovi - objekti stranica. Svaki čvor u stablu se obavezno sastoji od sljedeća tri zapisa: tip (/Type), količina (/Count), roditelj (/Parent) i djeca (/Kids). Stablo stranica nije povezano ni s jednim elementom u PDF dokumentu.
Za čitanje PDF datoteke, potrebno je instalirati neki od PDF čitača, poput Adobe Acrobat, no neke specifične informacije o PDF dokumentu mogu se izvući i bez pokretanja čitačem, pomoću alata PDFiD koji je korišten u primjerima ovog poglavlja. PDFiD skenira PDF datoteku u svrhu pronalaska zadanih nizova znakova te broji njihove pojave, što je korisno kod identifikacije JavaScript programa ili naredbi za izvršavanje akcija. Ovo se može identificirati pretragom za nizove znakova “/JS”, “/JavaScript”, “/AA” i “/OpenAction”. Pokazalo se da velika količina malicioznih PDF datoteka sadrži JavaScript programe koji se automatski pokreću naredbama za izvršavanje akcija bez potrebe za interakcijom korisnika. Naravno, nije svaki PDF dokument koji ih sadrži maliciozan, no prisutnost JavaScript programa i automatizirane akcije čini dokument, u najmanju ruku, sumnjvim. Ostale stvari na koje treba obratiti pozornost je prisutnost JBIG2 kompresije, ugrađeni Flash, bilo kakve akcije pokretanja i XML. Naravno, njihova prisutnost sama po sebi ne čini PDF dokument malicioznim, ali zahtijeva daljnju istragu. Na prikazanoj slici možemo vidjeti primjer korištenja alata PDFiD. Slika je preuzeta iz [4].
U tijelo PDF dokumenta korisnik može dodati sigurnosne značajke, nevidljive objekte, promijeniti logičku strukturu dokumenta ili zaštititi dokument od nedopuštenog pristupa i uređivanja. Kako bi se identificirali objekti u PDF dokumentu, koristi se alat PDF-PARSER koji ne prikazuje, već parsira elemente. Na slici je prikazan izlaz alata PDF-PARSER za naš dokument. Slika je preuzeta iz [4].
Na prethodnoj slici vidimo da objekt “Obj 12” sadrži referencu na objekt “Obj 13” s JavaScriptom i tokom. Kada se naredbom pdftk provjeri sadržaj toka, može se vidjeti kod skriven u JavaScriptu, koji, kada se prepiše u HTML, jasno prikazuje skriveni payload koji bi bio preuzet na računalo, što je prikazano na slici ispod. Slika je preuzeta iz [4].
Maliciozne PDF datoteke smatraju se jednom od najvećih prijetnji sigurnosti računalnih sustava. Zbog svoje fleksibilne strukture, vrlo je lako generirati netočne i maliciozne PDF datoteke. Takve datoteke mogu zaraziti cijelo računalo malicioznim kodom ako ih otvorimo čitačem ili drugom aplikacijom koja izvršava kod u PDF datoteci.
[1] https://github.com/corkami/docs/blob/master/PDF/PDF.md
[2] https://commandlinefanatic.com/cgi-bin/showarticle.cgi?article=art019
[3] https://resources.infosecinstitute.com/topic/pdf-file-format-basic-structure/
[4] https://github.com/filipi86/MalwareAnalysis-in-PDF | Filipi Pires: Malware Analysis – Dissecting PDF file
[5] https://opensource.adobe.com/dc-acrobat-sdk-docs/standards/pdfstandards/pdf/PDF32000_2008.pdf